java的问题 10

str1和str2不是两个对象吗为什么相等... str1和str2不是两个对象吗 为什么相等 展开
 我来答
大大猩
2019-06-02 · 为您排忧解难
大大猩
采纳数:56 获赞数:95

向TA提问 私信TA
展开全部

代码对象的创建流程说明如下:

  1. String str1 = "hello" + " java";可以看成 String str1 ="hello java"; 在字符串常量池查找是否已经存在“hello java”的字符串常量对象,未找到则创建字符串"hello java",str1指向该对象并且将该对象放到字符串常量池。

  2. String str2 = "hello java"; 该创建过程为:去字符串常量池查找是否有“hello java”的字符串对象,因为刚才已经创建了一个在常量池的对象,直接返回该对象,所以str1和str2是指向同一个对象的字符串。

  3. String str3 ="hello";在常量池查找是否包含该“hello”的字符串对象,不存在创建一个新的字符串对象给str3,放入常量池。String str4 = "java" ,在常量池查找是否包含该“java”的字符串对象,不存在创建一个新的字符串对象给str4,放入常量池。这个时候str3和str4不是同一个对象。

  4. String str3 = str3 +str4; 因为String是final不可变的对象类型,这个操作实际上是创建了一个新的StringBuilder然后toString方法创建了一个新的字符串对象。所以str3依旧不等于str2和str1。

追问
请问字符串常量池里的常量是永久保存吗
还有虽然他俩值一样 但不是两个对象吗
microroom
科技发烧友

2019-06-02 · 智能家居/数码/手机/智能家电产品都懂点
知道大有可为答主
回答量:7118
采纳率:83%
帮助的人:1608万
展开全部
为str1赋值时,因为"Hello java"是一个编译时的字符串常量,编译器会对它进行优化,将它放置到内置池中,然后让str1引用这个内置池中的字符串。当为str2赋值时,因为在内置池中已经存在一个 "Hello java",为了节省空间,没必要再在堆中创建一个 "Hello java",str2引用的是这个内置池中的 "Hello java",因此str1和str2引用的是同一个对象,而==正是进行引用的比较,所以str1==str2为真。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式