A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

java1

初级黑马

  • 黑马币:

  • 帖子:

  • 精华:

© java1 初级黑马   /  2015-9-14 21:34  /  3800 人查看  /  11 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

26黑马币
StringBuffer/StringBuilder类、数组以及集合,它们之间有什么区别呀?

最佳答案

查看完整内容

数组,只能存储同一类型的数据以及对象,但是创建之后长度就不能再改变了。 集合,是用来存储对象的容器,它不能够存储基本类型的数据,但是当用包装类创建的基本数据对象 是可以存进来的,因为它们现在已经是对象了。 StringBuffer和StringBuilder的用法基本一样,就线程的安全性不同,只有在多线程的时候才考虑它们的区别, 一般情况下用StringBuilder就行了。 它们是可以存储字符串的容器,而且 ...

11 个回复

倒序浏览
数组,只能存储同一类型的数据以及对象,但是创建之后长度就不能再改变了。
集合,是用来存储对象的容器,它不能够存储基本类型的数据,但是当用包装类创建的基本数据对象
          是可以存进来的,因为它们现在已经是对象了。
StringBuffer和StringBuilder的用法基本一样,就线程的安全性不同,只有在多线程的时候才考虑它们的区别,
          一般情况下用StringBuilder就行了。
          它们是可以存储字符串的容器,而且长度是可以变化的。

评分

参与人数 1黑马币 +16 收起 理由
java1 + 16 赞一个!

查看全部评分

回复 使用道具 举报
本帖最后由 15738320440 于 2015-9-14 22:26 编辑

        StringBuffer, StringBuilder 都实现了CharSequence接口,意思都是字符序列,他们的底层都是用char[]实现的。
StringBuffer, StringBuilder是可变的,意思是你在生成其对象后可以改变其内部的char[],比如扩容,插入,删除等,这两个类是用于动态创建字符串的。这两者都是继承于AbstractStringBuilder,也就是他们具有相同的API(调用方式相同)。
         两者间的不同唯一就是StringBuffer是线程安全的(可用于并发环境),StringBuilder不是线性安全的(不能用于并发环境,如果使用,可能会出现问题)。当在单线程环境时最好使用StringBuilder,应为他不用检查对象锁,所以速度、效率要更高。
  概括的说:
           StringBuffer线程同步,安全,效率低(少量数据看不出差别)
           StringBuilder不同步,效率高
           String[] 长度不可变。上面两个长度可变(原因:上面两个底层实现也是String类型的数组,只不过根据需求,增加容量,同时将原来String数组中的元素拷贝到新的String数组中)。
以下供参考:
String中的是常量(final)数组,只能被赋值一次。
      比如:new String("abc")使得value[]={'a','b','c'}(查看jdk String 就是这么实现的),之后这个String对象中的value[]再也不能改变了。

StringBuffer中的value[]就是一个很普通的数组,而且可以通过append()方法将新字符串加入value[]末尾。这样也就改变了value[]的内容和大小了。

      比如:new StringBuffer("abc")使得value[]={'a','b','c','',''...}(注意构造的长度是str.length()+16)。如果再将这个对象append("abc"),那么这个对象中的value[]={'a','b','c','a','b','c',''....}。这也就是为什么大家说 StringBuffer是可变字符串 的涵义了。从这一点也可以看出,StringBuffer中的value[]完全可以作为字符串的缓冲区功能。

总结,讨论String和StringBuffer可不可变。本质上是指对象中的value[]字符数组可不可变,而不是对象引用可不可变。

StringBuffer和StringBuilder可以算是双胞胎了,这两者的方法没有很大区别,数组方面看上边 StringBuffer。


评分

参与人数 1黑马币 +2 收起 理由
java1 + 2 很给力!

查看全部评分

