java string 内存写了_Java: 不同String 相加在内存里的分布?

一楼回答太笼统,而且抛开JVM和JDK版本谈内存分配都是耍流氓。

以提问的为例:

String str1 = "a";

String str2 = "b";

String str3 = "ab";

这种直接定义字符串,JVM认为字符串是不变量,也就是线程安全的,因为这种字符串直接分配在方法区的常量池中.

String str4 = new String("a");

String str5 = new String("b");

String str6= new String("ab");

有new关键字,说明这种字符串是分配在堆上.可以使用如下方法验证:

public static void main(String[] args) {

String str1 = "a";

String str2 = "b";

String str3 = "ab";

String str4 = new String("a");

String str5 = new String("b");

String str6= new String("ab");

System.out.println(str1 == str4); // false,说明str1和str4的内存地址不一样,一个在方法区,一个在堆.

System.out.println(str1 == str4.intern()); // true,str4存入常量池后并没有重新创建一块内存,而是使用了已有的常量句柄.

}

回答一下为什么plus1~6的hashcode一样,是因为你没有去重写String的hashcode方法。而String默认hashcode的实现为:

@Override public int hashCode() {

int hash = hashCode;

if (hash == 0) {

if (count == 0) {

return 0;

}

for (int i = 0; i < count; ++i) {

hash = 31 * hash + charAt(i);

}

hashCode = hash;

}

return hash;

}

只是对字面常量做了处理,而plus1~6的字面常量一样,所以hashcode值当然一致。然后hashcode一致,不代表它们在jvm分配的内存地址一致。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值