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构造方法和方法一样!

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • Altium Designer 13 安装完整元件库「建议收藏」

    Altium Designer 13 安装完整元件库「建议收藏」AltiumDesigner更新的非常快,都快赶上chrome了,13出来没多久14又出来了,之前一直用AD9.4,算是10之前的最后一个版本,也是很经典的一个版本。安装新版本后看到在目录结构上有些

  • 京东数据库泄露事件分析报告_某网站的用户数据库泄露

    京东数据库泄露事件分析报告_某网站的用户数据库泄露猪猪侠·2014/03/0112:020×00背景昨天一张截图在QQ群里疯传,并说京东数据库泄露,里面有钱的尽快转。有人问“我挨个试了一下,只有3个可以正常登陆,而且网上也并没有完整的数据库流出,所以我妄猜是否是支付宝或者是其他竞争对手的营销手段?”这件事件到底是真的假的呢?经过我的研究,京东的数据库没有被脱裤,只是无聊黑客的恶作剧,他们通过收集互联网已泄露的用户+密码信息,生成对应的字典…

  • 最新最详细的Python开发环境搭建以及PyCharm的安装配置教程【图+文】[通俗易懂]

    最新最详细的Python开发环境搭建以及PyCharm的安装配置教程【图+文】[通俗易懂]本文为长文:Python进阶之道【阶段一】的第一章,截取本章单独发布是因为帮助更多读者进行专项的需求,本文采用图+文的形式,配图众多,每步都很详细,且下载为最新Python3.10,和最新的PyCharm,安装PyCharm分为付费版和免费版的安装演示。

  • winfrom DotNetBar sideNav控件使用问题

    winfrom DotNetBar sideNav控件使用问题sideNav初始UI在最开始的界面,不知道设置了什么东西,然后没有那个东西最后又新建了个项目,一个一个对比参数。还是没找到!倒是发现几个其他的参数属性在这里记录下这是分别对应的是对sideNav的sideNavPanel的折叠最大化隐藏功能,可以设置为false,取消对应图标。当查完sideNav所以属性后,没有发现不同点,…

    2022年10月31日
  • 怎样使用cookie登录自己的账号

    在这之前,不管是做测试还是挖漏洞总会遇到这种问题做测试的时候测试项里面有一个会话标识未更新,这种漏洞说白了就是在退出个人账户的时候没有及时的清除cookie,从而让别人利用你的cookie再次登录你的账户,然后测试的时候客户就让测试如何使用cookie登录在挖漏洞的时候一般xss都需要打cookie然后伪造别人的身份登录,其实也是使用打到的cookie登录在这之前我没深入的理解这块,现…

  • 看完这篇还不会SQL优化,算我输。。。

    前言 本文主要针对的是关系型数据数据库MySql。键值类数据库可以参考: https://www.jianshu.com/p/098a870d83e4 先简单梳理下Mysql的基本…

发表回复

您的电子邮箱地址不会被公开。

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