一、字符串相关的类
1、String的特点
① String声明为final的,是不可被继承的
② String实现了Serializable接口,所以是支持序列化的
③ String实现了Comparable接口,表示是可以比较大小的
④ String内部定义了final char[] value用于存储字符串数据,所以String是不可变的
不可变性的理解: 用字面量的方式给String类型变量赋值, 其字面量会在方法区中的字符串常量池中开辟一个空间用于存储,并把该空间的地址值赋给String变量;但是如果我们对原有的字符串常量的值进行修改,会在字符串常量池中新开辟一个空间用于存储,并把地址值给String变量,原来的地址空间中的字符串还是存在的,这就是字符串的不可变性
字面量赋值 和 new String() 的区别: String s = new String("abc"); 该方式创建对象,在内存中创建了两个对象,一个是堆空间中new结构,另一个是char[] 对象的常量池中的数据 "abc"
String s1 = "java";
String s2 = "java";
String s3 = new String("java");
String s4 = new String("java");
System.out.println(s1 == s2); //true
System.out.println(s1 == s3); //false
System.out.println(s1 == s4); //false
System.out.println(s3 == s4); //false
String s5 = "javeHadoop";
String s6 = "Hadoop";
String s7 = s1 + s6;
System.out.println(s5 == s7); //false
//只要拼接的时候含有变量类型时,都是在堆空间执行的,相当于new
结论:
常量与常量的拼接结果在常量池。且常量池中不会存在相同内容的常量。
只要其中有一个是变量,结果就在堆中
如果拼接的结果调用intern()方法,返回值就在常量池
2、几种转换
String --- > char [] : 调用String 的 toCharArray()
char[] ---- > String : 调用String的构造器
String --- > byte[] : 调用getBytes() , 该方法有一个有一个重载的方法,可以指定编码格式 ,相当于编码
byte[] ---- > String : 调用String的构造器 如果编码的时候指定了编码格式,解码时要统一编码格式
3、 StringBuffer、 StringBuilder
String、 StringBuffer、 StringBuilder 三者之间的区别:
String 是不可变的字符序列,底层是用final修饰的char[] 数组存储的 ,
StringBuffer 可变的字符序列,线程安全的 , 效率低 , 底层是用char[] 数组存储的
StringBuilder 是可变的字符序列,线程不安全的, 效率高 , 底层是用char[] 数组存储的
源码分析
String str = new String(); // char[] value = new char[0]
String str1 = new String("abc") //char[] value = new char[] {'a','b','c'};
StringBuffer sb1 = new StringBuffer(); //char[] value = new char[16];
sb1.length(); 0
底层创建了一个长度是16的cha[] 数组
sb1.appen('a'); //value[0] = 'a';
StringBuffer sb1 = new StringBuffer("abc"); //char[] value = new char["abc".length + 16];
扩容问题: 如果要添加的数据,底层数组盛不下,那就需要扩容, 默认情况下,扩容为原来容量的2倍 + 2, 同时将原来数组的元素复制到新的数组中, 实际使用中,如果直到需要频繁的修改添加,建议调用带参数的构造器去创建字符串
StringBuffer append(xxx):提供了很多的append()方法,用于进行字符串拼接
StringBuffer delete(int start,int end):删除指定位置的内容
StringBuffer replace(int start, int end, String str):把[start,end)位置替换为str
StringBuffer insert(int offset, xxx):在指定位置插入xxx
StringBuffer reverse() :把当前字符序列逆转
public void setCharAt(int n ,char ch)