java-Stringbuffer

文章首发于我的博客Lunatic,转载请注明出处


StringBuffer类的理解

继承关系图示

  1. java. lang String Buffer代表可变的字符序列,可以对字符串内容进行增删。

  2. 很多方法与 String相同,但 String Buffer是可变长度的。

  3. StringBuffer是一个容器。

  4. StringBuffer是一个final类,不可以被继承

  5. StringBuffer继承了AbstractStringBuffer类,而AbstractStringBuffer类里面维护了一个数组

    char[] value; //区别于String里面的数组,此数组没有final关键字,说明此数组是可以被更改的,也说明了此数组是在堆空间中的;不用每次都更换地址(即不是每次创建新对象),所以效率高于 String

StringBuffer底层源码分析

  1. StringBuffer类有四个构造方法:

    // 构造器一
    public StringBuffer() {}
    // 构造器二
    public StringBuffer(int capacity) {}
    // 构造器三
    public StringBuffer(String str) {}
    // 构造器四
    public StringBuffer(CharSequence seq) {}
    
  2. 使用构造器一创建对象

    public StringBuffer() {super(16);
    } // 调用父类的有参构造器,参数:16AbstractStringBuilder(int capacity) {value = new char[capacity]; // 此处参数传16,value指向一个char[],数组的初始大小为16
    }
    
  3. 使用构造器二创建对象

    public StringBuffer(int capacity) {super(capacity); // 调用父类的有参构造器,参数:(构造方法中传进来的参数)
    }
    AbstractStringBuilder(int capacity) {value = new char[capacity]; //此处参数传16,value指向一个char[],数组的初始大小为自己指定的大小
    }// 此构造方法会开辟指定大小的数组长度
    
  4. 使用构造器三创建对象

    public StringBuffer(String str) {super(str.length() + 16); //调用父类的有参构造器,参数:该字符串的长度+16append(str); // 构建好char[]之后,调用append()
    }
    // 父类构造方法的调用2,3说过,此处不再说明
    
  5. 使用构造器四创建对象和构造器三差不多。

  6. 关于StringBuffer的底层扩容机制

    // 使用append()
    public synchronized StringBuffer append(String str) {toStringCache = null;super.append(str); // 调用父类的append()return this;
    }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; // count:用来记录字符的数量return this;
    }private void ensureCapacityInternal(int minimumCapacity) {// overflow-conscious codeif (minimumCapacity - value.length > 0) { //如果需要的最小容量比数组的容量大,则开辟新数组value = Arrays.copyOf(value,newCapacity(minimumCapacity));}
    }private int newCapacity(int minCapacity) {// overflow-conscious codeint newCapacity = (value.length << 1) + 2; //新开辟数组的容量是原数组容量的二倍加二if (newCapacity - minCapacity < 0) { newCapacity = minCapacity; // 如果扩容之后还不够就直接扩容至所需要的容量}return (newCapacity <= 0 || MAX_ARRAY_SIZE - newCapacity < 0)? hugeCapacity(minCapacity): newCapacity;
    }

StringBuffer和String的区别

  1. String保存的是字符串常量,里面的值(地址值)不能更改,每次String类的更新实际上就是更改地址,效率较低

    private final char value;

  2. String Buffer保存的是字符串变量,里面的值可以更改,每次String Buffer的更新实际上可以更新内容,不用每次更新地址,效率较高

    char[] value; ∥这个放在堆.

StringBuffer和String的相互转换

  1. String -> StringBuffer

    String str = "hello tom";
    //方式1 使用构造器
    //注意: 返回的才是StringBuffer对象,对str 本身没有影响
    StringBuffer stringBuffer = new StringBuffer(str);
    //方式2 使用的是append方法
    StringBuffer stringBuffer1 = new StringBuffer();
    stringBuffer1 = stringBuffer1.append(str);
    
  2. StringBuffer -> String

    StringBuffer stringBuffer3 = new StringBuffer("韩顺平教育");
    //方式1 使用StringBuffer提供的 toString方法
    String s = stringBuffer3.toString();
    //方式2: 使用构造器来搞定
    String s1 = new String(stringBuffer3);
    

StringBuffer类的常用方法

  1. append():添加元素
    说明:可以连续使用append()添加元素,使用println()输出的时候,输出的是字符串,因为它底层调用了toString(),返回了一个字符串对象

    public synchronized String toString() {if (toStringCache == null) {toStringCache = Arrays.copyOfRange(value, 0, count);}return new String(toStringCache, true);
    }
    
  2. delete()::删除元素

  3. replace():替换元素

  4. insert():插入元素

  5. length():获取StringBuffer中所含元素的个数

StringBuffer测试题

  1. 第一个
String str=null;
StringBuffer sb= new StringBuffer(); sb. append(str);
System. out. println(sb.length()); //4
System.out.println(sb); // null

底层源码分析

public synchronized StringBuffer append(String str) {toStringCache = null; super.append(str); //调用父类的append();return this;
}public AbstractStringBuilder append(String str) {if (str == null)return appendNull(); // 如果添加的字符串树null,则调用appendNull()int len = str.length();ensureCapacityInternal(count + len);str.getChars(0, len, value, count);count += len;return this;
}private AbstractStringBuilder appendNull() {int c = count;ensureCapacityInternal(c + 4);final char[] value = this.value;value[c++] = 'n';value[c++] = 'u';value[c++] = 'l';value[c++] = 'l';count = c;return this;   // 将null每个字符添加进去
}

