【Java数据类型】“字符串”全解之“StringBuffer类和StringBuilder类”

在上一篇讲解字符串类String的文章中:

点击查看:【Java数据类型】“字符串”全解之“String类”

详解了String类对于字符串的构造方法功能API基本数据类型与String类的转换,对Java语言中对于字符串的理解和使用有一定的认识与理解,在这篇文章中,我将继续阐述其他两种字符串相关类:StringBuffer和StringBuilder。

文章目录

  • StringBuffer
    • 方法API
      • 增、追加(append)
      • 增、插入(insert)
      • 删(delete)
      • 改(setCharAt)
      • 反转(reverse)
    • String与StringBuffer互转
  • StringBuilder
    • StringBuffer与StringBuilder的异同
    • 方法API
      • 容量与大小
    • String与StringBuilder互转
  • 字符串类的使用原则
  • Java字符串训练题集

StringBuffer

StringBuffer字符串的核心特性:

  • 注重字符串的不断改变;
  • 不产生新对象,在同一内存空间中存储字符串的修改(StringBuffer或StringBuilder)。

方法API

概览:

append:连接串;
insert:插入
delete:删
setCharAt:改某一个位置字符
reverse:反转
trimToSize:缩减空间

增、追加(append)

根据API,可以追加所有的基本数据类型的数据到一个串中去;
方法原型: public StringBuffer append(数据类型x);

//append()方法使用示例
public class Main {
	public static void main(String[] args) {
		StringBuffer s = new StringBuffer("abc");
		boolean a = true;
		s.append(a); //在字符串后追加一个布尔类型
		System.out.println(s); //abctrue
		
		int b = 666;
		s.append(b); //在字符串后追加一个int类型
		System.out.println(s);//abctrue666
		
		double c = 99.9;
		s.append(c); //在字符串后追加一个double类型
		System.out.println(s); //abctrue66699.9
	}
}

增、插入(insert)

方法原型: public StringBuffer insert(int offset, 数据类型 x); 其中,offset是位置,x是要插入的数据

//insert方法使用示例
import java.lang.StringBuffer;

public class Main {
    public static void main(String[] args) {
        StringBuffer sb1 = new StringBuffer("abc");
        sb1.insert(1,"123"); //在原本串的下标为1的位置插入字符串;
        System.out.println(sb1); //输出:a123bc

        StringBuffer sb2 = new StringBuffer("abc");
        sb2.insert(1,3.14159); //在原本串的下标为1的位置插入一个double类型的数;
        System.out.println(sb2); //输出:a3.14159bc
        //insert方法可以插入所有数据类型的值;
    }
}

删(delete)

方法原型:

  • public StringBuffer deleteCharAt(int index); 其中方法参数只能是int型的整数;
  • public StringBuffer delete(int start,int end);
public class Main {
	public static void main(String[] args) {
		StringBuffer sb = new StringBuffer("hello,world.");
		StringBuffer sb2 = sb.deleteCharAt(1);
		System.out.println("sb2 = " + sb2); //sb2 = hllo,world.
		
		StringBuffer sb3 = sb.delete(0,3); //从0开始,向后删三个
		System.out.println("sb3 = " + sb3); //sb3 = o,world.
	}
}

改(setCharAt)

setCharAt方法: 仅修改一个位置的一个字符
方法原型: public void setCharAt(int index, char ch);
方法功能: 该方法的作用是修改对象中索引值为index位置的字符为新的字符ch。


public class Main {
    public static void main(String args[]) {
        StringBuffer sb = new StringBuffer("abc");
        sb.setCharAt(1,'x'); //该表原本下标为1的字符;
        System.out.println(sb); //输出:axc

        sb.reverse();
        System.out.println(sb); //输出:cxa
    }
}

反转(reverse)

方法原型: public StringBuffer reverse();
功能: 将StringBuffer对象中的内容反转,然后形成新的字符串。

