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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 碧血丹心 初级黑马   /  2015-12-10 22:41  /  11568 人查看  /  43 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

5黑马币
String与StringBuilder的区别?(请全面具体分条陈述)

43 个回复

倒序浏览
String的内容不能更改,想更改引用的内容只能指向新地址;StringBuilder的内容能更改,这两个类的AP基本一致。顺便说一下,StringBuilder不是线程安全的!
回复 使用道具 举报
String与String与String与StringBuilder
String是不可变本质是一个char数组
StringBuilder底层是一个“可变数组”默认是十六个字节当向其中添加原素容量剩余不多就会新建一个更大的数组把原来数组中的内容复制到新数组中。
回复 使用道具 举报
类似Writer和BufferedWriter,StringBuilder是String的装饰类,不过是对String提供了更多的功能,比如反转等。至于底层,建议楼主还是百度看看更全面些
回复 使用道具 举报
String的内容不能更改,StringBuilder的内容能更改,
回复 使用道具 举报
http://blog.csdn.net/mad1989/article/details/26389541为什么自己不先查查呢...
回复 使用道具 举报
13651804082 来自手机 中级黑马 2015-12-11 18:23:26
7#
面试时可以回答
String是内容不可变的,而StringBuffer,StringBuilder都是内容可变的。
StringBuffer是同步的,数据安全,效率低;StringBuilder是不同步的,数据不安全,效率高
回复 使用道具 举报
林以 中级黑马 2015-12-11 22:48:19
8#

String的内容不能更改,
StringBuilder的内容可以更改,这两个类的API基本一致。
而且StringBuilder提供了更丰富的字符串处理方法
回复 使用道具 举报
hard 中级黑马 2015-12-12 12:11:55
9#
咱论坛里面有阳哥的Java基础里面介绍的很详细的
回复 使用道具 举报
本帖最后由 VisionDo 于 2015-12-12 14:07 编辑
public final class String
extends Object
implements Serializable, Comparable<String>, CharSequence
The String class represents character strings. All string literals in Java programs, such as "abc", are implemented as instances of this class.
Strings are constant; their values cannot be changed after they are created. String buffers support mutable strings. Because String objects are immutable they can be shared. For example:

     String str = "abc";

is equivalent to:

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

API:
公用不可修改类String继承自对象类,实现了可序列化,可比(与字符串可比),字符序列化
Java程序里的所有字符串常量,比如“abc”,都是该类的实例化。
字符串是常量。一旦被创建后,他们的值是不可改变的。字符串缓冲区支持可变字符串,因为字符串对象不可更改它们可以被共享。

<div class="quote"><blockquote>Class StringBuffer

java.lang.Object
java.lang.StringBuffer
All Implemented Interfaces:
Serializable, Appendable, CharSequence

public final class StringBuffer
extends Object
implements Serializable, CharSequence
A thread-safe, mutable sequence of characters. A string buffer is like a String, but can be modified. At any point in time it contains some particular sequence of characters, but the length and content of the sequence can be changed through certain method calls.
String buffers are safe for use by multiple threads. The methods are synchronized where necessary so that all the operations on any particular instance behave as if they occur in some serial order that is consistent with the order of the method calls made by each of the individual threads involved.



公用不可修改类StringBuffer继承自对象类,实现了可序列化,可追加,可字符序列化。
它是线程安全的可变字符序列。一个String Buffer就像一个字符串,但是,它可以被更改。在任意时间点,通过调用特定的方法,可以修改String Buffer中包含的特定字符串序列的内容和长度。
在多线程中使用String Buffer是安全的。在必要的情况下,对所有特定实例的操作都是同步的,比如每个命令的执行顺序是与那些调用他们的线程的顺序是一致的。


java.lang
Class StringBuilder

java.lang.Object
java.lang.StringBuilder
All Implemented Interfaces:
Serializable, Appendable, CharSequence

public final class StringBuilder
extends Object
implements Serializable, CharSequence
A mutable sequence of characters. This class provides an API compatible with StringBuffer, but with no guarantee of synchronization. This class is designed for use as a drop-in replacement for StringBuffer in places where the string buffer was being used by a single thread (as is generally the case). Where possible, it is recommended that this class be used in preference to StringBuffer as it will be faster under most implementations.


