java常用类之String、StringBuffer、StringBuilder

Java常用类之String、StringBuffer、StringBuilder

String类

  • String类对象代表不可变的Unicode字符序列,因此我们可以将String对象称为“不可变对象”。那什么叫做“不可变对象”呢?指的是对象内部的成员变量的值无法再改变。我们打开String类的源码:

    /** The value is used for character storage. */
        private final char value[];
    

    我们发现字符串内容全部存储到value[]数组中,而变量value是final类型的,也就是常量(即只能被赋值一次)。这就是“不可变对象”的典型定义方式。

    String的某些方法,比如: substring()是对字符串的截取操作,但本质是读取原字符串生成了新的字符串。我们可以对此进行测试:

        String str5 = "abcdefg";
        String str6 = str5.substring(3,6);
        System.out.println("str5: " + str5 + " str5 hashCode: " + Integer.toHexString(str5.hashCode()));
        System.out.println("str6: " + str6 + " str6 hashCode: " + Integer.toHexString(str6.hashCode()));
    

    同理,replace()方法也会产生同样的效果:

    	String str5 = "abcdefg";        
    	String str7 =  str5.replace('c', 'r');
        System.out.println("str5: " + str5 + " str5 hashCode: " + Integer.toHexString(str5.hashCode()));
        System.out.println("str7: " + str7 + " str7 hashCode: " + Integer.toHexString(str7.hashCode()));
    

    更多String的常用方法,可以查看String类的API或者String类的源码;帮助文档

//String类部分方法案例 
public class Stringtest {
    public static void main(String[] args) {
        String str = "ni hao java, HelloWorld";
        System.out.println(str.length());//获取字符串长度
        System.out.println(str.hashCode());//获取字符串hashcode编码
        System.out.println(str.toString());//返回此对象本身

        String str1 = " wo shi dui zi fu";
        System.out.println(str.equals(str1));//将此字符串与指定的对象比较。
        System.out.println(str1.trim());//trim:返回字符串的副本,忽略前导空白和尾部空白。
        
        String[] str1a = str1.split(" ");//split:根据给定正则表达式的匹配拆分此字符串。(这里用的空格拆分str1)
        for (int i = 0; i < str1a.length; i++) {
            System.out.println(str1a[i]);
        }
    }
}

二、StringBuffer与StringBuilder

  • StringBuffer类:StringBuffer类也是用于处理字符串。而且,StringBuffer 类是可变字符串类,创建 StringBuffer 类的对象后可以随意修改字符串的内容。每个 StringBuffer 类的对象都能够存储指定容量的字符串,如果字符串的长度超过了 StringBuffer 类对象的容量,则该对象的容量会自动扩大。JDK1.0加入。
  • StringBuilder类:功能与实现与StringBuffer类基本相同。JDK1.5加入。
  • 二者的区别:StringBuffer多线程数据量大,且安全,但是效率低;而StringBuilder单线程数据量大,且效率高,但不安全。
//StringBuffer的append方法案例
public class StringBufferAndStringBuildertest {
    public static void main(String[] args) {
        StringBuffer str = new StringBuffer("abc");
        //append:向原有的StringBuffer对象中追加字符串到末尾
        System.out.println(str.append("d"));//结果为abcd
        System.out.println(str.append("ef"));//结果为abcdef
    }
}

//StringBuilder的append方法案例
public class StringBufferAndStringBuildertest {
    public static void main(String[] args) {
        StringBuilder s = new StringBuilder("aacd");
        //append:向原有的StringBuilder对象中追加字符串到末尾
        System.out.println(s.append("aa"));//结果为aacdaa
        //reverse:将字符串翻转
        System.out.println(s.reverse());//结果为aaddcaa
    }
}

更多方法查看帮助文档

  • String,StringBuffer,StringBuilder的区别:

    String:String 是 Java 中基础且重要的类,被声明为 final class,是不可变字符串。因为它的不可变性,所以拼接字符串时候会产生很多无用的中间对象,如果频繁的进行这样的操作对性能有所影响。


    StringBuffer 是为了解决大量拼接字符串时产生很多中间对象问题而提供的一个类。它提供了 append 方法,可以将字符串添加到已有序列的末尾或指定位置,它的本质是一个线程安全的可修改的字符序列。


    StringBuilder的出现是因为很多情况下我们的字符串拼接操作不需要线程安全。StringBuilder 是 JDK1.5 发布的,它和 StringBuffer 本质上没什么区别,就是去掉了保证线程安全的那部分,减少了开销。


    String,StringBuffer,StringBuilder的实现过程不同,如下图:

    实现方法


  • 一般的使用规则:

    当我们操作少量数据时使用String,单线程操作大量数据是使用StringBuilder,多线程操作大量数据时StringBuilder。

posted @ 2022-01-20 20:49  Devin-Y  阅读(36)  评论(0)    收藏  举报