String学习笔记
1.String的特点
-
String声明为final的,不可被继承
-
String实现了Serializable接口:表示字符串是支持序列化的
实现了Comparable接口,表示String可以比较大小
-
String内部定义了final char[] value用于存储字符串数据
-
String代表不可变的字符序列。简称:不可变性
- 当对字符串重新赋值时,需要重新指定内存区域赋值,不能使用原有的value赋值
- 当对现有的字符串进行拼接操作时,也需要重新指定内存区域赋值,不能使用原有的value赋值
- 当调用String的replace方法修改字符串时,也需要重新指定内存区域赋值,不能使用原有的value赋值
-
通过字面量的方式给一个字符串赋值,此时的字符串声明在字符串常量池中。
-
字符串常量池中是不会存储相同的字符串的
2.String的实例化方式
- 方式一:通过字面量的方式
- 方式二:new
3.字符串特性
- 常量与常量的拼接结果在常量池中,且常量池中不会存在相同内容的常量。
- 只要其中有一个变量,结果就在堆中。
- 如果拼接结果调用intern()方法,返回值就在常量池中。
4.String、StringBuffer、StringBuilder
- 三者的不同点:
- String:不可变字符序列
- StringBuffer:可变字符序列,线程安全,效率低
- StringBuilder:可变字符序列,线程不安全,效率高
- 三者的相同点:
- 底层使用char[]存储
5.源码分析
//char[] value=new char[0];
String str=new String();
//char value=new char['a','b','c'];
String str1=new String("abc");
//char[] value=new char[16];
StringBuffer sb1=new StringBuffer();
System.out.println(sb1.length());//0
str1.append("a");//value[0]='a';
str1.append("b");//value[1]='b';
//char[] value=new char["abc".length()+16];
StringBuffer sb2=new Stringbuffer("abc");
System.out.println(sb2.length())//3
扩容问题:如果要添加的数据底层数组盛不下了,那就需要扩容底层数组。
默认情况下,扩容为原来容量的2倍+2,同时将原有数组中的元素复制到新的数组中。
:如果要添加的数据底层数组盛不下了,那就需要扩容底层数组。
默认情况下,扩容为原来容量的2倍+2,同时将原有数组中的元素复制到新的数组中。
开发中常用StringBuffer(int capacity),可以自定义底层数组的大小。