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

Stringstr=newString("aaa");Stringstr2=newString("aaa");System.out.println(str);System... 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
展开
 我来答
puziguo
2011-10-30 · TA获得超过1928个赞
知道小有建树答主
回答量:884
采纳率:86%
帮助的人:807万
展开全部
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
周喆铮
2011-10-30
知道答主
回答量:14
采纳率:0%
帮助的人:14.5万
展开全部
个人理解,上面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的地址。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
abc19901020
2011-10-30 · TA获得超过104个赞
知道答主
回答量:178
采纳率:0%
帮助的人:56万
展开全部
你创建了两个对象str和str2,str和str2存放的不是str,str2的内容 而是字符串的地址,str和str2是两个不同的对象,他们的地址可能相同,也可能不同 所以表达式的值为false

下面你没有创建对象而只是创建了两个变量,所以只是进行变量值得比较 ,发现两个值相同 ,所以返回的是true
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
1989anduo
2011-10-30
知道答主
回答量:26
采纳率:0%
帮助的人:11.6万
展开全部
这个问题很经典
主要是理解一下 堆和栈 还有==和equls的区别
str和str2是两个内存地址不同的对象 用==号比较的是内存地址 所以会false
而st3 str4在内存里的状态地址相同。true
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式