公用不可修改类StringBuffer继承自对象类,实现了可序列化,可追加,可字符序列化。
它是可变字符序列。该类提供了一个兼容StringBuffer的接口,但没有保证同步(个人理解为不可以在多线程中使用)。StringBuilder类被设计用来代替StringBuffer,当StringBuffer正在被被单线程使用的时候(在一般的情况)。如果可能的话,建议优先使用StringBuffer,因为StringBuffer更高效。

回复 使用道具 举报
String可以储存和操作字符串,即包含多个字符的字符数据。这个String类提供了存储数值不可改变的字符串。
回复 使用道具 举报
唐洪超 发表于 2015-12-12 20:46
String可以储存和操作字符串,即包含多个字符的字符数据。这个String类提供了存储数值不可改变的字符串。 ...

StringBuilder是线程不安全的,运行效率高,如果一个字符串变量是在方法里面定义,这种情况只可能有一个线程访问它,不存在不安全的因素了,则用StringBuilder。如果要在类里面定义成员变量,并且这个类的实例对象会在多线程环境下使用或者变量的内容不断变化,那么最好用StringBuffer。
回复 使用道具 举报
百度啊            
回复 使用道具 举报
String、StringBuffer、StringBuilder区别
StringBuffer、StringBuilder和String一样,也用来代表字符串。String类是不可变类,任何对String的改变都 会引发新的String对象的生成;StringBuffer则是可变类,任何对它所指代的字符串的改变都不会产生新的对象。既然可变和不可变都有了,为何还有一个StringBuilder呢?相信初期的你,在进行append时,一般都会选择StringBuffer吧!
先说一下集合的故事,HashTable是线程安全的,很多方法都是synchronized方法,而HashMap不是线程安全的,但其在单线程程序中的性能比HashTable要高。StringBuffer和StringBuilder类的区别也是如此,他们的原理和操作基本相同,区别在于StringBufferd支持并发操作,线性安全的,适 合多线程中使用。StringBuilder不支持并发操作,线性不安全的,不适合多线程中使用。新引入的StringBuilder类不是线程安全的,但其在单线程中的性能比StringBuffer高。

StringBuffer常用方法
(由于StringBuffer和StringBuilder在使用上几乎一样,所以只写一个,以下部分内容网络各处收集,不再标注出处)
StringBuffer s = new StringBuffer();
这样初始化出的StringBuffer对象是一个空的对象,
StringBuffer sb1=new StringBuffer(512);
分配了长度512字节的字符缓冲区。
StringBuffer sb2=new StringBuffer(“how are you?”)
创建带有内容的StringBuffer对象,在字符缓冲区中存放字符串“how are you?”

a、append方法
public StringBuffer append(boolean b)
该方法的作用是追加内容到当前StringBuffer对象的末尾,类似于字符串的连接,调用该方法以后,StringBuffer对象的内容也发生改 变,例如:
StringBuffer sb = new StringBuffer(“abc”);
sb.append(true);
则对象sb的值将变成”abctrue”
使用该方法进行字符串的连接,将比String更加节约内容,经常应用于数据库SQL语句的连接。

b、deleteCharAt方法
public StringBuffer deleteCharAt(int index)
该方法的作用是删除指定位置的字符,然后将剩余的内容形成新的字符串。例如:
StringBuffer sb = new StringBuffer(“KMing”);
sb. deleteCharAt(1);
该代码的作用删除字符串对象sb中索引值为1的字符,也就是删除第二个字符,剩余的内容组成一个新的字符串。所以对象sb的值变 为”King”。
还存在一个功能类似的delete方法:
public StringBuffer delete(int start,int end)
该方法的作用是删除指定区间以内的所有字符,包含start,不包含end索引值的区间。例如:
StringBuffer sb = new StringBuffer(“TestString”);
sb. delete (1,4);
该代码的作用是删除索引值1(包括)到索引值4(不包括)之间的所有字符,剩余的字符形成新的字符串。则对象sb的值是”TString”。

c、insert方法
public StringBuffer insert(int offset, boolean b),
该方法的作用是在StringBuffer对象中插入内容,然后形成新的字符串。例如:
StringBuffer sb = new StringBuffer(“TestString”);
sb.insert(4,false);
该示例代码的作用是在对象sb的索引值4的位置插入false值,形成新的字符串,则执行以后对象sb的值是”TestfalseString”。

d、reverse方法
public StringBuffer reverse()
该方法的作用是将StringBuffer对象中的内容反转,然后形成新的字符串。例如:
StringBuffer sb = new StringBuffer(“abc”);
sb.reverse();
经过反转以后,对象sb中的内容将变为”cba”。

