您好,匿名用户

Java: 不同String 相加在内存里的分布?

0 投票
    String str1 = "a";
    String str2 = "b";
    String str3 = "ab";
    String str4 = new String("a");
    String str5 = new String("b");
    String str6= new String("ab");
    
    
    String plus1 = str1 + str2; 
    String plus2 = str1 + "b"; 
    String plus3 = str4 + "b";
    String plus4 = "a" + "b";
    String plus5 = str4 + str5;
    String plus6 = str4 + str2;

string相加有上面的6种情况
我想弄清楚各种情况的区别,我知道的是plus4都是在栈区,所以结果是一个字符串常量池里的常量,但是其他情况呢?
另外,我打印plus1~plus6的地址或者hashcode,发现都是一样的,怎么回事?

用户头像 提问 2017年 6月16日 @ Tashigi 下士 (836 威望)
分享到:

1个回答

0 投票

楼上说的对,相同字符串字面量在方法区中只会有一个值。这个也就是常说的string和stringbuffer的用法区别。

下面我补充:
String str4 = new String("a");
“a”字面量是储存在jvm的方法区中。
str4这个对象是存储在堆中。
上面这句话意思就有2个内存地址被分配。
而栈中存储的是8中基本类型和returnAddress、reference,字符串是不会存储在栈中。
关于hashcode用法呢,就是用来匹配和定位的。你可以去自己去百度hashcode 和 == 和 equals的区别。
而且,plus1-6的内存地址肯定是不一样的。我不知道你怎么发现是一样的。。。

如果有什么理解的不对的,忘各位大牛指点一二。

用户头像 回复 2017年 6月16日 @ Xerath 下士 (967 威望)
提一个问题:

相关问题

0 投票
1 回复 97 阅读
用户头像 提问 2017年 5月22日 @ Sivir 中士 (1,100 威望)
0 投票
1 回复 11 阅读
0 投票
1 回复 67 阅读
用户头像 提问 2012年 12月1日 @ Ashe 中士 (1,101 威望)
+2 投票
1 回复 252 阅读
用户头像 提问 2013年 2月12日 @ Soraka 中士 (1,024 威望)
0 投票
1 回复 98 阅读

欢迎来到随意问技术百科, 这是一个面向专业开发者的IT问答网站,提供途径助开发者查找IT技术方案,解决程序bug和网站运维难题等。
温馨提示:本网站禁止用户发布与IT技术无关的、粗浅的、毫无意义的或者违法国家法规的等不合理内容,谢谢支持。

欢迎访问随意问技术百科,为了给您提供更好的服务,请及时反馈您的意见。
...