31 StringBuffer 类

StringBuffer 类

  • StringBuffer 是可变的字符序列

  • 很多方法与String相同

  • 作为参数传递时,方法内部可以改变值

 

String 、StringBuffer、StringBuilder三者的异同

String:不可变的字符序列,底层用char[]存储

StringBuffer:可变的字符序列;线程安全的,效率低,底层用char[]存储

StringBuilder:可变的字符序列里;JDK5.0新增的,线程不安全的,效率高,底层用char[]存储

 

三者之间的转换

String ----> StringBuffer、StringBuilder: 调用StringBuffer、StringBuilder构造器

StringBuffer、StringBuilder----->String : 调用String 构造器 \ StringBuffer、StringBuilder 的toString()方法

 

源码分析

String

String str = new String();//char[] value = new char[0];
String str1 = new String("abc");//char[] value = new char[]{'a','b','c'};

 

StringBuffer

StringBuffer sb1 = new StringBuffer();//char[] value = new char[16];底层创建了一个长度是16的数组
System.out.println(sb1.length());//0

sb1.append('a');//value[0] = 'a';
sb1.append('b');//value[1] = 'b';

StringBuffer sb2 = new StringBuffer("abc");//char[] value = new char["abc".length() + 16]
System.out.println(sb2.length());//3

扩容问题:如果要添加的数据底层数组盛不下了,那就需要扩容底层的数组。默认情况下,扩容为原来容量的2倍 + 2,同时将原来数组中的元素复制到新的数组中

指导意义:开发中建议大家使用:StringBuffer(int capacity) 或 StringBuilder(int capacity)

 

StringBuffer类的常用方法

StringBuffer append(xxx):提供了很多的append()方法,用于进行字符串拼接

StringBuffer s1 = new StringBuffer("abc");
s1.append(1);
s1.append('1');
System.out.println(s1);//abc11

 

StringBuffer delete(int start,int end):删除指定位置的内容

s1.delete(2,4);
System.out.println(s1);//ab1

 

StringBuffer replace(int start, int end,String str):把[start,end)位置替换为str

s1.replace(2,4,"hello");
System.out.println(s1);//abhello1

 

StringBuffer insert(int offset, xxx):在指定位置插入xxx

s1.insert(2,false);
System.out.println(s1);//abfalsec11   插入不是替换

 

StringBuffer reverse() :把当前字符序列逆转

s1.reverse();
System.out.println(s1);//11cba

 

public int indexof(String str):返回指定子字符串在此字符串中第一次出现处的索引

public String substring(int start,int end):返回一个从start到end索引结束的左闭右开的子字符串

String s2 = s1.substring(1, 3);
System.out.println(s2);//bc

 

public int length() public char charAt(int n ) public void setcharAt(int n ,char ch)

s1.setCharAt(0,'m');
System.out.println(s1);//mbc11

 

 

总结:

增: append(xxx)

删:delete(int start,int end)

改: setcharAt(int n ,char ch)\ replace(int start, int end,String str)

查: charAt(int n )

插:insert(int offset, xxx)

长度:length()

遍历:for + charAt() / toString()

 

三者的效率

从高到低排列:StringBuilder > StringBuffer > String

posted @   flypiggg  阅读(35)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示