String的基本特性
String : 字符串,使用" "引号起来表示
String s1 = "hello world"; //字面量的定义方式
String s2 = new String("hello world"); //new 形式
String 声明为 final 的, 不可被继承
String 实现了Serializable 接口: 表示字符串是支持序列化的。
实现了Comparable 接口: 表示String 可以比较大小
实现了Charsequence 接口: 该接口提供了 charAt(i),length() 等方法
public final class String implements java.io.Serializable, Comparable<String>, CharSequence { } Jdk 8 String 的存储方式: private final char value[]; Jdk 9 String 的存储方式(Jdk 9以上也是这种存储方式): private final byte[] value 官网描述
String:代表不可变得字符序列。简称:不可变性
- 当对字符串重新赋值时,需要重写制定内存区域赋值,不能使用原有的value进行赋值。
- 当对现有的字符串进行连接操作是,也需要重新制定内存区域赋值,不能使用原有的value进行赋值。
- 当调用String 的replace()方法修改指定字符或字符串时,也需要重新指定内存区域值,不能使用原有的value进行赋值。
通过字面量的方式(区别于new)给一个字符串赋值,此时的字符串值声明在字符串常量池中。
字符串常量池中不会存储相同内容的字符串
- String 的String Pool 是一个固定大小的Hashtable,默认值大小长度是1009。如果放进String Pool 的String非常多,就会造成Hash冲突严重,从而导致链表会很长,而链表长了直接会造成的影响是当调用String.intern时性能会大幅下降。
- 使用 XX: StringTableSize 可设置StringTable的长度
- 在jdk6中StringTable是固定的,就是1009的长度,所以如果常量池中字符串过多就会导致效率下载很快。
- 在jdk7中,StringTable的长度默认值是60013,jdk 8 1009是可设置的最小值
String的内存分配
在Java语言中有8种基本数据类型和一种比较特殊的类型String。这些类型为了使它们在运行中速度更快,更节省内存,都提供了一种常量池的概念。
常量池就类似于一个Java系统级别提供的缓存。8种基本数据类型的常量池都是系统协调的,String类型的常量池比较特殊,它的主要使用方法有两种。
- 直接使用双引号声明出来的String对象会直接存储在常量池中。比如:String info ="hello"
- 如果不是用双引号声明的String对象,可以使用String提供的intern()方法。
Java6 之前,字符串常量池存放在永久代
Java7 中 Oracle 的工程师 对字符串常量池的逻辑做了很大的改变,即将字符串常量池的位置调整到Java堆中
String 的基本操作
字符串拼接操作
1.常量与常量的拼接结果在常量池,原理是编译期优化
2.常量池中不会存在相同内容的常量。
3.只要其中有一个是变量,结果就在堆中。变量拼接的原理是StringBuilder
4.如果拼接的结果调用intern()方法,则主动将常量池中还没有的字符串对象放入池中,并返回此对象地址。
字符串变量拼接操作的底层原理
拼接操作与append操作的效率对比
intern()的理解
A pool of strings, initially empty, is maintained privately by the class String.
When the intern method is invoked, if the pool already contains a string equal to this String object as determined by the equals(Object) method, then the string from the pool is returned. Otherwise, this String object is added to the pool and a reference to this String object is returned.
intern()的使用: jdk6 vs jdk7/8
jdk6在字符串常量池创建新的地址
jdk7/8 引用堆地址()
new String()到底创建了几个对象
关于intern()的面试难题
面试的拓展问题
intern()的课后练习1
intern()的课后练习2
intern()的空间效率测试