StringBuilder类的简单理解

Java提供了String、StringBuffer和StringBuilder类来封装字符串,并提供了一系列操作字符串对象的方法。本文主要讲解StringBuilder类的简单使用及其优点。

StringBuilder类

StringBuffer与StringBuilder都继承自AbstractStringBuilder类

1.首先了解StringBuilde与StringBuffer与string的区别
*

是否可变

  1. String类是一个不可变类,即创建String对象后,该对象中的字符串是不可改变的,直到这个对象被销毁。
  2. StringBuffer与StringBuilder都继承自AbstractStringBuilder类,在AbstractStringBuilder中也是使用字符数组保存字符串,是可变类

初始化

1.当创建String对象时,可以利用构造方法String str = new String
也可以直接用赋值的方式String s = "Java"来初始化
2.而StringBuilder只能使用构造方法StringBuilder = new StringBuilder(“hello”)的方式初始化。

快慢速度与安全

1.String 有final表示不能被继承 线程不安全的 会产生额外的垃圾!
2.StringBuilder 有final表示不能被继承 成员函数没有synchronized修饰 无同步锁
3.StringBuffer 有final表示不能被继承 成员函数都有synchronized修饰 同步锁

  • [StringBuilder是线程不安全的->没加锁(同步锁) 单线程 效率会更高
  • [ StringBuffer是线程安全的->加锁(同步锁) 多线程 效率会更低
  • [ ]

缓存与清理

String产生的垃圾主要集中在 方法区(字符串常量池)
SB产生的垃圾主要集中在 堆内存

【JVM告诉你,GC(垃圾收集器)在堆内存中活跃程度 比在方法区的活跃程度 要大的大的大的多!】
也就意味着 GC在堆内存中回收垃圾的效率要远远比在方法区高

StringBuilder常用方法及部分源码

方法
方法
追加

public StringBuilder append(char[] str, int offset, int len) {...}
public StringBuilder append(boolean b) {...}
  public StringBuilder append(char c) 
      super.append(c);//调用父类AbstractStringBuilder的方法

      return this; //返回当前对象
        //针对追加对象的不同有不同的实现方法和实现逻辑
    }
    @Override
    /* //char的实现要进行数组扩容
   public AbstractStringBuilder append(char c) {
        ensureCapacityInternal(count + 1);
        value[count++] = c;
        return this;
    }

  */
  

插入:插入需要先进行入参判断为了保障高效插入使用jni方法进行数组复制(system.arraycopy)

    @Override
    public StringBuilder insert(int offset, Object obj) {
            super.insert(offset, obj);//调用父类的
            return this;
    }
    //父类的实现
    public AbstractStringBuilder insert(int offset, String str) {
        if ((offset < 0) || (offset > length()))
            throw new StringIndexOutOfBoundsException(offset);
        if (str == null)
            str = "null";
        int len = str.length();
        ensureCapacityInternal(count + len); //进行扩容
        System.arraycopy(value, offset, value, offset + len, count - offset);//进行复制
        str.getChars(value, offset);
        count += len;
        return this;//扩容后返回当前对象
    }

tostring

    public String toString() {
        // Create a copy, don't share the array/
        / /根据 当前 字符数组和长度构造 一个新的字符串对象    
        return new String(value, 0, count);
    }

序列化与反序列化

    private void writeObject(java.io.ObjectOutputStream s) //序列化
        throws java.io.IOException {
        s.defaultWriteObject();
        s.writeInt(count);
        s.writeObject(value);
    }
     /**
     * readObject is called to restore the state of the StringBuffer from
     * a stream.
     */
     

    private void readObject(java.io.ObjectInputStream s)//反序列化
        throws java.io.IOException, ClassNotFoundException {
        s.defaultReadObject();
        count = s.readInt();
        value = (char[]) s.readObject();
    }

     
public class StringBuildeDemo01 {
        public static void main(String[] args) {
            StringBuilder sb=new StringBuilder();
              sb.append(10); //追加
              sb.append(new Person(30,"老李"));
              sb.append("hahalalaxixi");
              sb.append(true);
              System.out.println(sb.toString());//输出为字符串数组
              System.out.println(sb.capacity()); //指的是当前value的容量
              System.out.println(sb.length()); //指的是当前value中有效字符的个数
              System.out.println(sb.charAt(1));//输出当前角标字母
              sb.deleteCharAt(0);//删除角标位置的字
              sb.delete(0, 10);  //删除[start,end)左闭右开
              System.out.println(sb.indexOf("name"));//寻找name若找到返回第一次出现的角标值,否则返回-1。
              sb.insert(5, "lala");//从角标5插入lala
              
            
           
            
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
hashmap的底层原理 hashmap产生死锁的原因 hashmap的容量为什么一定要是2的幂呢 TreeMap的底层原理 HashMap,Hashtable和ConcurrentHashMap的区别 在ArrayList和LinkedList尾部添加元素,谁的效率更高 如果HashMap或者hashTable的key是一个自定义的该怎么办 为什么重写equals还要重写hashCode? 介绍一下volatile jdk1.5新特性 jdk1.7新特性 jdk1.8新特性 java语言有哪些优点? 同一个.java文件中是否可以有多个main方法 一个".java"源文件中是否可以包括多个(不是内部)?有什么限制? 如何在main方法执行前输出”hello world” java程序的初始化顺序 请说出作用域public,private,protected,以及不写时的区别 为什么java中有些接口没有任何方法 java中的clone方法有什么作用 面向对象有哪些特征 面向对象的开发方式有什么优点 组合和继承有什么区别 多态的实现机制是什么 重写和重载的区别 抽象和接口有什么区别 break如果跳出多重循环 final,finally和finalize有什么区别 使用switch时有哪些注意事项 instanceof有什么作用 什么是不可变 型转换 Math的round,ceil和floor方法 值传递和引用传递有什么不同? char型变量是否可以存储一个中文汉字 s=null和s=” ”是否相同 new String(“abc”)创建了几个对象 String变量做“+”运算时的编译优化 "=="和equals方法究竟有什么区别 String,StringBuffer,StringBuilder有什么区别 java中的数组是不是对象 数组初始化的方式有哪几种 length属性和length()方法有什么区别 finally块中的代码什么时候被执行 Java中的异常处理机制的简单原理和应用。 java socket java序列化 JVM加载class文件的原理 双亲委派模型 为什么要自定义加载器 如何自定义加载器 什么是GC 内存泄漏和内存溢出 Java的内存模型(JVM的内存划分) JVM内存模型1.7和1.8的区别 如何判断一个对象是否是垃圾对象 垃圾回收算法 Minor GC和Full GC 垃圾收集器 集合的继承体系 Collection 和 Collections的区别。 如何通过jdbc访问数据库 JDBC处理事务采用什么方法 Statement和PreparedStatement的区别 getString()方法和getObject()方法有什么区别 jdbc和hibernate有什么区别 http1.0和http1.1和http2.0的区别 http和https的区别 http缓存 cookie和session forward与redirect区别 页面请求的工作流程 HTTP中的GET和POST方法有什么区别 什么是Servlet servlet是线程安全的吗 Servlet的生命周期 JSP和Servlet的区别和联系 什么是MVC模型 TCP的连接和释放过程 什么是长连接和短连接 长连接是如何实现的 计算机网络体系结构 谈谈你对Struts的理解。 谈谈你对Hibernate的理解。 谈谈你对Lucene和solr的理解 谈谈你对ActiveMQ的理解 Spring的IOC,DI和AOP 谈谈你对webservice和dubbo的理解 谈谈你的SOA的理解。 谈谈你对freemarker的理解 谈谈你对springMVC的理解 谈谈你对mybatis的理解 hibernate和mybatis的区别 同步接口和异步接口的区别 为什么要加入锁机制 如何确定是否应该上锁?即如何判断是否有线程安全问题 什么是markword 乐观锁和悲观锁 偏向锁 轻量级锁 自旋锁 自适应自旋锁 重量级锁 synchronized 可重入锁 土方法实现可重入锁 使用AQS实现可重入锁 CAS MySQL 中的行级锁、表级锁和页级锁 java中的死锁 公平锁和非公平锁 锁的总结 锁的优化 .......... 还有好多,不想写了,太多了,都是题主呕心沥血总结的

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值