关于String的内存问题

  • String的内存存储机制

  • new string和string=“”的区别

  • 同个类下的对象的String的存储

  • ==和equals的区别以及替代

String的内存存储机制

    String主要活动在堆区和常量区

如果采用String str=“abc”的形式相当于在常量区直接创建了一个“abc”的字符串,并且字符串是全局的静态常量,也就是说这个字符串的生命周期是这个运行程序本身,一旦创建除非程序退出,否则一直存在于常量区。

而String str=new String("abc")其可以拆成两个步骤也就是在堆区new出一个对象,对象的成员变量是"abc",然后是str=“abc”,那么会将字符串下放到常量区,当然在此间应该进行判定是否存在字符串在常量区,如果存在则不进行创建,直接引用。注意:这只是不在常量区创建,new的字符串对象不变

在常量区的字符串可以用+进行组合,但是本身并不发生变化,如

String a="abc";
String b="ert";
String c=a+b;

此时“abc”和“ert“字符串仍然存在于常量区,不过是创建了“abcert”,并应用该字符串

同个类下的对象的String的存储

那么如果一个类中通过String str=“”的方式产生了 一个字符串,那么不同对象的hashcode相同吗?

答案是相同的,就算是不同类通过这种方法产生的字符串的地址都是相同的,因为只产生一次,每次只不过都是对这个字符串的引用

如果通过new String()?

答案是不同的,因为不同的对象new占用了不同的内存区域,其hashcode不同,所以即使是同一个类下的对象hashcode也不同

==和equals的区别以及替代

==和equals,如果在equals没有进行重写的情况下,其表达意义是相同的。当然在String.equals等其他equals都已经进行了重写。==用于判断物理地址是否相同也就是Hashcode是否相同,而equals主要用于进行表面意义的判断如字符串的各字母相同等。在String中如果本身不是new出来的,而是直接放在静态区的那么其==和equals都为相同。如果是new()出来的,那么String.equals返回相同,而==返回false。

猜你喜欢

转载自blog.csdn.net/zhunquanjiong6199/article/details/82261733