zoukankan      html  css  js  c++  java
  • [java初探外篇]__关于StringBuilder类与String类的区别

    • 前言
      我们前面学习到String类的相关知识,知道了它是一个字符串类,并且了解到其中的一些方法,但是当时并没有太过注意到String类的特点,今天就StringBuilder类的学习来比较一下两者的区别和作用.

    • String类
      String类实例化的对象,其长度是固定不变的,其内容也是不可改变的.
      那么,为什么,在我们学习String类的时候,我们了解到String类提供了很多方法用来对String对象进行操作呢,还包括到字符串的连接,和字符串的替换.这明显和上面所描述的String类的特性不同嘛.

    在通过了解之后,我知道了,上面的那些操作String类的方法中凡是更String类的长度和内容相关的方法,其实返回的都不是同一个字符串.而是一个新定义的字符串,通过方法体中的方法获取到结果,再赋值新建的字符串然后返回.而+号连接字符串的操作也不是将内容直接添加到原字符串内.而是储存在一个新的String的对象内,再做并列输出的效果.

    我们可以观察一下String类提供的replace方法(用来替换字符串):

      public String replace(CharSequence target, CharSequence replacement) {
            String tgtStr = target.toString();
            String replStr = replacement.toString();
            int j = indexOf(tgtStr);
            if (j < 0) {
                return this;
            }
            int tgtLen = tgtStr.length();
            int tgtLen1 = Math.max(tgtLen, 1);
            int thisLen = length();
    
            int newLenHint = thisLen - tgtLen + replStr.length();
            if (newLenHint < 0) {
                throw new OutOfMemoryError();
            }
            StringBuilder sb = new StringBuilder(newLenHint);
            int i = 0;
            do {
                sb.append(this, i, j).append(replStr);
                i = j + tgtLen;
            } while (j < thisLen && (j = indexOf(tgtStr, j + tgtLen1)) > 0);
            return sb.append(this, i, thisLen).toString();
        }
    

    可能,有些代码我们还看不太懂,但可以很明显的查看到,replace方法返回的是一个new的StringBuilder对象sb.所以即使replace方法是String类中的方法,其本质还是通过StringBuilder对象来实现的

    • StringBuilder(字符串生成器)类
      StringBuilder类实例化的对象,是一个长度可变的字符序列.通过它,能够大大提高频繁对字符串添加,修改等操作的效率,因为其长度是可变的,去掉了频繁的newString对象,创建内存等无意义的操作.

    我们可以通过StringBuilder类中的提供的方法来解决字符串问题,其效率会高上很多.

    • StringBuilder类实例化的对象默认长度为16个字符,当附加内容超出是,它会自动增加长度以用来容纳追加内容.

    • append(content)方法
      该方法用于向字符串生成器中追加内容.其参数可以是任何类型的数据或对象.

     StringBuilder builder = new StringBuilder();
            // SringBuildr类中的append方法,追加内容,相当于在其末尾添加.
            System.out.println(builder.append("abcdef"));
    
    • insert(int offset arg)方法,
      该方法用于向StringBuilder对象中指定的位置添加指定内容.
      参数offst为插入位置(其大小必须大于等于0,小于等于对象的长度)
      参数arg为插入内容,可以是任何类型的数据或对象.
       //StringBuilder类中的instert方法(插入内容)
            System.out.println(builder.insert(2," this is  instert String "));
    
    • delete(int start,int end)方法
      用来移除对象中的字符,参数为开始位置,结束位置.会检索移除他们之间的所有字符.
      StringBuilder builder = new StringBuilder();
            builder.append("abcdef");
            System.out.println(builder.delete(1,5));
            System.out.println(builder.length());
    

    image.png

    可以看出,delete方法,不仅是移除其中的字符,而且是会释放掉其空间的,删除掉长度的,毕竟StringBuilder类对象是一个长度可变的字符序列.

    这里还需要注意到的一点就是,StringBuild类对象的赋值,并不能通过=来得到,而是需要通过append方法来向对象里面追加内容的方法赋值的

    • 源码
    package java01.day_4_12;
    
    /**
     * @outhor xiaoshe
     * @date 2019/4/12  - @time 19:08
     *可变的String序列.
     *在我们使用String创建字符串对象后,其长度就是已经固定的了.
     * 虽然通过+符号可以达到附加字符串的目的,但通过+号其实还是新建了一个String实例对象.
     * 相当于是两个String对象的并列输出.
     *
     * java提供的StringBuilder类,其实例化的对象是一个动态可变的字符串.
     */
    public class sty_StringBulder {
        public static void main(String[] args) {
            sty_StringBulder stringBulder = new sty_StringBulder();
            stringBulder.aString();
            stringBulder.aStringBuilder();
        }
        private void aString(){
            String astr = "小舍先生";
            System.out.println(astr.replace("先生","女士"));
        }
        private void aStringBuilder(){
            StringBuilder builder = new StringBuilder();
            // SringBuildr类中的append方法,追加内容,相当于在其末尾添加.
            System.out.println(builder.append("abcdef"));
            //StringBuilder类中的instert方法(插入内容)
            System.out.println(builder.insert(2," this is  instert String "));
            System.out.println(builder.length());
            //StringBuilder类中的delete方法
            System.out.println(builder.delete(1,5));
            System.out.println(builder.length());
        }
    }
    
    • 结果
      image.png

    更新时间:
    20194-12
    20:29

  • 相关阅读:
    Java从零开始学二十一(集合List接口)
    Java从零开始学二十(集合简介)
    初识软件工程一
    JAVA中AES对称加密和解密
    java中的数据加密
    Redis哨兵
    Nginx
    Zuul介绍
    ELK快速搭建日志平台
    Kibana安全特性之权限控制
  • 原文地址:https://www.cnblogs.com/gemuxiaoshe/p/10699598.html
Copyright © 2011-2022 走看看