String类
1String不变对象
2Java.lang.String使用final修饰,不能被继承
3字符串底层封装了字符数组以及针对字符数组的操作算法;
4字符串一旦创建,对象永远无法改变,但字符串引用可以重写赋值;
5Java字符串在内存中Unicode编码方式,任何一个字符对应两个字节的定长编码
内存角度:
字符串常量池因为JDK不同版本的迭代,存放的位置一直在变。
JDK1.7之前运行时常量池(包含字符串常量池)存放在方法区,此时hotspot
虚拟机对方法区实现为永久代。
JDK1.7字符串常量池从方法区拿到了堆中
JDK1.8hotspot移除了永久代用元空间取代,字符串常量池还在堆,运行时常量池在方法区。
堆:
在逻辑上分为三部分:
新生代:新创建的对象,垃圾回收器机制:GC会很频繁的来回收没有引用的对象
(新职员上岗,经过每年的考验。)
老年代:
在新生代中新创建的对象被垃圾回收器GC回收次数超过15次依旧还存在的对象
会从新生代转移到老年代。(新职员上岗,经过每年的考验,没有被劝退的。)
老年代的GC:不会很频繁的来回收,当然也有可能被退回新生代
永久代(元空间):
不GC,加载一次的类,方法,常量,特别是静态的一切。
为什么说String不变对象?
1每一个字符串对象的创建都会放在永久代里面。作为一个常量。
2当下一次创建字符串对象的时候,会去找永久代里面有没有相同的,有就直接给引用指向它不创建新的字符串对象,没有才会创建新的字符串对象。
3如果使用new关键词创建字符串对象,一定时开辟新的空间。
String类与StringBuffer类和StringBuilder类区别
String对象是不变对象(定长)一旦产生后就不可以被修改,作为常量在永久代。
StringBuffer和StringBuilder的内容可以修改。
简单地说,就是一个变量和常量的关系。
StringBuilder作StringBuffer替代品
StringBuffer线程安全的,多线程操作字符串 ,性能稍慢
StringBuilder非线程安全,单线程操作字符串,性能稍微快
内存角度:
String类
StringBuffer和StringBuilder的内容可以修改。
在内部构建数组,能够良好的进行垃圾回收
故:对字符串内容更改用StringBuffer或StringBuilder。在可能的情况下,建议使用StringBuilder类优先于StringBuffer,因为在大多数实现中它会更快。