草庐IT

StringBuffer类

zh-Note 2023-04-16 原文

StringBuffer类

一、 结构剖析

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

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

  3. StringBuffer是一个容器。

  4. String VS StringBuffer

    1. String 保存的是字符串常量,里面的值不能更改,每次String类的更新实际上就是更改地址,效率较低。private final char value[];
    2. StringBuffer保存的是字符串变量,里面的值可以更改,每次StringBuffer的更新实际上可以更新内容,不用更新地址,效率较高。char[] value; //这个存放在堆里
//StringBuffer类的细节:
public class StringBuffer01 {
    public static void main(String[] args) {
        //1. StringBuffer 的直接父类 是 AbstractStringBuilder
        //2. StringBuffer 实现了 Serializable,即StringBuffer的对象可串行化
        //3. 在父类 AbstractStringBuilder 中有属性 char value[] ,不是final
        //   该 value数组 存放我们的字符串内容,是存放在堆中的而非常量池,value[]不是常量了
        //4. StringBuffer 是一个final类,不能被继承
        //5. 因为StringBuffer 字符内容是存在 char[] value ,所以在变化时(增加/删除)
        // 不用每次都更换地址(即不是每次都创建新对象),所以效率高于 String(每次变化都会指向新的对象)
        StringBuffer stringBuffer = new StringBuffer();
    }
}

二、 StringBuffer转换

  • StringBuffer的构造器

    StringBuffer() 构造一个没有字符的字符串缓冲区,初始容量为16个字符。
    StringBuffer(CharSequence seq) 构造一个包含与指定的相同字符的字符串缓冲区 CharSequence
    StringBuffer(int capacity) 构造一个没有字符的字符串缓冲区和指定的初始容量。
    StringBuffer(String str) 构造一个初始化为指定字符串内容的字符串缓冲区。
    public class StringBuffer02 {
        public static void main(String[] args) {
            //构造器的使用
            //1. 创建一个大小为 16的char[],用于存放字符内容
            StringBuffer stringBuffer = new StringBuffer();
    
            //2. 通过构造器指定 char[] 大小
            StringBuffer stringBuffer1 = new StringBuffer(100);
    
            //3. 通过 给一个String 创建 StringBuffer,char[] value的大小就是 str.length + 16
            StringBuffer hello = new StringBuffer("hello");
            
            //4. 创建StringBuffer,包含与指定的CharSequence相同的字符。
            //   StringBuffer(CharSequence seq)
        }
    }
    
  • StringBuffer 和 String 之间的转换

    1. String ——> StringBuffer:

      方式1:使用构造器

      方式2:使用 append方法

    2. StringBuffer ——> String

      方式1:使用StringBuffer 提供的 toString方法

      方式2:使用构造器

    public class StringAndStringBuffer {
        public static void main(String[] args) {
            //看 String ——> StringBuffer
            String str = "hello tom";
            //方式1 使用构造器
            //注意:返回的才是StringBuffer对象,对str本身没有影响
            StringBuffer stringBuffer = new StringBuffer("str");
    
            //方式2 使用的是 append方法
            StringBuffer stringBuffer1 = new StringBuffer();
            stringBuffer1.append(str);
            
            //看 StringBuffer ——> String
            StringBuffer stringBuffer2 = new StringBuffer("你好!");
            //方式1:使用StringBuffer 提供的 toString方法
            String s = stringBuffer2.toString();
    
            //方式2:使用构造器
            String s2 = new String(stringBuffer2);
        }
    }
    

三、 StringBuffer的常见方法

  1. append()
  2. delete(start,end)
  3. replace(start,end,string),将start~end之间的内容替换掉,不含end。
  4. indexOf(),查找子串在字符串第一次出现的索引,如果找不到返回 -1.
  5. insert()
  6. 获取长度 length()
public class StringBufferMethod {
    public static void main(String[] args) {

        StringBuffer s = new StringBuffer("hello");
        //增
        s.append(',');// "hello,"
        s.append("张三丰");// "hello,张三丰"
        s.append("赵敏").append(100).append(true).append(10.5);// "hello,张三丰100true10.5"
        System.out.println(s);

        //删
        /*
           删除索引 >= start && < end 处的字符
           解读:删除 11 ~ 14 的字符 [11,14)
         */
        s.delete(11,14);
        System.out.println(s);//hello,张三丰赵敏true10.5

        //改
        //使用 周芷诺 替换 索引 9 - 11 的字符 [9,11)
        s.replace(9,11,"周芷若");
        System.out.println(s);//hello,张三丰周芷若true10.5
        
        //查找指定的子串在字符串中第一次出现的索引,如果找不到返回-1
        int indexOf = s.indexOf("张三丰");
        System.out.println(indexOf);//6

        //插
        //在索引为9的位置插入 "赵敏",原来索引为9的内容自动后移
        s.insert(9,"赵敏");
        System.out.println(s);//hello,张三丰赵敏周芷若true10.5
        
        //长度
        System.out.println(s.length());
        System.out.println(s);
    }
}

