• 4.String、StringBuffer、StringBuilder


    一、String类型

    String类型是一个引用类型,但是该类被final修饰,属于最终类,不能派生子类。

    字符串一旦初始化就不能再被更改,因为String类中存储内容的char[]数组是也被final修饰,所以其不可变,且因为该char数组私有而且String类没有提供修改数组里值的方,所以String是不可变的。

    因为String不可变,所以可以共享。

    二、String类的API

    1.compareTo

    按字典顺序比较两个字符串。该比较基于字串中各个字符的unicode值。

    如果两个字符串 不同,要么他们再某个索引处开始具有不同的字符,要么它们的长度不同,或者两者皆有。如果是索引问题则比较索引处字符,this.charAt(k)-anotherString.charAt(k)。等于0代表相等,小于0表示该字符字典顺序上小于字符串参数,大于0表示该字符串字典顺序上大于字符串参数。

    如果他们没有不同的索引位置,则较短字符串再字段顺序上位于较长字符串的前面。

    2.toLowerCase

    将此String中的所有字符都转换为小写。

    3.toUpperCase

    将此String中的所有字符都转换为大写

    4.trim

    返回字符串的副本,忽略前导空白和尾部空白。

    5.toCharArray

    将此字符串转换为一个新的字符数组

    6.split

    根据给定的正则表达式的匹配来拆分此字符串

    7.substring

    返回一个新的字符串,他是此字符串序列的的一个子序列

    8.concat

    将指定字符串连接到此字符串的结尾。

    9.indexOf

    返回指定字符在此字符串中出现的第一次索引

    10.intern

    String s1 = new String("aaa");
    String s2 = s1.intern();
    

    如果常量池中存在“aaa”的字符串的引用,那么就返回该引用

    如果常量池中不存在“aaa”的字符串的引用,那么就将s1加入到常量池中,并返回s1.

    三、字符串比较

    1.比较两个通过直接赋值创建的字符串对象

    直接赋值创建字符串对象的过程:首先在字符串常量池中查找是否存在相同字符串值的引用,如果有直接返回该引用,如果没有则创建一个对象然后将其加入字符串常量池中,然后返回其引用。

    注意:String类重写了equals方法和hashCode方法,equals方法比较的是字符串的值是否相同。

    2.直接赋值创建和new创建进行比较

    new创建的过程:String s3 = new String("test");,个人理解,先解析“test”,重复1过程,然后再创建一个同等字符串值的字符串对象。

    //        比较两个通过直接赋值创建的字符串对象
            String s1 = "test";
            String s2 = "test";
            System.out.println(s1 == s2);//true
            System.out.println(s1.equals(s2));//true
    
    //        一个通过直接赋值创建的字符串对象和一个用new创建的字符串对象之间的比较
            String s3 = new String("test");
            System.out.println(s1 == s3);//false
            System.out.println(s3.equals(s1));//true
    
    //        两个用new创建的字符串对象之间的比较
            String s4 = new String("test");
            String s5 = new String("test");
            System.out.println(s4 == s5);//false
            System.out.println(s4.equals(s5));//true
    
    //        测试String的intern方法
            String s6 = s5.intern();
            System.out.println(s1 == s6);//true
    
    

    四、StringBuilder、StringBuffer

    StringBuilder是 线程安全的。StringBuffer是线程不安全的。一个可变的字符序列。

    主要的API就是insert和append

    append为追加内容,insert为插入内容。

    五、String使用+拼接字符串的原理

    String使用StringBuilder作为中间对象实现。

            String str1 = "nishizhuma";
            String str2 = "geiniqidaiergeng";
            String str3 = str1 + str2;
            System.out.println(str3);
    

    上方实现过程可以转化为下方。

            String str1 = "nishizhuma";
            String str2 = "geiniqidaiergeng";
            StringBuilder stringBuilder = new StringBuilder();
            stringBuilder.append(str1);
            stringBuilder.append(str2);
            String str3 = stringBuilder.toString();
    

    六、速度比较

    比较String+号字符拼接字符串和StringBuilder使用append来拼接的速度

            String s1 = new String("begin");
            long timeBegin = System.currentTimeMillis();
            for(int i = 0; i < 100000; i++) {
                s1 += i;
            }
            long time = System.currentTimeMillis() - timeBegin;
            System.out.println("string对象" + time);
    
            StringBuilder s2 = new StringBuilder("begin");
            long timeBegin1 = System.currentTimeMillis();
            for(int i = 0; i < 100000; i++) {
                s2.append(i);
            }
            long time1 = System.currentTimeMillis() - timeBegin1;
            System.out.println("stringBuilder对象" + time1);
    

    结果显示StringBuilder优于String。

    故如果有大量的字符串拼接时推荐使用 StringBuilder来进行

    七、拼接空对象

    StringBuilder拼接空对象时会拼接一个null字符串。+拼接同理,因为+拼接使用StringBuilder的append实现的。

    源码为

        public AbstractStringBuilder append(String str) {
            if (str == null)
                return appendNull();
            int len = str.length();
            ensureCapacityInternal(count + len);
            str.getChars(0, len, value, count);
            count += len;
            return this;
        }
    

    4.String、StringBuffer、StringBuilder

  • 相关阅读:
    jquery中,input获得焦点时光标自动定位到文字后面
    微信接口调用
    bootstrap-datetimepicker插件双日期的设置
    input输入框在移动端点击有阴影解决方法
    input输入框光标高度问题
    Appendix 2- Lebesgue integration and Reimann integration
    Appendix 1- LLN and Central Limit Theorem
    LESSON 7- High Rate Quantizers and Waveform Encoding
    LESSON 6- Quantization
    LESSON 5
  • 原文地址:https://www.cnblogs.com/dearcabbage/p/11227600.html
Copyright © 2020-2023  润新知