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效率更高。