java String特性
1 特点
a.字符串的内容永不可变,底层时被final修饰的数组 private final byte[] value;
如果要进行字符串的相加,内存中就会有多个字符串,占用的空间就多,效率低
例如
String str ="a"+"b"+"c";
"a","b","c" 占用三个空间
"a"+"b" 占用一个空间
"ab"+"c" 占用一个空间
这时候可以用StringBuilder类对字符进行操作,它是字符缓冲区,可以提高字符串的操作效率,StringBuilder底层也是一个数组,但是没有被final修饰,可以改变长度,而且操作占用的空间少,始终是一个数组,如果超出了StringBuilder的容量,会自动的扩容,其初始容量为16个字符
StringBuilder 介绍
两种创建方法
append()返回的是self,所以两者的地址相等
跟String的相互转化
b.因为不可变的特点 所以字符串可以共享使用;
c.字符串效果上相当于char[]字符数组 但底层的原理是byte[]字节数组;
d.字符串常量值,程序当中直接写上的双引号字符串,就在字符串常量池当中;
2 创建
字符串的创建分类3种构造方法+一种直接创建
1 .创建空白字符串
2.根据字符数组的内容,创建对象(java的char 是unicode存储的,unicode编码字符集中包含了中文,所以可以存储中文)
3.根据字节数组的内容,来创建对应的字符串;
4 .直接创建(这种也是对象).
3 字符串常量池
首先我们创建一个字符 String str1 ="abc"; 首先他先转化为一个字节数组,再将字节数组的地址保存在字符常量池中的字符对象中,再把池当中的对象地址交给str4,str4指向这个地址(对象不是自己创建的,是字符常量池创建的)
接下来我们再创建一个字符对象 String str2 ="abc";两个字符内容一样,这时候就字符串常量池就会判断,如果字符串内容已经存在的,就不会继续创建字符对象,把str5也指向这个地址
所以当我们对比这两个字符的内容是否相等的时候我们可以用“==”,其他情况“==”我们对比的是地址值
但是如果我们用其他方式构造方法创建的String对象,就不会在字符常量池中创建对象,会单独new一个对象,所以用构造方法创建的对象的两个对象即使内容一致也不会指向同一个地址,这种创建方式如果要对比内容是否相等,则用equals方法.
注意:
使用 字符串的equals时,推荐把常量放在前面