e、setCharAt方法
public void setCharAt(int index, char ch)该方法的作用是修改对象中索引值为index位置的字符为新的字符ch。例如:
StringBuffer sb = new StringBuffer(“abc”);
sb.setCharAt(1,’D’);
则对象sb的值将变成”aDc”。

f、trimToSize方法
public void trimToSize()
该方法的作用是将StringBuffer对象的中存储空间缩小到和字符串长度一样的长度,减少空间的浪费,和String的trim()是一样的作用,不在举例。

g、length方法
该方法的作用是获取字符串长度 ,不用再说了吧。

h、setlength方法
该方法的作用是设置字符串缓冲区大小。
StringBuffer sb=new StringBuffer();
sb.setlength(100);
如果用小于当前字符串长度的值调用setlength()方法,则新长度后面的字符将丢失。

i、sb.capacity方法
该方法的作用是获取字符串的容量。
StringBuffer sb=new StringBuffer(“string”);
int i=sb.capacity();

j、ensureCapacity方法
该方法的作用是重新设置字符串容量的大小。
StringBuffer sb=new StringBuffer();
sb.ensureCapacity(32); //预先设置sb的容量为32

k、getChars方法
该方法的作用是将字符串的子字符串复制给数组。
getChars(int start,int end,char chars[],int charStart);
StringBuffer sb = new StringBuffer("I love You");
int begin = 0;
int end = 5;
//注意ch字符数组的长度一定要大于等于begin到end之间字符的长度
//小于的话会报ArrayIndexOutOfBoundsException
//如果大于的话,大于的字符会以空格补齐
char[] ch  = new char[end-begin];
sb.getChars(begin, end, ch, 0);
System.out.println(ch);


来源于→csdn
回复 使用道具 举报
Id_820 中级黑马 2015-12-14 21:49:45
15#
/**
                 * String其本质是采用字面值的方式赋值
                 * a.在赋值的时候,会去查找String Pool中是否存在"str"这个对象,如果存在,则会直接返回该对象的地址,然后付给变量str,
                 *   如果不存在 ,则会在String Pool中创建, 然后返回他的地址,付给str
                 */
                String str = "str";
               
               
                /**
                 * StringBuilder是一个可变的字符序列,
                 * 在JDK1.5以前是没有的, 在这之前都是用的StringBuffer, 所以StringBuiler是线程不安全的, 所以在使用上比StringBuffer效率稍微高一点
                 * 常见的方法:append, indexOf, insert, replace, toString等
                 */
                StringBuilder sb = new StringBuilder();
回复 使用道具 举报
Mykey 中级黑马 2015-12-14 22:11:09
16#
      String 类型和 StringBuffer 类型的主要性能区别其实在于 String 是不可变的 因此在每次对 String 类型进行改变的时候其实都等同于生成了一个新的 String 对象,然后将指针指向新的 String 对象,所以经常改变内容的字符串最好不要用 String ,因为每次生成对象都会对系统性能产生影响,特别当内存中无引用对象多了以后, JVM 的 GC 就会开始工作,那速度是一定会相当慢的。
      而如果是使用 StringBuffer 类则结果就不一样了,每次结果都会对 StringBuffer 对象本身进行操作,而不是生成新的对象,再改变对象引用。所以在一般情况下我们推荐使用 StringBuffer ,特别是字符串对象经常改变的情况下
回复 使用道具 举报
lixy 中级黑马 2015-12-15 22:36:17
17#
楼上都从技术层面上讲的差不多了,我说一下自己常用在哪。如果是写死的字符串,就用string,而要用到拼接字符串(类似扩容的地方),就用StringBuilder
回复 使用道具 举报
String是不可变字符串,StringBuilder是可变字符串。
回复 使用道具 举报
楼上都讲的差不多了,也没什么好补充的。字符串与字符串缓冲区,可以想象成水果和水果篮子
回复 使用道具 举报
String 是一个不可变的字符序列,一旦被创建值就不能被改变. 而 StringBuffer 和 StringBuilder 是可变的
        * StringBuffer        是一个线程安全的可变的字符序列,效率低
        * StringBuilder 是一个线程不安全的可变的字符序列,效率高. 如果是单线程环境建议使用 StringBuilder

        虽然 String 是一个应用数据类型,但是在作为参数传递的时候,是按照基本数据类型的方式进行传递,传递的是具体的值
回复 使用道具 举报
123下一页
您需要登录后才可以回帖 登录 | 加入黑马