源码:
private final char value[] private final byte value[]
String 底层一开始是char类型数组 现在改版了byte类型 是因为char一个字符占两个字节,byte只占一个,极大简化了空间。
jdk1.8及以前String使用的是char数组,jdk1.9及以后使用的是byte数组
代码中有final,所以字符串长度不可以改变,但是可以通过反射调用的方法,改变字符串内容
代码:final char value[] = {‘2’,‘12’}; Array.set(value,‘1’,‘11’);
final char[] value 存储的只是在栈中,它指向堆中的引用地址。引用地址是不可变的,但作为一个数组,它里面的内容是可变的。
代码:final char[] value={‘1’,‘2’}; value[0]=‘3’; 通过下标修改(在java中String类为什么要设计成final? - 知乎 (zhihu.com))
源码:
implements java.io.Serializable,Comparable<String>;
private static final long serialVersionUID = -6849794470754667710L;
private static final ObjectStreamField[] serialPersistentFields = new ObjectStreamField[0];
实现了Serializable接口:因此需要拥有一个序列化的ID,有了序列化ID,则可以实现文件的序列化和反序列化,将其写入到文件中,所以取用了ObjectStream类型,专门用于对象存储,也就是序列化等功能;实现了Comparable接口是比较两个字符串大小的作用;实现了CharSequence****接口,表示这是有序字符的集合 CharSequence接口 ‘字符序列化’ 描述的就是一个字符串,String实现了它,Stringbuilder,Stringbuffer也是实现了它。
它包含的主要方法 1.获取指定索引的字符:public char charAt(int index);
2.获取字符串长度:public int length();
3.截取部分字符串:public CharSequence subSequence(int start,int end); start开始 不包含start 包含end
源码:
private int hash
hash用来保存某一个String实例自己的哈希值,可以说是哈希值的一个缓存,因此String特别适合放入HashMap中,作为key来使用。每次插入一个键值対时,不需要重新计算key的哈希值,直接取出key的缓存hash值即可,在一定程度上,加快了HashMap的效率。
String总结:重要的思想就是String不可变,尽管它底层是数组,可以通过反射的方法改变内容,但是在源码中,并没有提供修改方法;当字符串是不可变时,字符串常量池才有意义。字符串常量池的出现,可以减少创建相同字面量的字符串,让不同的引用指向池中同一个字符串,为运行时节约很多的堆内存。若字符串可变,字符串常量池失去意义,基于常量池的String.intern()方法也失效,每次创建新的 String 将在堆内开辟出新的空间,占据更多的内存。