Java常用类02 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类常用的方法:没有写参数列表,只是做了简单的介绍,具体用法可以查阅API手册或者翻阅源码。

    方法名 作用
    equals 将该字符串与指定对象的字符串值比较,区分大小写
    equalsIgnoreCase 与equals作用相同,但是不区分大小写
    indexOf 返回指定字符第一次出现的字符串内的索引,没有会返回-1
    lastIndexOf 返回指定子字符串最后一次出现的字符串中的索引,没有会返回-1
    length 返回字符串的长度
    replace 将就得字符替换为新字符
    split 按照给定规则将字符串分割成数组
    substring 根据给的规则生成一个子字符串
    startsWith 测试字符串是否已给定前缀开头
    trim 返回一个字符串,其值为此字符串,并删除任何前导和尾随空格

    ​ 仅仅展示了trim() ,split()等方法的简单使用场景,其他的方法可以自己尝试使用。

            String str = "  sdnja hu 7667 *^^   "; //原字符串
            System.out.println("Original string: " + str + " Original str length: " + str.length());
            String afterTrim = str.trim();  //删除了多余的空格,保留了有效的字符串部分
            System.out.println("After trim():" + afterTrim + " New String length: " + afterTrim.length());
            String[] arrStr = afterTrim.split(" ");//以空格分隔字符串,拆分为字符串数组
            for (int i = 0; i < arrStr.length; i++) { //打印字符串数组
                System.out.println(arrStr[i]);
            }
    
  • 一个小的String类练习:

    package konoha.commonClass.classString;
    
    import java.util.Scanner;
    
    /**
     * 使用String类的方法编写
     * 在作业提交系统中学生需要录入提交的 Java 文件名称及要提交到的邮箱地址,
     * 那么就需要对学生输入的这些信息进行校验,判断输入是否有误。校验的规则
     * 为:录入的文件名称必须以“.java”结尾,录入的邮箱地址中必须包含有“@”符
     * 号和“.”符号,且“@”在“.”之前。
     */
    
    public class HomeTest {
    
        public static void main(String[] args) {
    
            Scanner scanner = new Scanner(System.in);
    
            System.out.printf("Please enter your homework file name:");
            while (true) {
                String src =  scanner.nextLine();
                if (checkFormat(src, "Homework"))
                    break;
                else
                    System.out.printf("Please enter right homework file name:");
            }
    
            System.out.printf("Please enter the Email address: ");
            while (true) {
                String src =  scanner.nextLine();
                if (checkFormat(src, "Email"))
                    break;
                else
                    System.out.printf("Please enter right Email name:");
            }
    
            System.out.println("Successfully Update!");
            
            scanner.close();
        }
    
        /**
         * 用于检查格式的函数,会根据所给类型选择合适的检查函数
         * @param src 需要被检查的资源字符串
         * @param category 标识字符串类型
         * @return 返回true表示字符串合法,false表示不合法
         */
        public static boolean checkFormat(String src, String category) {
            if (category.equals("Homework")){
                return checkHomeworkFileFormat(src);
            } else if (category.equals("Email")){
                return  checkEmailFormat(src);
            } else {
                System.out.println("Wrong Category!");
                return false;
            }
        }
    
        /**
         * 用于检查类型为"Homework"的字符串是否合法
         * @param src 需要被检查的资源字符串
         * @return 返回true表示字符串合法,false表示不合法
         */
        public static boolean checkHomeworkFileFormat(String src) {
            int index = src.indexOf('.');
            if (src.substring(index).equals((".java")))
                return true;
    
            return false;
        }
    
        /**
         * 用于检查类型为"Email"的字符串是否合法
         * @param src 需要被检查的资源字符串
         * @return 返回true表示字符串合法,false表示不合法
         */
        public static boolean checkEmailFormat(String src) {
            int dotIndex = src.indexOf('.');
            int tagIndex = src.indexOf('@');
            if (dotIndex != -1 && tagIndex != -1 && dotIndex > tagIndex)
                return true;
    
            return false;
        }
    }
    

三. StringBuffer和StringBuilder类

  • StringBuffer类:StringBuffer类也是用于处理字符串。而且,StringBuffer 类是可变字符串类,创建 StringBuffer 类的对象后可以随意修改字符串的内容。每个 StringBuffer 类的对象都能够存储指定容量的字符串,如果字符串的长度超过了 StringBuffer 类对象的容量,则该对象的容量会自动扩大。JDK1.0加入。

  • StringBuilder类:功能与实现与StringBuffer类基本相同。JDK1.5加入。

  • 二者的区别:StringBuilder线程不安全,但是执行效率高,StringBuffer线程安全,但是效率比较低。

  • 以下以StringBuffer做例子,StringBuilder类似:

    1. 构造方法:
            StringBuffer str1 = new StringBuffer();//创建一个默认的空的对象,他的容量为16个字符
            StringBuffer str2 = new StringBuffer(10);//创建一个制定容量的对象
            StringBuffer str3 = new StringBuffer("abcdefg");//创建一个初始值为所给字符串的对象,容量为初始长度+16
    
    1. 常用常用方法:

      方法名 作用
      append 向原有的StringBuffer对象中追加字符串到末尾
      setCharAt 在字符串的指定索引位置替换一个字符
      reverse 将字符串翻转
      deleteCharAt 删除指定位置的字符
      delete 删除指定区间中的字符
      insert 在指定位置插入
  • String,StringBuffer,StringBuilder的区别:

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


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


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


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

    实现方法


  • 一般的使用规则:

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

posted @ 2021-03-01 22:00  心叶酱  阅读(51)  评论(1编辑  收藏  举报