String特点
声明为final,不可被继承,具备不可变性,具体表现为:
- 当对字符串重新赋值时,需要重写指定内存区域赋值,不能使用原有value赋值
- 当对现有字符串进行连接操作时,也需要重新指定内存区域进行复制,不能直接使用原来的value进行赋值
- 当调用String的replace()方法修改指定字符或者字符串时,也需要重新指定内存区域赋值,不能使用原有的value进行赋值
此外,当通过字面量的方式给一个字符串赋值,此时的字符串声明在字符串常量池中。
字符串常量池特点
对于Java中的八种基本类型和String类型,Java都提供了常量池的概念。
String Pool是一个固定大小的Hashtable,其中不会存放相同的字符串。若放入的String非常多,则会导致Hash冲突,从而导致链表长度较长,从而影响插入和查找效率。
JDK6之前,字符串常量池存放在永久代中;JDK7之后,将字符串常量池调整到堆中。
字符串拼接
- 常量和常量的拼接结果存放在常量池中
- 只要拼接字符串中有一个是变量,则拼接结果将被存放在堆中。
- 如果拼接结果调用intern方法,若常量池中已经存在该字符串,则返回常量池中的对应地址;若不存在,则在常量池中放入该字符串并且返回地址
intern()方法
如果不是用双引号声明的String对象,那么使用String提供的intern方法,intern方法会从字符串常量池中查询当前字符串是否存在,若不存在就会将当前字符串放入常量池中。
intern()方法是确保字符串在内存中只有一份拷贝,这样便可节省内存空间,而这个值将会被存放在字符串内部池中。