【JAVA语言-第11话】API中的工具类 之 String,StringBuilder,StringBuffer的详细解析与异同点

本文详细介绍了Java中的String、StringBuilder和StringBuffer类,包括它们的概述、创建方式、常用方法以及异同点,特别强调了String的不可变性和StringBuilder/StringBuffer的可变性及其在多线程环境下的选择建议。
摘要由CSDN通过智能技术生成

目录

字符串

1.1 String类

1.1.1 概述

1.1.2 字符串的特点

1.1.3 创建字符串的方式

1.1.4 字符串的常用方法

1.1.5 注意事项

1.2 StringBuilder类

1.2.1 概述

1.2.2 常用方法

1.3 StringBuffer类

1.3.1 概述

1.3.2 常用方法

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类,因为它的性能更高。

  • 29
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值