更新内容:
一、常量池
1.在JVM底层维护一个常量池,如果采用了直接赋值的模型进行String类对象的实例化操作,那么该字符串内容将自动保持在这个池中。
2.如果下次继续使用直接赋值的模式声明String类对象,此时对象池之中如若有指定内容,将直接进行引用。
3.如若没有,则开辟新的字符串对象而后将其保存在对象池之中以供下次使用。
4.String类的共享设计模式
若使用构造方法创建字符串(不论之前有没有创建’‘hello’'这个对象,都会创建一个新的对象,浪费空间)。
二、字符串的修改
字符串是一种不可变对象. 它的内容不可改变。
例如以下代码:
String str = "hello" ;
str = str + " world" ;
str += "!!!" ;
System.out.println(str);
// 执行结果
hello world!!!
形如 += 这样的操作, 表面上好像是修改了字符串, 其实不是。内存变化如下:
明显可以看到,在相加的过程中,实际是str指向的地址不停在改变,并不是str指向的对象本身发生了改变。
---------------------------------------------------分割线-------------------------------------------------------------
一、String类的创建
1、String str = “hello”; >>>>>>>采用直接创建的方式,对象在堆中的常量池中
2、String str = new String(“hello”); >>>>>>>>>使用String构造方法创建,对象没在常量池,是在堆中的其他地方
3、char[] array = {‘h’,‘e’,‘l’,‘l’,‘o’}; >>>>>>>>>>>>>使用String的构造方法,原理同上
String str = new String(array);
注意:
①字符串的相等与否,不是对字符串内容的比较,而是对其引用地址的比较。
*** ②字符串的加法,不是 String 对象本身发生改变, 而是拼接后引用到了其他的对象,所以在使用时要避免这种代码 : ***
String str = “hello” ;
for(int x = 0; x < 1000; x++) {
str += x ;
}
因为会开辟了太多内存,效率比较低
二、字符串的操作
1、字符串的比较
在String类中compareTo()方法是一个非常重要的方法,该方法返回一个整型,该数据会根据大小关系返回三类内容:
相等,返回0
小于,返回内容小于0
大于,返回内容大于0
2、字符串的查找
3、字符串的替换
字符串是不可改变的,所以替换后返回一个新的字符串
4、字符串的拆分
5、字符串截取
索引从0开始,注意前闭后开区间的写法, substring(0, 5) 表示包含 0 号下标的字符, 不包含 5 号下标
6、其他用法
三、StringBuffer 和 StringBilder
1)创建一个StringBuffer
StringBuffer sb = new StringBuffer();//1.直接初始化
StringBuffer sb = new StringBuffer("helloworld");//2.利用String初始化
2)请解释String、StringBuffer、StringBuilder的区别:
①String的内容不可修改,StringBuffer与StringBuilder的内容可以修改.
②StringBuffer与StringBuilder大部分功能是相似的
③StringBuffer采用同步处理,属于线程安全操作;而StringBuilder采用异步处理,属于线程不安全操作
④String类中的大部分方法,SBuffer,SBuilder都有。
注意
String和StringBuffer类不能直接转换。如果想直接转换,可采取如下原则:
①String变为StringBuffer: 利用StringBuffer的构造方法或append()方法(如下代码)。
StringBuffer sb2 = new StringBuffer();
sb2.append("111"); //通过append方法将字符串转换为StringBuffer对象
System.out.println(sb2);
②StringBuffer变为String: 调用toString()方法。