Java中的字符串之字符串常用方法与StringBuilder

举报
未见花闻 发表于 2022/05/31 17:38:30 2022/05/31
【摘要】 本篇文章带大家认识Java基础知识——字符串类,在前面我们已经知道如何在Java中定义字符串和字符串常量池,本文将介绍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-1

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-8gbk等,除了这一点,还要注意使用该方法需要添加异常。
1-2

怎么添加呢?点击带红色波浪线的方法名,Alt + 回车,会出现一个弹窗:
1-3

选择第一个回车就可以了。(注:这是编译器IDEA的操作方法,还可以直接在代码最前面导入:import java.io.UnsupportedEncodingException;并在main方法后添加throws UnsupportedEncodingException)
1-4
最后一个方法会根据提供的编码格式,编码成不同的字节数组,utf-8gbk在编码英文字符是一样的,除英文字符外,编码就不相同了。

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
    }
}

1-5

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"));
    }
}

1-6
c o m p a r e T o ( ) compareTo() 是一个可以区分大小关系的方法,是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
    }
}

1-7

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
    }
}

1-8

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型的参数。
1-9

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);
    }
}

1-10
由于字符串是不可变对象, 替换不修改当前字符串, 而是产生一个新的字符串。

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("\\\\")));//由于\是特殊字符需要\\\\才能表示一个普通的\
    }
}

1-11

注意事项:

  1. 字符"|","*","+“都得加上转义字符,前面加上”".
  2. 而如果是"\",那么就得写成"\\\\".
  3. 如果一个字符串中有多个分隔符,可以用"|"作为连字符.

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));
    }
}

1-12

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());
    }
}

1-13

3.StringBuilder 与 StringBuffer

3.1StringBuilder 与 StringBuffer的区别

任何字符串常量都是String类,该类的对象内容是不可以修改的,为了方便字符串的修改,Java提供了StringBuilder和StringBuffer,这两个类与String类是不相同的,也没有继承关系,所以String类引用是不能接收StringBuilder和StringBuffer对象的,同理StringBuilder和StringBuffer引用也不能接收String类对象。

对于StringBuilder和StringBuffer两者大同小异,前者未同步处理,适合在单线程下使用,后者采用线程同步,适合在多线程下使用。这一点在源码上有体现:
2-1
2-2
在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);
    }
}

2-3
2-4
这也就是说使用+号拼接字符串,需要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);
    }
}

2-5

2-6

通过反编译,上述代码相当于:

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);
    }
}

2-7

每进入一次循环,都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);
    }
}

将程序优化后,只产生了一个新对象,程序的开销大大减少。
2-8

String和StringBuffer最大的区别在于: String的内容无法修改,而StringBuffer的内容可以修改。频繁修改字符串的情况考虑使用StingBuffer。

3.3StringBuilder相比String特有的方法

我们先来从源码上入手,StringBuilder本质上也是一个字符数组,但是它的权限是包访问(默认)权限,没有final关键字修饰,证明了StringBuilder类是可变的。
S t r i n g String S t r i n g B u i l d e r StringBuilder 有两种方法:

  1. 使用带参数的 S t r i n g B u i l d e r StringBuilder 的构造方法,将字符串作为参数。
  2. 调用 S t r i n g B u i l d e r StringBuilder a p p e n d append 方法。

相反 S t r i n g B u i l d e r StringBuilder S t r i n g String 可以调用 S t r i n g B u i l d e r StringBuilder t o S t r i n g toString 方法。
2-9
2-10
2-11

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());
    }
}

2-12

4.留给读者的练习

最近有同学问了我一道相关字符串的习题,现将这道习题分享给大家,以巩固相关字符串的知识:

从键盘中输入一个字符串,如果输入的字符串中有除了数字、字母以外的其他符号,则输出提示信息"输入的数据不符合条件,请重新输入新的字符串!",直至输入符合的字符串。如果满足条件,输入提示信息"输入的数据符合条件",并实现如下功能∶
1、将所有字符数字保存到字符串s1中并输出,统计出字符数字的个数。
2、将所有字母保存到字符串s2中并输出,统计出字母的个数。
3、使用concat()方法将字符串s2拼接到字符串s1后形成新的字符串s3,并输出。
4、使用substring()方法截取子串,子串保存到字符串s4。
5、使用toLowerCase()方法将字符串s3中所有大写字符转换为小写,保存到字符串s5。
6、使用equals()方法比较s3和s5两个字符串是否相等。思考∶若忽略大小写则如何实现比较?

如果不太会做或想知道博主怎么做的可以联系博主并与博主交流。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。