public class Main {
    public static void main(String args[]) {
        StringBuffer sb = new StringBuffer("abc");
        StringBuffer sb2 = sb.reverse();
        System.out.println("reverse: " + sb2); //reverse: cba
    }
}

String与StringBuffer互转

需要注意的是,StringBuffer和String属于不同的类型,也不能直接进行强制类型转换,下面的代码都是错误的:

StringBuffer s = "abc"; //赋值类型不匹配
StringBuffer s = (StringBuffer)"abc"; //不存在继承关系,无法进行强转
//String和StringBuffer的转化(正确方法)
public class Main {
    public static void main(String[] args) {
        //StringBuffer对象和String对象之间的互转的代码如下:
        String s = "abc";
        StringBuffer sb1 = new StringBuffer("123");
        StringBuffer sb2 = new StringBuffer(s); //String转换为StringBuffer
        String s1 = sb1.toString(); //StringBuffer转换为String
    }
}

StringBuilder

StringBuilder诞生的背景:

  • String的“+”运算或者说是拼接运算,非常浪费空间和时间,会产生很多临时垃圾;
  • 因为每次拼接都会构建一个新的String对象。
    【Java数据类型】“字符串”全解之“StringBuffer类和StringBuilder类”_第1张图片
    注:图片来自“黑马程序员”相关课程笔记。

StringBuffer与StringBuilder的异同

相同点:
1. 两个类都是字符串缓冲类。其内容都是可变的。
2. 两个类的方法都是一致的。
不同点:
1. StringBuffer是多线程安全的(加了锁),操作效率低 ,StringBuilder是线程非安全的(没加锁),操作效率高。
2. StringBuffer是jdk1.0出现 的,StringBuilder 是jdk1.5的时候出现的。

推荐使用: StringBuilder,因为操作效率高。

方法API

概览:
 capacity:当前容量
 length:当前长度
 append:追加
 reverse:反转

容量与大小

方法原型:

  • public int capacity(): 返回当前容量
  • public int length(): 返回长度(字符数)
public class StringBuilderDemo {
	public static void main(String[] args) {
		//创建对象
		StringBuilder sb = new StringBuilder();
		System.out.println("sb:"+sb);
		System.out.println("sb.capacity():"+sb.capacity()); //容量,输出:16
		System.out.println("sb.length():"+sb.length()); //当前大小,输出:0
	}
}

追加: public StringBuilder append(任意类型)


public class StringBuilderDemo {
	public static void main(String[] args) {
		//创建对象
		StringBuilder sb = new StringBuilder();
		/*
		sb.append("hello");
		sb.append("world");
		sb.append(true);
		sb.append(100);
		*/
		
		//链式编程
		sb.append("hello").append("world").append(true).append(100);
		
		System.out.println("sb:"+sb);
	}
}

String与StringBuilder互转

StringBuilder – String:
public String toString(): 通过toString()就可以实现把StringBuilder转成String

String – StringBuilder:
StringBuilder(String str): 通过构造方法就可以实现把String转成StringBuilder

public class StringBuilderTest {
	public static void main(String[] args) {
		//StringBuilder 转换为 String
		StringBuilder sb = new StringBuilder();
		sb.append("hello").append("world");
		
		String s = sb.toString();
		System.out.println(s);
		
		//String 转换为 StringBuilder
		String s = "helloworld";
		StringBuilder sb = new StringBuilder(s);
		System.out.println(sb);
	}
}

字符串类的使用原则

  • String使用原则
    适用于少量的字符串操作;
  • StringBuffer的使用原则
    适用多线程下在字符缓冲区进行大量操作的情况;
    要求线程安全的情况下;
  • StringBuilder使用原则
    适用于单线程下在字符缓冲区进行大量操作的情况;
    对线程安全不作要求;

Java字符串训练题集

请访问我的GitHub仓库,或直接点击:https://github.com/Kyle-Shawe/JavaSE-Study-Notes,进入“数据类型以及关系”文件夹中。


你可能感兴趣的:(#,JavaSE,java,字符串,StringBuffer,StringBuilder)