回复 使用道具 举报
String中的是常量数组,只能被赋值一次,也就是说赋值一次就变成只读的了
StringBuffer是可以改变数组内容和大小的,为可读可写
stringbuilder类被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候,它比 StringBuffer 要快两者的方法基本相同
回复 使用道具 举报
2楼说的很详细
回复 使用道具 举报
StringBuffer 和 StringBuilder 都是两种字符串处理类、StringBuffer是线程安全的、StringBuilder不是线程安全的。 所谓的线程安全问题就是同时有多个线程访问同一个资源时引起的数据混乱问题。StringBuffer是线程安全的,所以当它作为成员变量时不存在线程安全问题。StringBuilder是线程不安全的,在作为成员变量时有可能出现线程不安全问题。如果在方法内部使用一个这样的变量,用StringBuilder效率会更高,因为首先StringBuilder没有加锁,其次方法内部不存在线程安全问题。
数组就是同一种类型的存储(Object数组这种会丢失类型信息)。而且集合底层一般有两种实现方法,一种是数组,一种是链表。看用途,数组遍历快,插删慢。链表就反过来。一般能用集合就用集合,因为都优化过,比如不限长度可任意添加,还可以根据不同的环境使用不同优点的集合,比如有ArrayList,LinkedList都是List。各有优点,其它集合也是这样。
所以看使用环境

评分

参与人数 1黑马币 +1 收起 理由
java1 + 1 赞一个!

查看全部评分

回复 使用道具 举报
本帖最后由 lizhichao 于 2015-9-15 21:28 编辑

先说stringBuffer,Stringbuild和string字符串
         1:从方法上分 string里面紧紧包含了转换的方法。而stringBuffer和stringbuild里面有增删改查的方法。
         2:string里面的长度是固定的string不能被改变,也就是说string的每次赋值都是创建一个新的string对象。而stringbuffer和stringbuild 不是他们像是一个容器。不会创建新的对象只是在原有的对象上面添加元素罢了。这样的好处就是让电脑轻松一点。
         3:线程问题 安全的速度慢。 不安全的速度快,stringbuffer线程安全。另一个自己想。
总结:其实stringbuffer和stringbuild就是字符串的升级。字符串有的她有,字符串没有的它也有。


下面再说说集合与数组。参考上面的我想你也已经知道大概了。没错集合就是数组功能的升级强化。
         1:数组长度固定超过长度会角标越界,集合会随着元素的增加长度而自动变大。
         2:集合比数组多了一种便利方式。迭代器迭代。有一个迭代器的简写,增强for循环。
         3还记得老师在用数组教冒泡排序时自己满脑雾水吗?没错集合里面有排序的功能。他们是集合set的子类。在添加元素时就开始排序这是天才才能想到的吧?

好了细的就不多说了。大概就这些。

评分

参与人数 1黑马币 +2 收起 理由
java1 + 2 神马都是浮云

查看全部评分

回复 使用道具 举报
java1 初级黑马 2015-9-15 22:02:10
8#
15738320440 发表于 2015-9-14 22:17
StringBuffer, StringBuilder 都实现了CharSequence接口,意思都是字符序列,他们的底层都是用char ...

非常感谢,
回复 使用道具 举报
java1 初级黑马 2015-9-15 22:03:20
9#
zq110105 发表于 2015-9-14 22:20
String中的是常量数组,只能被赋值一次,也就是说赋值一次就变成只读的了
StringBuffer是可以改变数组内容 ...

谢谢啦,
回复 使用道具 举报
java1 初级黑马 2015-9-15 22:04:32
10#

依然很感谢
回复 使用道具 举报
java1 初级黑马 2015-9-15 22:05:34
11#
YC匪帮 发表于 2015-9-15 10:20
StringBuffer 和 StringBuilder 都是两种字符串处理类、StringBuffer是线程安全的、StringBuilder不是线程 ...

太谢谢您了
回复 使用道具 举报
java1 初级黑马 2015-9-15 22:06:36
12#
lizhichao 发表于 2015-9-15 21:26
先说stringBuffer,Stringbuild和string字符串
         1:从方法上分 string里面紧紧包含了转换的方法。 ...

十分的感谢
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马