目录
4.StringBuffer 和 StringBuilder区别
String
表示一个字符串,是引用数据类型
-
1、字符串存储格式
- 字符串是用final修饰的char类型数组进行存储的。
-
2、String的不可变性
- 字符串一旦初始化不可更改,但可通过在字符串常量池中重新创建一个字符串,改变引用的指向,进而改变字符串的值
-
3、String字符串的初始化
- (1)直接赋值(字符串常量池)
String str = "Hello";
(2)通过构造方法初始化 ①public String(String str);②publi String(char[] c);
String str4 = new String("helloWorld");
- 区别:
- String str = "Hello";字符串存储在字符串常量池中。
- String str4 = new String("helloWorld");通过new对象的方法进行初始化。字符串存储在堆中
-
4、字符串的比较
- "==":比较引用数据类型时,比较的是地址
- equals()方法:在字符串中,使用equals方法比较字符串的内容
//字符串的比较
String str6 = "happy";
String str7 = "happy";
String str8 = new String("happy");
System.out.println(str6 == str7);//true str6和str7指向同一个空间,说明地址相同
System.out.println(str7 == str8);//false str7指向的是字符串常量池中的地址
System.out.println(str7.equals(str8));//true
- 注:
- (1)equals是超类Object中的方法,实际上使用"=="比较对象的地址,但是String类中重写了该方法
- (2)字符串的比较一般都用equals()比较而不用"=="
-
5.字符串拼接
- (1)字符串常量拼接字符串处理:在常量池中开辟空间
- (2)如有字符串变量参与拼接:在堆中开辟空间
- (1)字符串常量拼接字符串处理:在常量池中开辟空间
String str9 = "helloworld";//在常量池中
String str10 = "hello"+"world";//先拼接成helloworld 在常量池中
String str11 = "hello";
str11 = str11+"world";//helloworld 变量+常量 会在堆中开辟helloworld字符空间
System.out.println(str9 == str10);//true
System.out.println(str11);
System.out.println(str9 == str11);//false
String s1 = "hello";
String s2 = "world";
String s3 = s1+s2;//变量+变量 在堆中开辟空间
System.out.println(s3 == str9);//false
final String s4 = "hello";
final String s5 = "world";
String s6 = s4+s5;//常量+常量 在常量池中开辟空间
System.out.println(s6 == str9);//true
-
6、字符串的成常用方法
- (1)equals:用于比较字符内容
- (2)equalsIngnoreCase:忽略大小写比较
String str1 = "abc";
String str2 = "ABC";
//equalsIgnoreCase:忽略大小写比较
System.out.println(str1.equals(str2));//false
System.out.println(str1.equalsIgnoreCase(str2));//true
- (3)startswith:是否以指定的前缀开头
//startsWith:是否以指定的前缀开头
String str3 = "ande";
System.out.println(str3.startsWith("a"));//true
System.out.println(str3.startsWith("b"));//false
(4)length:返回此字符串的长度
//length:返回此字符串的长度
System.out.println(str1.length());//3
(5)charAt:返回指定下标的字符
//返回指定下标的字符
//charAt:返回char指定索引处的值。指数范围为0至length()-1。该序列的第一个char值在索引0,下一个索引为1 ,依此类推,与数组索引一样
String str4 = "abcdefghijkllmn";
System.out.println(str4.charAt(1));//a
System.out.println(str4.charAt(str4.length()-1));//n
(6)indexOf:指定字符串第一次出现的序列号/位置,没有匹配的就返回-1
//indexOf:指定字符串第一次出现的序列号/位置,没有匹配的就返回-1
System.out.println(str4.indexOf("cd"));//2
System.out.println(str4.indexOf("b"));//1
System.out.println(str4.indexOf("z"));//-1
(7)lastIndexOf:返回字符串最后一次在字符串中出现的下标
//lastIndexOf:返回字符串最后一次在字符串中出现的下标
System.out.println(str4.lastIndexOf("l"));//12
(8)subString:减去前n个字符/截取指定下标范围内的字符串
//substring:减去前n个字符/截取指定下标范围内的字符串
String str5 = " Hello World ! ";
System.out.println(str5.substring(2));//llo World!
System.out.println(str5.substring(10));//d! 范围:[10,+∞)
System.out.println(str5.substring(7, 12));//World 范围:[7,12)
(9)toCharArray:将字符串转换成字符型数组
//toCharArray:将字符串转换成字符型数组
System.out.println(str5.toCharArray());// Hello World !
char[] str6 = str5.toCharArray();
System.out.println(Arrays.toString(str6));//[ , H, e, l, l, o, , W, o, r, l, d, , !, ]
System.out.println(str6);// Hello World !
(10)trim:删除字符串开头和末尾的空格
//trim:删除字符串开头和末尾的空格
System.out.println(str5.trim());//Hello World !
(11)replace:替换指定字符串(区分大小写)
//replace:替换指定字符串(区分大小写)
System.out.println(str5.replace("o", "K"));// HellK WKrld !
System.out.println(str5.replace("ell", "m"));// Hmo World !
(12)split:把字符以指定的字符进行分割
//split:把字符以指定的字符进行分割
String str7 = "1,,2,,3,,4,,5";
String[] str8 = str7.split(",");
for (String s : str8) {
System.out.println(s);//1,2,3,4,5
}
StringBuffer
用于对字符串进行存储和操作,可以声明一个可变的字符串,可以用于对字符串频繁的操作
-
1.StringBuffer的定义
- new StringBuffer(String str);
String str1 = "hello";
StringBuffer buffer = new StringBuffer(str1);
System.out.println(buffer);//hello
-
2.常用方法
- (1)append();用于字符串的拼接
//append()
buffer.append("World").append("!");
System.out.println(buffer);//helloWorld!
(2)toString();将字符串转换成String类型
//toString类型
String str2 = buffer.toString();
System.out.println(str2);//helloWorld!
(3)setCharAt(int index,char c);设定指定下标的字符
//setCharAt()
buffer.setCharAt(1,'O');
System.out.println(buffer);//hOlloWorld!
(4)replace(int start, int end, String str);替换指定下标范围的字符串
//replace(int start, int end, String str)
System.out.println(buffer.replace(0, 5, "Happy"));//HappyWorld!
(5)reverse();将字符串翻转
//reverse
System.out.println(buffer.reverse());//!dlroWyppaH
3.StringBuffer的比较
//StringBuffer的比较:转换成String类型来比较
StringBuffer strbuff1 = new StringBuffer("hello");
StringBuffer strbuff2 = new StringBuffer("hello");
System.out.println(strbuff1.equals(strbuff2));//false 原因:StringBuffer没有重写equals()方法
System.out.println(strbuff1.toString().equals(strbuff2.toString()));//true
4.StringBuffer 和 StringBuilder区别
StringBuilder是线程安全的,效率低;StringBuilder线程是不安全的,效率高