有关StringBuffer类的更多相关文章

  1. ruby - 为什么 Ruby 没有真正的 StringBuffer 或 StringIO? - 2

    我最近读了一篇不错的post关于在Ruby中使用StringIO。不过,作者没有提到的是StringIO只是一个“I”。没有“哦”。你不能这样做,例如:s=StringIO.newsshouldbe"foo\nbar"#=>reallyis''`Ruby确实需要一个StringBuffer,就像Java那样。StringBuffers有两个重要的用途。首先,它们让您测试Ruby的StringIO所做的一半输出。其次,它们对于从小部分构建长字符串很有用——Joel一遍又一遍地提醒我们,否则会非常非常慢。有好的替代品吗?的确,Ruby中的字符串是可变的,但这并不意味着我们应该始终依赖该功能

  2. StringBuffer(史上最详细) - 2

    StringBuffer是String的增强类文章目录StringBuffer是String的增强类添加删除替换插入长度StringBuffer练习题欢迎评论一起学习,如果觉得本文章对你有帮助,一键三连支持一下1.StringBuffer的直接父类是AbstractStringBuilder2.StringBuffer实现了Serializable即StringBuffer的对象可以串行化3.在父类中AbstractStringBuilder有属性char[]value,不是final在该value数组存放字符串内容,引出存放在堆中的4.StringBuffer是一个final类不能被继承5.

  3. java - 为什么 StringBuffer 有 toStringCache 而 StringBuilder 没有? - 2

    在JDK8中,StringBuffer类有一个toStringCache,而StringBuilder没有。/***AcacheofthelastvaluereturnedbytoString.Cleared*whenevertheStringBufferismodified.*/privatetransientchar[]toStringCache;但是为什么呢?我能想到的一个可能原因是StringBuffer已经同步,因此可以更轻松地实现缓存。或者也许历史上StringBuffer是这样实现的,所以旧代码严重依赖这个特性?鉴于现代JVM具有逃逸分析和偏向锁定,这些差异是否相关?

  4. java - 在 Java 1.7+ 上,我们是否仍需要使用 StringBuffer.append 转换 "this string"+ "should"+ "be"+ "joined"以获得最佳实践? - 2

    在Java1.7+上,我们是否仍需要使用StringBuffer.append转换“thisstring”+“should”+“be”+“joined”以获得最佳实践? 最佳答案 1)像"thisstring"+"should"+"be"+"joined"这样的常量表达式(JLS15.28)不需要StringBuilder因为它是在编译时计算成一个字符串“这个字符串应该加入”2)对于非常量表达式,编译器将自动应用StringBuilder。也就是说,"string"+var等同于newStringBuilder().append("

  5. java - 对于长度变化很大的输入,最佳 StringBuffer 初始容量是多少? - 2

    大家下午好,我正在使用java.lang.StringBuilder存储一些字符。我不知道我要提前存储多少个字符,除了:60%的情况下,它只有(恰好)7个字符39%的时间是(大约)3500个字符1%的时间,大约是20k个字符我们如何计算应该使用的最佳初始缓冲区长度?目前我正在使用newjava.lang.StringBuilder(4000)但那只是因为我以前懒得想。 最佳答案 这里有两个因素:时间和内存消耗。该时间主要受java.lang.AbstractStringBuilder.expandCapacity()调用次数的影响。

  6. java - String、StringBuffer 和 StringBuilder 之间的性能和简单性权衡 - 2

    您是否考虑过Java编程语言的这一变化的含义?String类被认为是一个不可变的类(这个决定是经过深思熟虑的)。但是字符串连接真的很慢,我自己对它进行了基准测试。于是StringBuffer诞生了。真的很棒的类(class),同步而且非常快。但是有些人对某些同步块(synchronizedblock)的性能成本不满意,于是引入了StringBuilder。但是,当使用String连接不多的对象时,类的不变性使其成为实现线程安全的一种非常自然的方式。当我们要管理几个String时,我可以理解StringBuffer的使用。但是,这是我的第一个问题:例如,如果您要附加10个或更少的字符串,

  7. java - Java 中的 Set 不允许重复,但它接受具有相同参数的 StringBuffer 对象。为什么? - 2

    publicstaticvoidmain(String[]args){HashSetset=newHashSet();set.add(newStringBuffer("abc"));set.add(newStringBuffer("abc"));set.add(newStringBuffer("abc"));set.add(newStringBuffer("abc"));System.out.println(set);}输出:[abc,abc,abc,abc]在上面的代码中,我多次添加了StringBuffer("abc")的对象,Set添加了它,但Set从不添加重复项。

  8. java - StringBuffer 和字符串池 - 2

    给定以下代码:StringBufferstr2=newStringBuffer("Idon't");StringBufferstr3=str2.append("getit.");if(str2==str3){System.out.println("Equal");}我的讲师说,在这种情况下str2和str3将引用同一个对象并且字符串“Idon'tgetit”将被插入到“Stringpool”中。我想我明白为什么str2和str3现在将引用同一个对象,但为什么字符串“我不明白”。str3赋值发生时进入字符串池?例如,如果我这样做:Strings="abcd";然后我知道现在字符串“abc

  9. java - 我应该为 Web 应用程序使用 StringBuilder 还是 StringBuffer? - 2

    我正在用Java1.6编写一个webapp并在tomcat中运行它。虽然我没有进行任何显式线程处理,但我想知道Spring和Tomcat在幕后发生了什么。使用StringBuilder而不是StringBuffer会遇到任何问题吗? 最佳答案 如果您使用的是局部变量,则可以安全地使用StringBuilder。每个线程都将获得自己的实例。 关于java-我应该为Web应用程序使用StringBuilder还是StringBuffer?,我们在StackOverflow上找到一个类似的问题

  10. java - 想象一个真实的并发场景,应该使用StringBuffer而不是StringBuilder? - 2

    我知道StringBuffer和StringBuilder的区别。readhere!一般来说,正如javadoc所说,Wherepossible,itisrecommendedthatthisclassbeusedinpreferencetoStringBufferasitwillbefasterundermostimplementations.但是,StringBuilder的javadoc也说:InstancesofStringBuilderarenotsafeforusebymultiplethreads.Ifsuchsynchronizationisrequiredthenit

随机推荐