【JAVA语言-第11话】API中的工具类 之 String,StringBuilder,StringBuffer的详细解析与异同点
目录
1.4 String和StringBuffer、StringBuilder类的异同点
1.5 StringBuffer和StringBuilder类的异同点
字符串操作类
1.1 String类
1.1.1 概述
????????java.lang.String类:代表字符串,程序当中所有的双引号括起来的都是字符串,都是String类的对象,就算没有new,也是对象。
1.1.2 字符串的特点
- 字符串的内容永不可变。
- 正是因为字符串不可改变,所以字符串是可以共享使用的。
- 字符串效果上相当于是char[]字符数组,但是底层代码的原理是byte[]字节数组。
1.1.3 创建字符串的方式
????????字符串的创建方法非常多种,除去下列4种常见的方式,还可以通过调用方法返回字符串等其他方式,根据需求使用。
源代码:?
package com.zhy.test;
public class TestString {
public static void main(String[] args) {
//方式1:直接创建赋值
String str1 = "Hello str1";
System.out.println(str1);
//方式2:通过构造方法创建
String str2 = new String("Hello str2");
System.out.println(str2);
//方式3:根据字符数组的内容,来创建对应的字符串
char[] charArray = {'A','B','C'};
String str3 = new String(charArray);
System.out.println(str3);
//方式4:根据字节数组的内容,来创建对应的字符串
byte[] byteArray = {97,98,99};
String str4 = new String(byteArray);
System.out.println(str4);//打印的是ASCLL码转换成对应的字母
}
}
输出结果:
?
1.1.4 字符串的常用方法
1.字符串比较方法:
????????public boolean equals(Object obj):比较字符串的内容,严格区分大小写。
????????public boolean equalsIgnoreCase(String str):比较字符串的内容,不区分大小写。
String str1 = "HELLO JAVA"; String str2 = "hello java"; System.out.println(str1.equals(str2));//输出:false System.out.println(str1.equalsIgnoreCase(str2));//输出:true
2.字符串获取方法:? ? ? ??
????????public int length():获取字符串的长度。
????????public String concat(String str):获取连接字符串。
????????public char charAt(int index):获取指定索引的单个字符。
????????public int indexOf(String str):获取指定字符串的索引。
String str1 = "Hello "; String str2 = "Java"; /** * 字符串获取方法 * length():获取字符串当中含有的字符个数,拿到字符串长度 * concat(String str):将当前字符串和str拼接作为返回值,成为新的字符串 * charAt(int index):获取index索引位置的单个字符(索引从0开始) * indexOf(String str):查找str在本字符串当中首次出现的索引位置,如果没有则返回-1值 */ System.out.println(str1.length());//输出:6,最后的空格也算一个长度 System.out.println(str1.concat(str2));//输出:Hello Java System.out.println(str1.charAt(0));//输出:H System.out.println(str1.charAt(1));//输出:e System.out.println(str1.indexOf("llo"));//输出:2
3.字符串截取方法:??
????????public String substring(int index):截取字符串,从index到最后。
????????public String substring(int begin,int end):截取字符串,从begin到end,左闭右开。
String str1 = "Hello"; /** * 字符串截取方法 * substring(int index):截取从参数位置一直到字符串末尾,返回新字符串 * substring(int begin,int end):截取从begin开始,一直到end结束,中的字符串,左闭右开,能取到begin到end-1的值 */ System.out.println(str1.substring(0));//输出:Hello System.out.println(str1.substring(1,4));//输出:ell,左闭右开[1,4)
4.字符串转换方法:?
? ? ? ? public char[] toCharArray():将字符串转换成字符数组。
????????public byte[] getBytes():将字符串转换成字节数组。
????????public String replace(CharSequence oldString,CharSequence newString):将字符串中的oldString替换成newString。
String str1 = "Hello World!"; /** * 字符串转换方法 * toCharArray():将当前字符串拆分成为字符数组作为返回值 * getBytes():获取当前字符串底层的字节数组 * replace(CharSequence oldString,CharSequence newString):将所有出现的老字符串替换成为新的字符串,返回替换之后的结果新数组 */ char[] cArray = str1.toCharArray(); System.out.println(cArray[0]);//输出:H,转换成数组后可以根据下标取单个字符 byte[] bArray = str1.getBytes(); System.out.println(bArray);//输出的是字节数组的地址值 System.out.println(str1.replace("World","Java"));//输出:Hello Java!
5.字符串分割方法:
????????public String[] split(String regex):根据regex将字符串分割成字符串数组。
String str1 = "张三,李四,王五"; /** * 字符串分割方法 * split(String regex):按照参数的规则,将字符串切分成为若干部分 */ String[] strArray = str1.split(","); //分割之后,可以根据下标单独取每一个值 System.out.println(strArray[0]);//输出:张三 System.out.println(strArray[1]);//输出:李四 System.out.println(strArray[2]);//输出:王五
1.1.5 注意事项
- 任何对象都能用Object接收。
- equals方法具有对称性,也就是a.equals(b)和b.equals(a)效果一样,前提是两个值都不为null。如果第一个值为null,会引发空指针异常。所以如果比较的是一个常量和一个变量,推荐把常量字符写在前面,能避免报错。
- split方法的参数其实是一个“正则表达式”,今后学习;如果匹配英文句点“.”,必须写“\\.”(两个反斜杠)。
1.2 StringBuilder类
1.2.1 概述
????????java.lang.StringBuilder类:字符串缓冲区,可以提高字符串的效率(看成一个长度可以变化的字符串)。底层也是一个数组,但是没有被final修饰,可以改变其长度,在内存中始终是一个数组,占用空间少,效率高。如果超出StringBuilder的容量,会自动的扩容。
1.2.2 常用方法
????????StringBuilder类提供了多个方法来处理字符串,包括添加字符、插入字符、删除字符、反转字符串等。它还提供了与字符串相关的方法,如获取字符串长度、获取指定位置的字符等。还有StringBuilder和String之间的相互转换。这里只列出一些较为常见的方法,其他的根据需求查找API文档即可。
构造方法:
????????public StringBuilder():构造一个空的StringBuilder容器。
????????public StringBuilder(String str):构造一个StringBuilder容器,并将字符串添加进去。????????
成员方法:
????????public StringBuilder append(Object obj):添加任何类型数据的字符串形式(提供多种类型的重载方法),并返回当前对象自身。
????????public StringBuilder delete(int start, int end):删除[start,end)索引处的数据
????????public StringBuilder insert(int offset, String str):在offset索引处插入字符串
????????public StringBuilder replace(int start, int end, String str):将[start,end)索引处的数据替换成新的str
????????public char charAt(int index):获取指定索引处的单个字符
????????public int indexOf(String str):获取str第一次出现的位置
????????public int lastIndexOf(String str):获取str最后一次出现的位置
????????public int length():获取字符串的长度
????????public StringBuilder reverse():反转字符串内容
????????public String toString():将缓冲区内容转换为字符串
1.3 StringBuffer类
1.3.1 概述
????????StringBuffer类:是Java中的一个可变字符串类,它允许字符串的内容进行修改,而不需要创建新的字符串对象。它是线程安全的,可以在多线程环境下使用。
1.3.2 常用方法
????????和StringBuilder使用类似,两个类中都存在相似的方法。下面提供StringBuffer常用方法的练习。把下面代码中的StringBuffer都替换成StringBuilder,也都能够正常执行。
源代码:
package com.zhy.util;
public class TestString {
public static void main(String[] args) {
String str = "Hello ";
//String 转换成 StringBuffer:使用StringBuffer的构造方法
StringBuffer buffer = new StringBuffer(str);
System.out.println("初始化字符串:" + buffer);
//常用方法
//1.在最后追加数据
buffer.append("World");
System.out.println("在末尾追加数据:" + buffer);
//2.删除指定索引处的数据,左闭右开,第一个索引=0;例如:删除[7-11)之间的字符,取不到11
buffer.delete(7,11);
System.out.println("删除索引[7-11)之间的数据:" + buffer);
//3.在指定索引处插入数据,第一个索引=0;例如:在索引7的位置插入Java,就是放在索引1的后面。
buffer.insert(7,"Java");
System.out.println("在索引7的位置插入数据:" + buffer);
//4.替换指定索引处的数据
buffer.replace(7,11,"orld");
System.out.println("替换索引[7-11)的数据:" + buffer);
//5.获取指定索引处的单个字符
char c = buffer.charAt(10);
System.out.println("获取索引10的数据:" + c);
//6.获取指定字符串第一次出现的位置
int i = buffer.indexOf("l");
System.out.println("获取l第一次出现的位置:" + i);
//7.获取指定字符最后一次出现的位置
int i2 = buffer.lastIndexOf("l");
System.out.println("获取l最后一次出现的位置:" + i2);
//8.获取字符串的长度
int i3 = buffer.length();
System.out.println("字符串的长度为:" + i3);
//9.反转数据
buffer.reverse();
System.out.println("反转数据:" + buffer);
//StringBuffer 转换成 String:使用StringBuffer的toString方法
str = buffer.toString();
}
}
输出结果:
1.4 String和StringBuffer、StringBuilder类的异同点
相同点:
- String、StringBuffer、StringBuilder都可以表示字符串,可以进行字符串的操作。
不同点:
- String是不可变的,而StringBuffer和StringBuilder是可变的。
- String对象的操作会生成新的对象,而StringBuffer和StringBuilder对象的操作是在原对象的基础上进行的。
?总而言之,在需要频繁对字符串进行修改的情况下,推荐使用StringBuffer或StringBuilder,而不是String。
1.5 StringBuffer和StringBuilder类的异同点
相同点:
- 两者都是可变的字符串类,可以进行插入、删除和修改字符等操作。
- 两者都继承自AbstractStringBuilder类,具有相似的方法和属性。
不同点:?
- StringBuffer类是线程安全的,所有方法都是同步的,因此适合在多线程环境中使用。而StringBuilder类没有同步的方法,非线程安全,因此在单线程环境中的性能比StringBuffer类更高。
- StringBuffer类的方法通常比StringBuilder类的方法慢,因为它需要进行同步操作来保证线程安全。
- StringBuilder类在JDK 1.5中引入,因此在较旧的Java版本中可能不可用。而StringBuffer类则可以在所有的Java版本中使用。
总而言之,如果需要在多线程环境中进行字符串操作,应该使用StringBuffer类。如果在单线程环境中对字符串进行操作,应该使用StringBuilder类,因为它的性能更高。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!