以下内容基于 jdk8 分析
public final class String implements java.io.Serializable, Comparable<String>, CharSequence {
/** The value is used for character storage.真正存储数据的结构 */
private final char value[];
/** Cache the hash code for the string */
private int hash; // Default to 0
......
}
使用 private final 修饰的char[] 数组存储
String aString = "abc";
String aString = new String("abc");
通过以下两点:
保证了 String 类一经实例化就不可变(不可变就是第二次给一个 String 实例赋新内容的的时候,不是在原内存地址上修改数据,而是重新指向一个新对象).
一旦保证了 String 实例的不可变, 就能使用字符串常量池, 达到减少创建字符串带来的系统开销. 具体来说就是:
// hashCode 生成方式
public int hashCode() {
int h = hash;
if (h == 0 && value.length > 0) {
char val[] = value;
for (int i = 0; i < value.length; i++) {
h = 31 * h + val[i];
}
hash = h;
}
return h;
}
在 JDK6.0 及以前版本, 字符串常量池存放在方法区中, 在 JDK7.0 - 11, 字符串常量池被移到堆中.
文章内容皆是基于笔者个人理解,欢迎读者在评论区留言指出不对的地方。
原文:https://www.cnblogs.com/gaarakseven/p/14442672.html