String底层变化的动机是什么
string类的当前实现将字符存储在char数组中,每个字符使用两个字节(16位)。从许多不同的应用程序收集的数据表明,字符串是堆使用的主要组成部分,而且,大多数字符串对象只包含拉丁-1字符。这 样的字符只需要一个字节的存储空间,因此这样的字符串对象的内部字符数组中的一半空间将被闲置。
小结
- String底层变化的动机是什么 节省内存空间。
- 具体的变化有什么 Stirng类内部维护一个字符数组变化为维护一个字节数组。
StringBuffer与StringBuilder底层变化
由于String类底层已经发生变化,所以StringBuilder与StringBuffer底层也相应的发生了改变。
字符串的存储结构
Jvm 有专门的字符串常量池用于存放字符串,存放字符串的数据结构是HashTable。
HashTable的数据结构如下:
案例:
public class StringDemo {
public static void main(String[] args) {
String a = "11";
String b = new String("11");
System.out.println("a的HashCode:"+a.hashCode());
System.out.println("b的HashCode:"+b.hashCode());
System.out.println("a==b :"+(a==b)); // 比较的指针地址
System.out.println("a.equals(b) :"+ a.equals(b)); // 比较的是hashCode
}
}
运行结果:
说明创建了两个Oop
char[] 对应 TypeArrayKlass
String 对应 TypeArrayOopDesc
画图说明字符串在Jvm 中的存在形式: