2023年5月29日,String,StringBuffer,StringBuilder
精选
原创
©著作权归作者所有:来自51CTO博客作者咕噜咕噜滚上山的原创作品,请联系作者获取转载授权,否则将追究法律责任
1. String,StringBuffer,StringBuilder
1. String类的使用
package com.wz.test01;
import java.util.Arrays;
public class test01 {
/**
* 字符串相关类
* 分类:
* String、StringBuffer、StringBuilder
*/
public static void main(String[] args) {
String str="123abc";
System.out.println(str);
System.out.println("concat(\"def123\") 拼接字符串,并返回新的字符串");
str=str.concat("def123");//拼接字符串,并返回新的字符串
System.out.println(str);
System.out.println("---------------");
System.out.println(str);
System.out.println("substring(2) 从开始下标出截取到字符串末尾");
str=str.substring(2);//从开始下标出截取到字符串末尾
System.out.println(str);
System.out.println("---------------");
String str1="abc123def456";
System.out.println(str1);
System.out.println("substring(3,6) 从开始(包含)下标处截取到结束(不包含)下标处,返回新字符串");
str1=str1.substring(3,6);//从开始(包含)下标处截取到结束(不包含)下标处,返回新字符串
System.out.println(str1);
System.out.println("---------------");
String str2="abc123def";
System.out.println(str2);
str2=str2.toUpperCase();//转大写
System.out.println(str2+"转大写");
str2=str2.toLowerCase();//转小写
System.out.println(str2+"转小写");
System.out.println("---------------");
String str4=" 123 abc 456 def ";
System.out.println(str4);
System.out.println("trim() 去除首尾空格");
str4=str4.trim();//去除首尾空格
System.out.println(str4);
System.out.println("replace('a','A') 替换字符,并返回新的字符串");
str4=str4.replace('a','A');//替换字符,并返回新的字符串
System.out.println(str4);
System.out.println("replaceAll(\"bc\",\"BBCC\") 替换字符串,并返回新的字符串");
str4=str4.replaceAll("bc","BBCC");//替换字符串,并返回新的字符串
System.out.println(str4);
System.out.println("replaceAll(\" \",\"\") 将空格转换为空内容,达到去空格的效果");
str4=str4.replaceAll(" ","");//将空格转换为空内容,达到去空格的效果
System.out.println(str4);
System.out.println("---------------");
String str5="abc123def456";
System.out.println(str5);
System.out.println("str5.equals(\"abc123def456\") 判断两个字符串内容是否相同:(区分大小写)");
System.out.println("判断两个字符串内容是否相同:(区分大小写)"+str5.equals("abc123def456"));
System.out.println("str5.equalsIgnoreCase(\"ABC123Def456\") 判断两个字符串内容是否相同:(不区分大小写)");
System.out.println("判断两个字符串内容是否相同:(不区分大小写)"+str5.equalsIgnoreCase("ABC123Def456"));
System.out.println("str5.startsWith(\"abc\") 判断字符串是否以某个字符串开头");
System.out.println("判断字符串是否以某个字符串开头:"+str5.startsWith("abc"));
System.out.println("str5.endsWith(\"456\") 判断字符串是否以某个字符串结尾");
System.out.println("判断字符串是否以某个字符串结尾:"+str5.endsWith("456"));
System.out.println("---------------");
String str6="abc123def456abc123";
System.out.println(str6);
System.out.println("str6.indexOf(\"c\") 判断字符串第一次出现的下标");
System.out.println("判断字符串第一次出现的下标:"+str6.indexOf("c"));
System.out.println("str6.lastIndexOf(\"c\") 判断字符串最后一次出现的下标");
System.out.println("判断字符串最后一次出现的下标:"+str6.lastIndexOf("c"));
System.out.println("str6.charAt(7) 获取指定下标上的字符");
System.out.println("获取指定下标上的字符:"+ str6.charAt(7));
System.out.println("---------------");
System.out.println("str6.length() 获取字符串长度");
System.out.println("获取长度:"+str6.length());
System.out.println("str6.toCharArray() 将字符串转换为字符数组");
char[] cs=str6.toCharArray();//将字符串转换为字符数组
System.out.println(Arrays.toString(cs));
System.out.println("---------------");
System.out.println("将其他类型转为字符串类型:");
System.out.println("String.valueOf()");
System.out.println("将int转为String: "+String.valueOf(100));
System.out.println("将double转为String: "+String.valueOf(123.123));
System.out.println("将boolean转为String: "+String.valueOf(true));
System.out.println("将char转为String: "+String.valueOf('A'));
System.out.println("将int转为String: "+100+"");
System.out.println("将double转为String: "+123.123+"");
System.out.println("将boolean转为String: "+true+"");
System.out.println("将char转为String: "+'A'+"");
}
}

2. StringBuffer的使用
package com.wz.String_class;
public class test02 {
/**
*知识点:StringBuffer的使用
*/
public static void main(String[] args) {
StringBuffer stringBuffer = new StringBuffer();
System.out.println("append(\"123abc\") 在末尾追加字符串");
stringBuffer.append("123abc");
stringBuffer.append("456def");
System.out.println(stringBuffer);
System.out.println("insert(6,\"XXXYYY\") 在指定下标处插入字符串");
stringBuffer.insert(6,"XXXYYY");
System.out.println(stringBuffer);
System.out.println("replace(6,12,\"xxyy\") 从开始(包含)下标处替换到结束(排他)下标处的字符串");
stringBuffer.replace(6,12,"xxyy");
System.out.println(stringBuffer);
System.out.println("deleteCharAt(4) 删除指定字符串");
stringBuffer.deleteCharAt(4);
System.out.println(stringBuffer);
System.out.println("delete(3,12) 从开始(包含)下标处删除到结束(排他)下标处的字符串");
stringBuffer.delete(3,12);
System.out.println(stringBuffer);
System.out.println("reverse() 反转字符串");
stringBuffer.reverse();
System.out.println(stringBuffer);
}
}

3. StringBuilder的使用
package com.wz.String_class;
public class test03 {
/**
*知识点:StringBuilder的使用
*/
public static void main(String[] args) {
StringBuilder StringBuilder = new StringBuilder();
System.out.println("append(\"123abc\") 在末尾追加字符串");
StringBuilder.append("123abc");
StringBuilder.append("456def");
System.out.println(StringBuilder);
System.out.println("insert(6,\"XXXYYY\") 在指定下标处插入字符串");
StringBuilder.insert(6,"XXXYYY");
System.out.println(StringBuilder);
System.out.println("replace(6,12,\"xxyy\") 从开始(包含)下标处替换到结束(排他)下标处的字符串");
StringBuilder.replace(6,12,"xxyy");
System.out.println(StringBuilder);
System.out.println("deleteCharAt(4) 删除指定字符串");
StringBuilder.deleteCharAt(4);
System.out.println(StringBuilder);
System.out.println("delete(3,12) 从开始(包含)下标处删除到结束(排他)下标处的字符串");
StringBuilder.delete(3,12);
System.out.println(StringBuilder);
System.out.println("reverse() 反转字符串");
StringBuilder.reverse();
System.out.println(StringBuilder);
}
}

2. 深入字符串
1.深入String之创建对象
package com.wz.String_class;
public class test04 {
/**
* 知识点:深入String之创建对象
*
*/
public static void main(String[] args) {
//面试题一:以下代码会创建几个String对象
//答:1个,"abc"存在常量池中,常量池中的数据是唯一的
// String str1 = "abc";//0x11
// String str2 = "abc";//0x11
// System.out.println(str1 == str2);//true
//面试题二:以下代码会创建几个String对象
//答:3个,"abc"放在常量池中+new了2个
String str1 = new String("abc");
String str2 = new String("abc");
System.out.println(str1 == str2);//false
}
}
2.深入String之拼接字符串问题
package com.wz.String_class;
public class test05 {
/**
* 知识点:深入String 之 拼接字符串问题
*/
public static void main(String[] args) {
String str1 = "abc";
String str2 = "abc";
System.out.println(str1 == str2);//true
//注意:字面值常量在编译时就直接拼接
String str3 = "ab" + "c";
System.out.println(str1 == str3);//true
//注意:常量在编译时就直接拼接
final String s1 = "ab";
final String s2 = "c";
String str4 = s1 + s2;
System.out.println(str1 == str4);//true
String s3 = "ab";
String s4 = "c";
String str5 = s3 + s4;//底层实现:new StringBuidler(String.valueOf(s3)).append(s4).toString()
System.out.println(str1 == str5);//false
}
}
3. StringBuilder 与 StringBuffer底层
/**
* 知识点:StringBuilder和StringBuffer的底层原理
*
* 继承关系:
* StringBuilder extends AbstractStringBuilder
* StringBuffer extends AbstractStringBuilder
*
* 小结:
* 1.StringBuilder和StringBuffer将数据存储在父类AbstractStringBuilder中的char类型的数组中
* 2.缓冲数组的默认大小16
* 3.StringBuilder的功能完全依赖父类AbstractStringBuilder
* 4.StringBuffer的功能完全依赖父类AbstractStringBuilder
* 5.StringBuilder和StringBuffer的使用是一模一样的
* 6.StringBuilder是线程不安全的,单线程下使用
* 7.StringBuffer是线程安全的,多线程下使用 - synchronized
*/
4. String vs StringBuilder vs StringBuffer
/**
* 知识点:String vs StringBuilder vs StringBuffer
*
* String的理解:
* String是不可变类, 即一旦一个String对象被创建,
* 包含在这个对象中的字符序列是不可改变的, 直至该对象被销毁。
* String类是final类,不能有子类。
* public class String{
* private final char[] value;
* }
*
* StringBuilder和StringBuffer的理解:
* StringBuilder和StringBuffer称为字符串缓冲区,
* 它的工作原理是:new对象预先申请一块内存,存放字符序列(字符数组),
* 默认大小为16个长度,如果字符序列满了,会重新改变缓存区的大小(扩容机制:原来长度*2+2),
* 以容纳更多的字符序列。
* StringBuilder和StringBuffer是可变对象(可扩容),这个是String最大的不同
* StringBuilder和StringBuffer代表可变的字符序列。
*/