关于java中的String对象的问题

wbdcg
  • 98

为什么下面的程序打印false?
书上说java在内容相同的String对象 会使用同一个实例
那为什么引用不相等?

public class test {
    public static void main(String[] args) {
        String s1="123";
        String s2=s1;
        String s3=new String("123");
        System.out.println(s3==s2);
        
    }

}
回复
阅读 1.7k
6 个回答
Yujiaao
  • 12.6k

要想指向同一内存区域,请使用intern方法

public class test {
    public static void main(String[] args) {
        String s1="123";
        String s2=s1;
        String s3=new String("123");
        System.out.println(s3==s2);
        System.out.println(s2==s3.intern());
        
    }

}

会输出:

false
true

Java会确保一个字符串常量只有一个拷贝,当使用new Sting()构建时,总会产生新的对象, 不是常量。
常量与变量的区别在于是否在编译期可以确定值。存在于.class文件中的常量池,在运行期被JVM装载,并且可以扩充。String的intern()方法就是扩充常量池的一个方法;当一个String实例str调用intern()方法时,Java查找常量池中是否有相同Unicode的字符串常量,如果有,则返回其的引用,如果没有,则在常量池中增加一个Unicode等于str的字符串并返回它的引用。

可以参考一下这个链接

http://www.runoob.com/java/ja...

遇见了王某某
  • 3
新手上路,请多包涵
码农
  • 1
新手上路,请多包涵

s3是new 的,会产生对象,s3指向的是一个NEW的引用对象地址

jvm中有常量池。所有创建的字符串常量都在里面存储。如果常量池里没有常量才会在新建常量。
new string()是用一块内存区域新建对象。不管常量池中是否有该常量。
两个值虽然一样,但是地址不一样。所以为false;

你可以去百度下String s3=new String("123");创建了几个对象。面试常问

明确一点,只要new关键字,就是新建一个对象,

内容相同的String对象 会使用同一个实例

这句话可以理解为这种情况下同一引用(如下代码),这使用了常量池技术,将字面值量提前准备好,然后当时用字面量赋值时,直接进行使用。

String s1 = "abc";
String s2 = "abc";
System.out.println(s1 == s2);  // true
疏云映淡月
  • 5
新手上路,请多包涵

先说为什么应用不等。
String s1 = "123";// 是开辟内存,创建了新的对象,假设存放在内存中的a区域,变量s是对a内存的引用
String s2 = s1; // s2的引用也指向a内存
String s3 = new String("123");// 重新申请一段内存,假设存放在b区域
s3==s2 是判断两个变量是否指向同一块内存。很显然不是,所以打印false

“书上说java在内容相同的String对象 会使用同一个实例”是在String s1 = "123";String s2 = "123";的情况,s2和s1才指向相同的内存区域。

宣传栏