1.String类
1.1 String类概述
String类是一个不变类,只要是改变原有String类的对象(常量除外)都会另新创建一个String类对象,不会对原有String对象造成任何影响
1.2 String类对象的两种创建方式
字面量
String str = "huang";
new对象
String str1 = new String("huang");
两种创建对象的区别:通过字面量的方式至多创建一次对象,通过new的方式至多创建两次对象至少创建一次对象
内存图如下:
首先在str创建的时候,它会检查常量池中是否存在huang,如果存在则直接将str指向huang,如果不存在,在常量池中开辟一块内存区域用来存储huang,并将str指向这块内存区域。因此字面量创建对象可以不创建新的对象,至多创建一次对象。其次,在创建str1的时候它会在堆内存中开辟一块内存区域,不管常量池中是否存在该对象,在创建完之后,如果常量池中存在该对象,则只需要创建一次对象,如果常量池中不存在该对象,那么就需要在常量池中开辟一块新的内存区域用于存储该对象。由此new对象的过程中最少创建一次对象,最多创建两次对象。
2.StringBuffer类
2.1 StringBuffer概述
StringBuffer是一个可变类,即该类对象的改变不用创建新的对象,只是他的底层会不断地扩容来满足空间需求,他是一个线程安全但效率不高的操作字符串的类
2.1 StringBuffer的使用
当频繁的对一个字符串作出修改时,涉及到线程安全时建议使用StringBuffer
3.StringBuilder
3.1 StringBuilder概述
StringBuilder同样是一个可变类,即该类对象的改变不用创建新的对象,只有他的底层会不断的扩容来满足空间需求,他是一个线程不安全但效率高的操作字符串的类
3.2 StringBuilder的使用
当频繁的对一个字符串作出修改时,不涉及到线程安全的问题时建议使用StringBuilder
4.String、StringBuffer、StringBuilder三者异同
同:都是用来对字符串进行操作,且底层都是用char型数组来存储数据
异:String类是一个不可变类,任何对象的改变都会创建一个新的对象。而StringBuffer和StringBuilder不需要。另StringBuffer是一个线程不安全,效率低的类,而StringBuilder是一个线程不安全,效率高的类。