1.String的不变性
对String对象进行操作的方法,实际传入的是引用的一个拷贝,每当把String对象作为方法的参数时,都会复制一份引用,而该引用所值的对象其实一直待在单一的物理位置上,从未改变过。
字符创对象一旦被初始化就不会发生改变
String str = "java";
str = "c++";
"java"这个对象一旦被创建,将不再改变,后面只是引用“str”指向的地址放生了改变,而常量池中的“java”没有改变
String str1 = “abc”;
String str2 = "abc";
syso(str1 == str2);//true
这是由于字符串被初始化到常量池中,str1初始化“abc”会在字符串常量池中找看有没有“abc”,发现没有就创建一个“abc”,str2创建时发现有“abc”了,那就不创建了,直接指向了“abc”,这样会节约空间。
String s1 = "abc";
String s2 = new String("abc");
syso(s1 == s2);//false
这是因为第一行的“abc”是在常量池中创建了一个“abc”对象,第二个是先在堆中创建了一个String对象,又闯入了一个“abc”对象,也就是说第一行在字符串常量池中创建了一个对象,第二行在堆中创建了两个对象
常量池中的字符串传由于String的不变性,所以字符串对象时可以共享的,节约空间。
2.String类中的方法
如果改变了字符串里的内容时,String类的方法都会返回一个新的String对象
如果内容没有改变,String的方法只是返回指向源对象的引用而已,这样可以节约存储空间,避免额外的开销
3.String的对象时不变的,你可以给一个String对象加任意多的别名,但是指向这个对象的任何引用都不会改变它的值,这样也就不会对其他引用产生什么影响
4.Java中只有“+”和“+=”这么一组重载的操作符,不允许程序员重载任何操作符
5.如果为一个类写toString()方法时,如果字符串比较简单,可以直接用“+”这种形式,但是如果要在toString()方法中使用循环,那么最好自己创建一个StringBuilder对象,利用这个对象的方法操作,因为如果是普通的“+”会创建好多个对象,然后再链接,浪费资源,而用StringBuilder只创建了一个对象,操作效率高,所以如果能用StringBuilder操作尽量用这个容器。
6. StringBuffer
字符串缓冲区,用于存储数据的容器
特点
(1)长度可变(数组长度不可变)
(2)可以存储不同类型的数据(数组里的数据类型一致)
(3)最终容器里是一个特别长的字符串(数组里可以带所以取出来)
7.StringBuilder
StringBudffer是线程安全的,所以可以线程同步,常用于多线程,这样在对数据进行添加删除等操作时会先判断一下锁,防止误删误添加,所以安全
StringBuilder是线程不安全的,不能线程同步,常用于单线程,但这样会提高了效率,所以单线程时要用StingBuilder