java StringBuffer和StringBuilder

java StringBuffer和StringBuilder一、前言我们在实际的开发中,如果需要进行字符串的频繁拼接,会出现以下问题:java中的字符串是不可变的,每一次拼接都会产生新字符串。这样会占用大量的方法区内存。造成内存空间的浪费。eg.Strings=”abc”;s+=”hello”;就以上两行代码,就导致在方法区字符串常量池当中创建了3个对象:”abc””hello””abchello”因此引出StringBuffer和StringBuilder可变字符串!二、如何优化StringBuffer和StringBuild

大家好,又见面了,我是你们的朋友全栈君。

一、前言

我们在实际的开发中,如果需要进行字符串的频繁拼接,会出现以下问题:

java中的字符串是不可变的,每一次拼接都会产生新字符串。
这样会占用大量的方法区内存。造成内存空间的浪费。

eg.

String s = "abc";
s += "hello";

就以上两行代码,就导致在方法区字符串常量池当中创建了3个对象:

"abc"
"hello"
"abchello"

因此引出StringBufferStringBuilder可变字符串!

二、如何优化StringBuffer和StringBuilder的性能?

在创建StringBuffer和StringBuilder的时候尽可能给定一个初始化容量。

最好减少底层数组的扩容次数。预估计一下,给一个大一些初始化容量。

关键点:给一个合适的初始化容量。可以提高程序的执行效率。

三、StringBuffer和StringBuilder的区别?

StringBuffer中的方法都有:synchronized 关键字修饰。表示StringBuffer在多线程环境下运行是安全的。

StringBuilder中的方法都没有:synchronized 关键字修饰,表示StringBuilder在多线程环境下运行是不安全的。

  • StringBuffer是线程安全的。
  • StringBuilder是非线程安全的。

四、String为什么是不可变的?

源代码内,String类中有一个 byte[ ] 数组,这个byte[ ]数组采用了 final 修饰,

因为数组一旦创建长度不可变。并且被final修饰的引用一旦指向某个对象之后,不可再指向其它对象,所以String是不可变的!

所以”abc” 无法变成 “abcd”

五、StringBuilder和StringBuffer为什么是可变的呢?

源代码内,StringBuffer和StringBuilder内部实际上是一个 byte[ ]数组,这个byte[]数组没有被final修饰,

StringBuffer和StringBuilder的初始化容量是 16,当存满之后会进行扩容,底层调用了数组拷贝的方法System.arraycopy()。所以StringBuilder和StringBuffer适合于使用字符串的频繁拼接操作。

注意:
StringBuffer和StringBuilder默认初始化容量为16个byte[] 数组

总结

  1. StringBuffer/StringBuilder可以看做 可变长度字符串
  2. StringBuffer/StringBuilder初始化容量 16.
  3. StringBuffer/StringBuilder是完成字符串拼接操作的,方法名:append
  4. StringBuffer是线程安全的。StringBuilder是非线程安全的。
  5. 频繁进行字符串拼接不建议使用“+

六、构造方法

构造方法名
StringBuilder()
StringBuilder(int capacity)
StringBuilder(String str)

eg.

class StringBufferTest{ 
   
    public static void main(String[] args) { 
   
        StringBuffer s1 = new StringBuffer();//创建一个容量为16的StringBuffer对象

        StringBuffer s2 = new StringBuffer("我是中国人");
        System.out.println(s2);

        StringBuffer s3 = new StringBuffer(100);//创建一个容量为100的StringBuffer对象
    }
}

七、方法

方法名 作用
StringBuilder append(char c) 在字符串尾巴追加字符
int capacity() 当前StringBuffer/StringBuilder的容量
char charAt(int index) 返回指定位置的字符
StringBuilder delete(int start, int end) 删除[start, end)范围的字符
StringBuilder deleteCharAt(int index) 删除指定位置的字符
void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin) 将字符串转换成char复制到dst数组中
int indexOf(String str) 返回str第一次出现的位置
int lastIndexOf(String str) 返回str最后一次出现的位置
StringBuilder insert(int offset, char c) 在offset位置插入字符
int length() 返回字符串长度
StringBuilder replace(int start, int end, String str) 将[start, end)的内容替换成str
StringBuilder reverse() 字符串翻转
void setCharAt(int index, char ch) 将index位置的字符设置为ch
String substring(int start) 从start开始截取字串
String substring(int start, int end) 截取start到end – 1的字符串
void setLength(int newLength) 设置StringBuffer/StringBuilder的长度,默认补空格,并自动扩充容量
CharSequence subSequence(int start, int end) 和substring一样,只不过返回CharSequence

