Java中的字符串之字符串常用方法与StringBuilder
⭐️前面的话⭐️
本篇文章带大家认识Java基础知识——字符串类,在前面我们已经知道如何在Java中定义字符串和字符串常量池,本文将介绍Java字符串中的常用的方法以及StringBuilder。
📒博客主页:未见花闻的博客主页
🎉欢迎关注🔎点赞👍收藏⭐️留言📝
📌本文由未见花闻原创!
📆华为云首发时间:🌴2022年5月31日🌴
✉️坚持和努力一定能换来诗与远方!
💭参考书籍:📚《Java核心技术卷1》,📚《数据结构》,📚《Java编程思想》
💬参考在线编程网站:🌐牛客网🌐力扣
博主的码云gitee,平常博主写的程序代码都在里面。
博主的github,平常博主写的程序代码都在里面。
🍭作者水平很有限,如果发现错误,一定要及时告知作者哦!感谢感谢!
1.字符,字节与字符串
1.1字符与字符串
序号 | 方法名 | 类型 | 描述 |
---|---|---|---|
1 | public String(char value[]) | 构造方法 | 将字符数组中所有的内容变成字符串 |
2 | public String(char value[], int offset, int count) | 构造方法 | 将字符数组中的部分内容变成字符串 ,从索引offset开始,转换字符个数为count |
3 | public char charAt(int index) | 普通方法 | 取得指定索引位置的字符,索引从0开始 |
4 | public char[] toCharArray() | 普通方法 | 将字符串转换成字符数组 |
import java.util.Arrays;
public class Test5 {
public static void main(String[] args) {
char[] chArr = {'a', 'b', 'c', 'd', 'e'};
String str1 = new String(chArr);
System.out.println(str1);
String str2 = new String(chArr, 2,2);
System.out.println(str2);
System.out.println(str1.charAt(3));
char[] arr = str1.toCharArray();
System.out.println(Arrays.toString(arr));
}
}
1.2字节与字符串
序号 | 方法名 | 类型 | 描述 |
---|---|---|---|
5 | public String(byte bytes[]) | 构造方法 | 将字节数组中所有内容变成字符串 |
6 | public String(byte bytes[], int offset, int length) | 构造方法 | 将字节数组中部分内容变为字符串 |
7 | public byte[] getBytes() | 普通方法 | 将字符串转换成字节数组 |
8 | public byte[] getBytes(String charsetName) throws UnsupportedEncodingException | 普通方法 | 编码转换处理 |
这四个方法要注意最后一个方法,参数charsetName
只的是编码格式,常见的编码格式有utf-8
,gbk
等,除了这一点,还要注意使用该方法需要添加异常。
怎么添加呢?点击带红色波浪线的方法名,Alt + 回车
,会出现一个弹窗:
选择第一个回车就可以了。(注:这是编译器IDEA的操作方法,还可以直接在代码最前面导入:import java.io.UnsupportedEncodingException;并在main方法后添加throws UnsupportedEncodingException)
最后一个方法会根据提供的编码格式,编码成不同的字节数组,utf-8
和gbk
在编码英文字符是一样的,除英文字符外,编码就不相同了。
import java.io.UnsupportedEncodingException;
import java.util.Arrays;
public class Test6 {
public static void main(String[] args) throws UnsupportedEncodingException {
byte[] bytes = {97,98,99,100,101,102,103};
String str1 = new String(bytes);
System.out.println(str1);
String str2 = new String(bytes, 2, 3);
System.out.println(str2);
byte[] arr = str1.getBytes();
System.out.println(Arrays.toString(arr));
String str3 = "wjhw";
String str4 = "未见花闻";
System.out.println(Arrays.toString(str3.getBytes("utf-8")));//全英文字符串转字节编码,utf-8
System.out.println(Arrays.toString(str3.getBytes("gbk")));//全英文字符串转字节编码,gbk
System.out.println(Arrays.toString(str4.getBytes("utf-8")));//全中文字符串转字节编码,utf-8
System.out.println(Arrays.toString(str4.getBytes("gbk")));//全英中文符串转字节编码,gbk
}
}
2.字符串的基本操作与方法
2.1字符串比较
序号 | 方法名 | 类型 | 描述 |
---|---|---|---|
9 | public boolean equals(Object anObject) | 普通方法 | 判断字符串内容是否相等 |
10 | public boolean equalsIgnoreCase(String anotherString) | 普通方法 | 忽略大小写,判断字符串是否相等 |
11 | public int compareTo(String anotherString) | 普通方法 | 比较两个字符串大小 |
12 | public int compareToIgnoreCase(String str) | 普通方法 | 忽略大小写,比较两个字符串大小 |
public class Test7 {
public static void main(String[] args) {
String str1 = "abcdef";
String str2 = "aBcDEf";
System.out.println(str1.equals("abcdef"));//true
System.out.println(str1.equals("abef"));
System.out.println("============");
System.out.println(str1.equals(str2));//false
System.out.println(str1.equalsIgnoreCase(str2));//true
System.out.println("============");
String str3 = "ca68";
System.out.println(str3.compareTo("ca68"));
System.out.println(str3.compareTo("da68"));
System.out.println(str3.compareTo("ca67"));
System.out.println(str3.compareTo("ca688"));
System.out.println(str3.compareTo("ca6"));
System.out.println(str3.compareToIgnoreCase("CA68"));
}
}
是一个可以区分大小关系的方法,是String方法里是一个非常重要的方法。
字符串的比较大小规则, 总结成三个字 “字典序” 相当于判定两个字符串在一本词典的前面还是后面. 先比较字符串长度,如果相同再比较第一个字符的大小(根据 unicode 的值来判定), 如果不分胜负, 就依次比较后面的内容。
2.2字符串查找
序号 | 方法名 | 类型 | 描述 |
---|---|---|---|
13 | public boolean contains(CharSequence s) | 普通方法 | 判断一个字符串中是否包含子串 |
14 | public int indexOf(String str) public int indexOf(int ch) |
普通方法 | 从头开始查找指定字符串(字符)在字符串中的位置,查到了返回指定位置的开始索引,没有查找到返回-1 |
15 | public int indexOf(String str, int fromIndex) public int indexOf(int ch, int fromIndex) |
普通方法 | 从指定索引位置开始查找指定字符串(字符在字符串中的位置,查到了返回指定位置的开始索引,没有查找到返回-1 |
16 | public int lastIndexOf(String str) public int lastIndexOf(int ch) |
普通方法 | 从后向前查找指定字符串(字符)的位置 |
17 | public int lastIndexOf(String str, int fromIndex) public int indexOf(int ch, int fromIndex) |
普通方法 | 从指定位置由后向前查找指定字符串(字符)位置 |
18 | public boolean startsWith(String prefix) | 普通方法 | 判断字符串是否以指定字符串开头 |
19 | public boolean startsWith(String prefix, int toffset) | 普通方法 | 判断指定位置字符串是否以指定字符串开头 |
20 | public boolean endsWith(String suffix) | 普通方法 | 判断是否以指定字符串结尾 |
public class Test8 {
public static void main(String[] args) {
String str1 = "weijianhuawen";
System.out.println(str1.contains("wei"));//true
System.out.println(str1.contains("weihua"));//false
System.out.println("============");
System.out.println(str1.indexOf("jian"));//3
System.out.println(str1.indexOf("hua"));//7
System.out.println(str1.indexOf("wjhw"));//-1
System.out.println(str1.indexOf('e'));//1
System.out.println(str1.indexOf('u'));//8
System.out.println("=============");
System.out.println(str1.indexOf("hua", 7));//7
System.out.println(str1.indexOf("jian", 7));//-1
System.out.println(str1.indexOf('e', 1));//1
}
}
public class Test9 {
public static void main(String[] args) {
String str2 = "shiyuyuanfang";
System.out.println(str2.lastIndexOf("yuan"));//5
System.out.println(str2.lastIndexOf('a'));//10
System.out.println(str2.lastIndexOf("yu", 5));//5
System.out.println(str2.indexOf('a', 8));//10
System.out.println("============");
System.out.println(str2.startsWith("shi"));//true
System.out.println(str2.startsWith("yuan"));//false
System.out.println(str2.startsWith("yuan", 5));//true
System.out.println(str2.endsWith("fang"));//true
System.out.println(str2.endsWith("yuan"));//false
}
}
2.3字符串替换
序号 | 方法名 | 类型 | 描述 |
---|---|---|---|
21 | public String replaceAll(String regex, String replacement) public String replace(CharSequence target, CharSequence replacement) |
普通方法 | 替换字符串中所有指定的内容 |
22 | public String replaceFirst(String regex, String replacement) | 普通方法 | 替换字符串中第一次出现的指定内容 |
String类实现了CharSequence接口,所以使用public String replace(CharSequence target, CharSequence replacement) 方法也能接受String型的参数。
public class Test10 {
public static void main(String[] args) {
String str = "Wisdom comes from diligence, and greatness comes from the ordinary";
System.out.println(str.replaceAll("from", "源于"));//得到的一个新对象,不会修改源字符串内容
System.out.println(str);
System.out.println(str.replace("from", "源于"));//得到的一个新对象,不会修改源字符串内容
System.out.println(str);
System.out.println(str.replaceFirst("from", "源于"));//得到的一个新对象,不会修改源字符串内容
System.out.println(str);
}
}
由于字符串是不可变对象, 替换不修改当前字符串, 而是产生一个新的字符串。
2.4字符串拆分
序号 | 方法名 | 类型 | 描述 |
---|---|---|---|
23 | public String[] split(String regex) | 普通方法 | 以指定字符串为标记将字符串全部拆分 |
24 | public String[] split(String regex, int limit) | 普通方法 | 以指定字符串为标记将字符串部分拆分,其中limit为新生成字符串数组的最大长度 |
import java.util.Arrays;
public class Test11 {
public static void main(String[] args) {
String str = "my email is weijianhuawen@163.com";
String[] arr1 = str.split(" ");
System.out.println(Arrays.toString(arr1));
String[] arr2 = str.split("@");
System.out.println(Arrays.toString(arr2));
String[] arr3 = str.split(" |@|\\.");//有多个分隔符,可以使用|链接
System.out.println(Arrays.toString(arr3));
String[] arr4 = str.split("");
System.out.println(Arrays.toString(arr4));//没有分隔符,将字符串全部分开
//多个分隔符分割还可以以多次分割的形式分开
String[] res = str.split("@");
for (int i = 0; i < res.length; i++) {
String[] temp = res[i].split(" ");
for (int j = 0; j < temp.length; j++) {
System.out.print(temp[j] + " ");
}
}
System.out.println();
String[] arr5 = str.split(" ", 2);
System.out.println(Arrays.toString(arr5));
String[] arr6 = str.split(" ", 3);
System.out.println(Arrays.toString(arr6));
String[] arr7 = str.split(" ", 4);
System.out.println(Arrays.toString(arr7));
String[] arr8 = str.split(" ", 100);//如果数组限制数超过实际最大分割字符串的数组长度,将输出实际分割的长度最大的字符串数组
System.out.println(Arrays.toString(arr8));
String str2 = "djfj\\j\\p\\]a";
System.out.println(Arrays.toString(str2.split("\\\\")));//由于\是特殊字符需要\\\\才能表示一个普通的\
}
}
注意事项:
- 字符"|","*","+“都得加上转义字符,前面加上”".
- 而如果是"\",那么就得写成"\\\\".
- 如果一个字符串中有多个分隔符,可以用"|"作为连字符.
2.5字符串截取
序号 | 方法名 | 类型 | 描述 |
---|---|---|---|
25 | public String substring(int beginIndex) | 普通方法 | 从指定位置截取字符串到结尾 |
26 | public String substring(int beginIndex, int endIndex) | 普通方法 | 截取字符串指定区间的内容,左闭右开 |
public class Test12 {
public static void main(String[] args) {
String str = "weijianhuawen";
System.out.println(str.substring(3));
System.out.println(str.substring(7));
System.out.println(str.substring(0, 3));//左闭右开
System.out.println(str.substring(7, 10));
}
}
2.6字符串其他常用的操作方法
序号 | 方法名 | 类型 | 描述 |
---|---|---|---|
27 | public String trim() | 普通方法 | 去除字符串左右两边的空格,保留字符串中间的空格 |
28 | public String toLowerCase() | 普通方法 | 将字符串中所有的字母转成小写 |
29 | public String toUpperCase() | 普通方法 | 将字符串中所有的字母转成大写 |
30 | public native String intern() | 普通方法 | 字符串手动入池 |
31 | public String concat(String str) | 普通方法 | 字符串拼接,相当于“+”,不会自动入池 |
32 | public int length() | 普通方法 | 获取字符串长度 |
33 | public boolean isEmpty() | 普通方法 | 判断字符串是否是空字符串(不是null,而是长度为0的字符串) |
public class Test {
public static void main(String[] args) {
String str1 =" I hava a pen. ";
System.out.println(str1.trim());
System.out.println("============");
String str2 = "apple";
System.out.println(str2.toUpperCase());
System.out.println("============");
String str3 = "APP";
System.out.println(str3.toLowerCase());
System.out.println("============");
String str4 = "weijianhuawen";
System.out.println(str4.length());
System.out.println("============");
String str5 = "cs";
String str6 = "dn";
System.out.println(str5.concat(str6));
System.out.println("============");
String str7 = "";
System.out.println(str7.isEmpty());
}
}
3.StringBuilder 与 StringBuffer
3.1StringBuilder 与 StringBuffer的区别
任何字符串常量都是String类,该类的对象内容是不可以修改的,为了方便字符串的修改,Java提供了StringBuilder和StringBuffer,这两个类与String类是不相同的,也没有继承关系,所以String类引用是不能接收StringBuilder和StringBuffer对象的,同理StringBuilder和StringBuffer引用也不能接收String类对象。
对于StringBuilder和StringBuffer两者大同小异,前者未同步处理,适合在单线程下使用,后者采用线程同步,适合在多线程下使用。这一点在源码上有体现:
在StringBuffer中,区别与StringBuilder,每个方法前面有一个synchronized
修饰,该关键字表示线程同步,起到上锁解锁的作用,保证多线程安全。除了这一点,其他的方面StringBuilder 与 StringBuffer都是一样的,所以本文全部以StringBuilder为例,StringBuffer用法和StringBuilder一模一样。
3.2StringBuilder拼接字符串
在进行字符串的拼接的时候,由于字符串是不可变的,会先将Sting类转换成StringBuilder类,然后利用StringBuilder类的append
方法,将字符串拼接起来,这里的拼接不是形成一个新对象,而是在原有对象上修改,最后会自动将StringBuilder类的字符串通过toString
方法转换成String类,这时候得到的是一个新的字符串对象。
public class Test1 {
public static void main(String[] args) {
String str1 = "xue";
String str2 = "xi";
String str = str1 + str2;
System.out.println(str);
}
}
这也就是说使用+
号拼接字符串,需要new
对象,如果有很多的字符串或字符需要拼接,每一次拼接都需要new
一个StringBuilder对象和String对象,这样就会产生大量的对象,那程序的性能肯定会受到影响,而使用StringBuilder类的append
方法就能解决该问题,因为使用StringBuilder类的append
方法并不会产生新对象,减少了对象的产生,自然性能也得到了优化。
看下面一段代码,由于不断拼接,产生了多个新对象:
public class Test13 {
public static void main(String[] args) {
String str = "abc";
for (int i = 1; i <= 9; i++) {
str += i;
}
System.out.println(str);
}
}
通过反编译,上述代码相当于:
public class Test14 {
public static void main(String[] args) {
String str = "abc";
for (int i = 1; i <= 9; i++) {
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append(str);
stringBuilder.append(i);
str = stringBuilder.toString();
}
System.out.println(str);
}
}
每进入一次循环,都new了一个新对象。如果我们会自己使用StringBuilder类,可以将这个代码优化为:
public class Test15 {
public static void main(String[] args) {
String str = "abc";
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append(str);
for (int i = 1; i <= 9; i++) {
stringBuilder.append(i);
}
str = stringBuilder.toString();
System.out.println(str);
}
}
将程序优化后,只产生了一个新对象,程序的开销大大减少。
String和StringBuffer最大的区别在于: String的内容无法修改,而StringBuffer的内容可以修改。频繁修改字符串的情况考虑使用StingBuffer。
3.3StringBuilder相比String特有的方法
我们先来从源码上入手,StringBuilder本质上也是一个字符数组,但是它的权限是包访问(默认)权限,没有final
关键字修饰,证明了StringBuilder类是可变的。
将
转
有两种方法:
- 使用带参数的 的构造方法,将字符串作为参数。
- 调用 的 方法。
相反
转
可以调用
的
方法。
public class Test16 {
public static void main(String[] args) {
StringBuilder stringBuilder1 = new StringBuilder("weijianhuawen");
System.out.println(stringBuilder1.toString());
stringBuilder1.delete(7,10);//删除hua ,区间是左闭右开
System.out.println(stringBuilder1.toString());
System.out.println("============");
StringBuilder stringBuilder2 = new StringBuilder("nature");
System.out.println(stringBuilder2.toString());
stringBuilder2.insert(6,2021);//在最后插入2021
System.out.println(stringBuilder2.toString());
System.out.println("============");
StringBuilder stringBuilder3 = new StringBuilder("csdn");
System.out.println(stringBuilder3.toString());//逆序字符串
System.out.println(stringBuilder3.reverse().toString());
}
}
4.留给读者的练习
最近有同学问了我一道相关字符串的习题,现将这道习题分享给大家,以巩固相关字符串的知识:
从键盘中输入一个字符串,如果输入的字符串中有除了数字、字母以外的其他符号,则输出提示信息"输入的数据不符合条件,请重新输入新的字符串!",直至输入符合的字符串。如果满足条件,输入提示信息"输入的数据符合条件",并实现如下功能∶
1、将所有字符数字保存到字符串s1中并输出,统计出字符数字的个数。
2、将所有字母保存到字符串s2中并输出,统计出字母的个数。
3、使用concat()方法将字符串s2拼接到字符串s1后形成新的字符串s3,并输出。
4、使用substring()方法截取子串,子串保存到字符串s4。
5、使用toLowerCase()方法将字符串s3中所有大写字符转换为小写,保存到字符串s5。
6、使用equals()方法比较s3和s5两个字符串是否相等。思考∶若忽略大小写则如何实现比较?
如果不太会做或想知道博主怎么做的可以联系博主并与博主交流。
- 点赞
- 收藏
- 关注作者
评论(0)