java String字符串池的问题 为什么输出一样,却有true 有false

String str = new String("aaa");
String str2 = new String("aaa");
System.out.println(str);
System.out.println(str2);
System.out.println(str == str2);

System.out.println("----------------");

String str3 = "bbb";
String str4 = "bbb";
System.out.println(str3);
System.out.println(str4);
System.out.println(str3 == str4);

System.out.println("----------------");

输出 aaa aaa false
bbb bbb true

String str = new String("aaa");
首先要明白,这句话创建了2个对象,第一个是括号中的“aaa”对象,其二是new的一个String对象

简单说,执行完毕之后,串池中有一个对象“aaa”,堆中有一个对象“aaa”
str引用指向的是堆中得对象
String str2 = new String("aaa");
执行完毕,堆中又多了一个对象“aaa”,str2引用指向该对象

所以str == str2为false,因为这是2个引用,指向的是2个不用的对象(堆中得对象)

String str3 = "bbb";
String str4 = "bbb"

str3和str4都是指向的串池中得对象;所以为true
温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-10-30
个人理解,上面String str=new String("aaa")所比较的是地址
而后面所比较的是两个字符串的值是否相等
关于String str = "abc "的内部工作。Java内部将此语句转化为以下几个步骤:
(1)先定义一个名为str的对String类的对象引用变量:String str;
(2)在栈中查找有没有存放值为 "abc "的地址,如果没有,则开辟一个存放字面值为 "abc "的地址,接着创建一个新的String类的对象o,并将o的字符串值指向这个地址,而且在栈中这个地址旁边记下这个引用的对象o。如果已经有了值为 "abc "的地址,则查找对象o,并返回o的地址。
(3)将str指向对象o的地址。
第2个回答  2011-10-30
你创建了两个对象str和str2,str和str2存放的不是str,str2的内容 而是字符串的地址,str和str2是两个不同的对象,他们的地址可能相同,也可能不同 所以表达式的值为false

下面你没有创建对象而只是创建了两个变量,所以只是进行变量值得比较 ,发现两个值相同 ,所以返回的是true
第3个回答  2011-10-30
这个问题很经典
主要是理解一下 堆和栈 还有==和equls的区别
str和str2是两个内存地址不同的对象 用==号比较的是内存地址 所以会false
而st3 str4在内存里的状态地址相同。true
相似回答