了解Java中String和StringBuilder两者之间的区别

最近在学习java的时候,遇到了一个问题,就是String和StringBuilder之间到底有什么区别呢?基于自己学习过程的了解和网上资料的了解,大致整理了一下,便于加深自己的理解,也希望帮助更多需要了解的人,如果哪里有误,恳请指正。

首先我们先来了解这两个类:

String:

String类代表字符串。 Java程序中的所有字符串文字(例如"abc" )都被实现为此类的实例。

字符串不变; 它们的值在创建后不能被更改。 字符串缓冲区支持可变字符串。 因为String对象是不可变的,它们可以被共享。 例如:

     String str = "abc";
 

相当于:

     char data[] = {'a', 'b', 'c'};
     String str = new String(data);

 特点:

String通过new创建的字符串对象,每一次new都会申请一个内存空间,虽然内容相同,但是地址不同。以双引号方式给出的字符串,只要字符序列相同(顺序和大小写),无论在程序代码中出现几次,jvm都只会建立一个String对象,并在字符串池中维护。整理这段文字,大概可以理解成new后虽然可能相同,但是地址一定是不同的,而本质上却又是同一个对象。

StringBuilder:

一个可变的字符串类,我们可以把它看成一个容器,这里的可变值的是StringBuilder对象中的内容是可变的。值得注意的点是,前面赋的值会被后面赋的值所替代,输出的对象也会更新为最新赋的值。可以理解成StringBuilder只能装一个数据,后面只要数据更新,前面赋的值都会变成数据更新这个值 。

例如:

     StringBuilder sb = new StringBuilder;
     StringBuilder sb2 = sb.append("hello");
     System.out.println("1:"+sb)
     System.out.println("2:"+sb2)
     System.out.println(sb==sb2)
     sb:hello
     sb2:hello
     true

这样很形象的说明了它们用的都是同一个地址。

该类被设计为在字符串缓冲区被单个线程使用的地方(作为一般情况)用作StringBuffer替代替代。 在可能的情况下,建议使用这个类别优先于StringBuffer因为它在大多数实施中将更快。但是StringBuilder实例不能安全使用多线程。 如果需要同步,那么建议使用StringBuffer

一个StringBuilder的主要操作是appendinsert方法,它们是重载的,以便接受任何类型的数据。

总结:

String和StringBuilder有哪些区别呢?

1:String的值不可变,StringBuilder的值是可变的。String每赋予一个值,都会产生一个新的地址,而StringBuilder是在原有地址上一直更改的,节省了大量的空间,这也代表了它运行的速度更快。

速度上来说:StringBuilder>String。

2:将 StringBuilder 的实例用于多个线程是不安全的,它不像String一样,在最后会被final修饰不可更改,所以需要这样的同步,则建议使用 StringBuffer,单独同步处理则使用StringBuilder。

String:适用于少量的字符串操作的情况

StringBuilder:适用于单线程下在字符缓冲区进行大量操作的情况

  • 27
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 17
    评论
StringStringBuffer和StringBuilderJava都是用来表示字符串的类,但它们之间有一些区别String类是不可变的,即一旦字符串对象创建后,它的值就不能再改变。每次对字符串进行修改都会创建一个新的字符串对象。这种特性使得String类适用于频繁读取而很少修改的场景。 StringBuffer和StringBuilder类是可变的,它们可以在原始对象上进行修改,而不会创建新的对象。这样可以避免频繁的对象创建和销毁,提高性能。两者的方法基本相同,都提供了一系列用于修改字符串的方法,比如追加、插入和反转等。 区别在于StringBuffer是线程安全的,而StringBuilder则是非线程安全的。线程安全意味着多个线程可以同时访问同一个对象而不会引起数据不一致的问题,但会带来一些性能上的开销。所以在多线程环境下,建议使用StringBuffer。而在单线程环境下,为了提高性能,建议使用StringBuilder。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [StringStringBuffer和StringBuilder的六大区别](https://blog.csdn.net/zkzbhh/article/details/107995332)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值