总结:StringBuffer使用append()添加null的时候,不会出现空指针异常的问题

  1. 第二个
StringBuffer sbl= new StringBuffer(str); // 会报空指针异常的错误
System. out. printIn(sbl)

底层源码分析

  public StringBuffer(String str) {super(str.length() + 16); // 在调用父类构造器的时候会出现null.length(),这时候会出现空指针异常的问题append(str);}

总结:StringBuffer使用构造方法添加null的时候会出现空指针异常的问题

java-Stringbuffer相关推荐

  1. LeetCode (12.整数转罗马数字)JAVA StringBuffer

    LeetCode (12.整数转罗马数字)JAVA StringBuffer 罗马数字包含以下七种字符: I, V, X, L,C,D 和 M. 字符 数值 I 1 V 5 X 10 L 50 C 1 ...

  2. java setcharat,Java StringBuffer setCharAt()方法

    Java StringBuffer setCharAt()方法 java.lang.StringBuffer.setCharAt()方法将指定index处的字符设置为ch . 该序列被改变以表示与旧字 ...

  3. java stringbuffer倒置_Java程序设计05——String和StringBuffer

    String和StringBuffer String和Stringbuffer类1.String的声明string s1="abc"; string s2 = new String ...

  4. Java 12 - Java StringBuffer和StringBuilder类

    Java StringBuffer和StringBuilder类 当对字符串进行修改的时候,需要使用StringBuffer和StringBuilder类. 和String类不同的是,StringBu ...

  5. JAVA数组Java StringBuffer 和 StringBuilder 类

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/qq_34173549/article/details/80215173 Java StringBuf ...

  6. java stringbuffer 转数组_JAVA之旅(十七)——StringBuffer的概述,存储,删除,获取,修改,反转,将缓存区的数据存储到数组中,StringBuilder...

    JAVA之旅(十七)--StringBuffer的概述,存储,删除,获取,修改,反转,将缓存区的数据存储到数组中,StringBuilder 讲完String,我们来聊聊他的小兄弟 一.StringB ...

  7. java stringbuilder换行_初遇Java StringBuffer 和 StringBuilder 类利用 StringBuilder 给TextView实现换行处理...

    当对字符串进行修改的时候,需要使用 StringBuffer 和 StringBuilder 类. 和 String 类不同的是,StringBuffer 和 StringBuilder 类的对象能够 ...

  8. Java StringBuffer的用法

    文章目录 一.StringBuffer对象的初始化 二.StringBuffer的常用方法 1.append方法 2.deleteCharAt方法 3.insert方法 4.reverse方法 5.s ...

  9. java stringbuffer原理_String,StringBuilder,StringBuffer 实现原理解析

    定义: 从jdk1.5开始提供的新的封装字符串的类,StringBuilder,其字符串拼接操作的效率远远高于 String. Java里面提供了String,StringBuffer和StringB ...

  10. java stringbuffer详解_Java常用类StringBuffer详解

    内容多为最近学习的自我总结,可能有些地方写的不严谨,甚至会有错误的地方,仅供参考,如发现错误敬请指出,谢谢! 灰色字体为补充扩展内容,多为帮助自己理解. StringBuffer概述: 线程安全的可变 ...

最新文章

  1. 配置2008的网络与工作组环境
  2. windowserver2012 R2 上安装sqlserver2017 报错 KB2919355 安装规则失败
  3. 面试精选:链表问题集锦
  4. Python将绝对路径转换为相对路径方法实例
  5. 95-20-020-启动器-Cloneable
  6. 安装oracle的口令是,Oracle中口令设置、用户解锁、卸载等问题
  7. 强化学习在推荐混排中的应用
  8. 数据库容灾技术之–数据容灾技术比较
  9. 杏仁损伤检测器——基于CNN的图像分类
  10. 最全面的外包公司的解释
  11. 【错误解决】SpringBoot邮件服务的一些错误及其解决方案
  12. css 实现 防抖效果
  13. RK3588平台开发系列讲解(RKNN篇)RKNN Android平台开发说明
  14. html手机点赞图标素材,微信点赞心形图标,微信点赞分享心形图标素材
  15. 【转】48个诡异心理学
  16. 今日头条/字节跳动 后台开发岗(应届生)三轮技术面试
  17. 1986 年德国电气商博世公司开发出面向汽车的CAN 通信协议
  18. 华为弹性云服务器组成,弹性云服务器知识大全-华为企业云服务
  19. 基于TC358870XBG和TC358775XBG之AR显示方案
  20. uni-app开发微信公众号扫码功能(1)-测试环境

热门文章

  1. 【分享】免梯子的GPT,玩 ChatGPT 的正确姿势
  2. usb 键盘码表_ASCII码表,键盘按键码表,虚拟键盘按键码表
  3. XML中大于号小于号的转义字符
  4. matlab 矩阵维度必须一致,错误使用 /
  5. Linux:内核调试之内核魔术键sysrq
  6. 半双工通信java_Socket实现一个简单的半双工通信
  7. 艺术聚焦:#DRIVE
  8. 区块链技术能否给跨境贸易带来新的机遇?
  9. 计算机的中mb b单位的关系,计算机中容量单位B、KB、MB、GB和TB的关系.doc
  10. 计算机类sci查重,SCI科研写作:国自然标书查重方法