eg.

class StringBufferTest{ 
   
    public static void main(String[] args) { 
   
        StringBuffer s1 = new StringBuffer();

        s1.append("a");
        s1.append("b").append('c').append('d').append('e').append('f').append("f");
        System.out.println(s1);//ab

        System.out.println(s1.capacity());//16

        System.out.println(s1.charAt(2));//c

        //System.out.println(s1.delete(1, 3));//adef

        //System.out.println(s1.deleteCharAt(2));//abdef

        System.out.println(s1.indexOf("c"));//2

        System.out.println(s1.lastIndexOf("f"));//6

        System.out.println(s1.insert(1, 123));//a123bcdeff

        char[] c = new char[20];
        s1.getChars(0, s1.length(), c, 0);
        System.out.println(Arrays.toString(c));//[a, 1, 2, 3, b, c, d, e, f, f, , , , , , , , , , ]

        System.out.println(s1.length());//10

        System.out.println(s1.replace(1, 4, "A"));//aAbcdeff

        //System.out.println(s1.reverse());//ffedcbAa

        s1.setCharAt(1, 'a');
        System.out.println(s1);//aabcdeff

        System.out.println(s1.substring(2));//bcdeff
        System.out.println(s1.substring(2,5));//bcd
        System.out.println(s1.subSequence(1, 3));//ab

        s1.setLength(100);
        System.out.println(s1.length());//100 直接在后面追加空格
        System.out.println(s1.capacity());//100
    }
}

在这里插入图片描述

StringBuffer和StringBuilder构造方法和方法一样!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/160695.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 用c语言编写银行家算法,C语言实现银行家算法

    用c语言编写银行家算法,C语言实现银行家算法《C语言实现银行家算法》由会员分享,可在线阅读,更多相关《C语言实现银行家算法(8页珍藏版)》请在人人文库网上搜索。1、C语言实现银行家算法(源码、运行结果)一、源码/*银行家算法10-22*/#include/函数声明voidinit(int*pcount,int*scount,intAllocation1010,intNeed1010,intAvailable10);vo…

    2022年7月22日
    6
  • linux阻塞与非阻塞(connect连接超时)

    非阻塞connect详情介绍可以参见文章:https://blog.csdn.net/qq_41453285/article/details/89890429一、非阻塞connect概述man手册connect的man手册有如下一段内容:EINPROGRESSThesocketisnonblockingandtheconnectioncannotbe…

    2022年4月10日
    60
  • JSP、JavaBean原理和使用

    JSP、JavaBean原理和使用JavaServerPages:Java服务器端页面,也和Servlet一样,用于动态Web技术!最大的特点:写JSP就像在写HTML区别:HTML只给用户提供静态的数据 JSP页面中可以嵌入JAVA代码,为用户提供动态数据;…

    2022年7月12日
    19
  • 成本=固定成本+可变成本_可避免固定成本是机会成本吗

    成本=固定成本+可变成本_可避免固定成本是机会成本吗1、固定成本和可变成本根据成本费用与产量的关系可将总成本费用分为:可变成本;是指随着产品产量的增减而成正比例变化的各项费用。固定成本:是指不随产品产量的变化的各项成本费用。半可变(或半固定)成本:有些成本费用属于半可变成本,如不能熄灭的工业炉的燃料费等。工资、营业费用和流动资金利息等也都可能既有可变因素,又有固定因素。必要时需将半可变(或半固定)成进一步分解为可变成本和…

    2025年8月20日
    2
  • 【翻译自mos文章】当指定asm disk 为FRA时,11.2.0.3的dbua hang住

    【翻译自mos文章】当指定asm disk 为FRA时,11.2.0.3的dbua hang住

    2022年1月25日
    44
  • java多线程—Thread、Runnable和Callable区别

    多线程编程优点进程之间不能共享内存,但线程之间共享内存非常容易。系统创建线程所分配的资源相对创建进程而言,代价非常小。Java中实现多线程有3种方法:继承Thread类实现Runnable接口实现Callable接口(参考<Java编程思想(第4版)> 21.2.4章节,原来一直以为是2种,后来发现是3种)回到顶部第一种实现方法—继承Thread类继承Thread类,需要覆盖方法r…

    2022年4月7日
    54

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号