IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> 【JavaSE系列】Java中的字符串之字符串常用方法与StringBuilder -> 正文阅读

[Java知识库]【JavaSE系列】Java中的字符串之字符串常用方法与StringBuilder

??前面的话??

本篇文章带大家认识Java基础知识——字符串类,在前面我们已经知道如何在Java中定义字符串和字符串常量池,本文将介绍Java字符串中的常用的方法以及StringBuilder。

📒博客主页:未见花闻的博客主页
🎉欢迎关注🔎点赞👍收藏??留言📝
📌本文由未见花闻原创,CSDN首发!
📆首发时间:🌴2021年12月3日🌴
??坚持和努力一定能换来诗与远方!
💭参考书籍:📚《Java核心技术》,📚《Java编程思想》,📚《Effective Java》
💬参考在线编程网站:🌐牛客网🌐力扣
博主的码云gitee,平常博主写的程序代码都在里面。
博主的github,平常博主写的程序代码都在里面。
🙏作者水平很有限,如果发现错误,一定要及时告知作者哦!感谢感谢!



0


1.字符,字节与字符串

1.1字符与字符串

序号方法名类型描述
1public String(char value[])构造方法将字符数组中所有的内容变成字符串
2public String(char value[], int offset, int count)构造方法将字符数组中的部分内容变成字符串 ,从索引offset开始,转换字符个数为count
3public char charAt(int index)普通方法取得指定索引位置的字符,索引从0开始
4public 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字节与字符串

序号方法名类型描述
5public String(byte bytes[])构造方法将字节数组中所有内容变成字符串
6public String(byte bytes[], int offset, int length)构造方法将字节数组中部分内容变为字符串
7public byte[] getBytes()普通方法将字符串转换成字节数组
8public 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字符串比较

序号方法名类型描述
9public boolean equals(Object anObject)普通方法判断字符串内容是否相等
10public boolean equalsIgnoreCase(String anotherString)普通方法忽略大小写,判断字符串是否相等
11public int compareTo(String anotherString)普通方法比较两个字符串大小
12public 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() compareTo()是一个可以区分大小关系的方法,是String方法里是一个非常重要的方法。
字符串的比较大小规则, 总结成三个字 “字典序” 相当于判定两个字符串在一本词典的前面还是后面. 先比较字符串长度,如果相同再比较第一个字符的大小(根据 unicode 的值来判定), 如果不分胜负, 就依次比较后面的内容。

2.2字符串查找

序号方法名类型描述
13public boolean contains(CharSequence s)普通方法判断一个字符串中是否包含子串
14public int indexOf(String str)
public int indexOf(int ch)
普通方法从头开始查找指定字符串(字符)在字符串中的位置,查到了返回指定位置的开始索引,没有查找到返回-1
15public int indexOf(String str, int fromIndex)
public int indexOf(int ch, int fromIndex)
普通方法从指定索引位置开始查找指定字符串(字符在字符串中的位置,查到了返回指定位置的开始索引,没有查找到返回-1
16public int lastIndexOf(String str)
public int lastIndexOf(int ch)
普通方法从后向前查找指定字符串(字符)的位置
17public int lastIndexOf(String str, int fromIndex)
public int indexOf(int ch, int fromIndex)
普通方法从指定位置由后向前查找指定字符串(字符)位置
18public boolean startsWith(String prefix)普通方法判断字符串是否以指定字符串开头
19public boolean startsWith(String prefix, int toffset)普通方法判断指定位置字符串是否以指定字符串开头
20public 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字符串替换

序号方法名类型描述
21public String replaceAll(String regex, String replacement)
public String replace(CharSequence target, CharSequence replacement)
普通方法替换字符串中所有指定的内容
22public 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字符串拆分

序号方法名类型描述
23public String[] split(String regex)普通方法以指定字符串为标记将字符串全部拆分
24public 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字符串截取

序号方法名类型描述
25public String substring(int beginIndex)普通方法从指定位置截取字符串到结尾
26public 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字符串其他常用的操作方法

序号方法名类型描述
27public String trim()普通方法去除字符串左右两边的空格,保留字符串中间的空格
28public String toLowerCase()普通方法将字符串中所有的字母转成小写
29public String toUpperCase()普通方法将字符串中所有的字母转成大写
30public native String intern()普通方法字符串手动入池
31public String concat(String str)普通方法字符串拼接,相当于“+”,不会自动入池
32public int length()普通方法获取字符串长度
33public 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 String S t r i n g B u i l d e r StringBuilder StringBuilder有两种方法:

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

相反 S t r i n g B u i l d e r StringBuilder StringBuilder S t r i n g String String可以调用 S t r i n g B u i l d e r StringBuilder StringBuilder t o S t r i n g toString 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两个字符串是否相等。思考∶若忽略大小写则如何实现比较?

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


本篇文章就到这了,下一篇文章将介绍Java中异常的用法。
觉得文章写得不错的老铁们,点赞评论关注走一波!谢谢啦!

1-99

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-12-04 13:15:32  更:2021-12-04 13:15:44 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 3:19:34-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码