String
String简介
java中String为引用数据类型,其本身也为一个class文件,实现原理为char类型数组。(看下图)由于String类为final修饰的并且数组char value[]也为final修饰,所以String为不可变类型,赋值后不能改变,为字符串常量。

举个栗子🌰
1 | String a = "eli"; |
以上语句看似字符串a发生了改变,从eli变为chen,但是String不可变所说的为字符串本身不可变,不是其引用所指向的对象地址。这里创建了一个新的String对象并使用a引用指向其地址,原来的eli并没有发生改变而是失去了地址引用,变成了内存中的垃圾。
String之间的比较
我们在比较字符串时我们想比较的是字符串的内容是否相等,因为String为引用数据类型,String对象存储的只是指向该字符串堆空间的一个内存地址,使用==比较并不能得到正确结果,这与我们的初衷违背,因为String重写了Object类的equals()方法,我们在进行字符串比较式必须使用equals()方法,不能使用==。
代码演示
1 | 代码段1: |
看以上代码发现str1==str2为true而str3==str4为false,原因是因为java在编译期会将相同的字符串当做一个对象放入常量池,所以str1和str2为同一个对象,==也为true。使用new String()来创建对象会强制创建两个不同的对象,所以str3==str4为false。
以上代码共创建几个对象?
代码段1:
String str1 = “aa”;在字符串常量池创建一个对象”aa”,后面str2时直接引用该对象,不用再创建,共创建一个对象代码段2:
先在字符串常量池创建一个对象”cc”,然后在堆空间创建两个对象,使str3和str4分别指向它们,共创建3个对象代码段3:
在字符串常量区创建3个对象,分别是”eli” ,“chen”,“elichen”方法简介
判断功能
1 | //1 equals判断字符串内容是否相等 引用数据类型 ==比较的是内存地址(是不是同一个对象) |
获取功能
1 | // 1 length() 获取字符串长度(由多少个字符组成) |
转换功能
1 | // 1 getBytes() 将字符串转换成字节数组 |
StringBuffer(JDK1.0)
StringBuffer简介
StringBuffer为可变长字符串,原理与字符串相同,数组为可变长数组,默认容量为16,创建更长的字符串可以自动扩容。StringBuffer对象可以被多次修改并不会产生新的对象,进行字符串处理效率高。StringBuffer的方法都是使用synchronized修饰的方法,所以StringBuffer为线程安全的。

StringBuffer方法简介
1 | //StringBuffer构造方法1 |
StringBuilder(JDK1.5)
StringBuilder简介
StringBuilder在JDK5.0新增的,StringBuilder与StringBuffer基本相同只不过不是线程安全的,方法也大致相同。StringBuilder效率更高。