黑马程序员技术交流社区

标题: JAVA的面试题 [打印本页]

作者: yangkaiwei    时间: 2016-5-4 01:02
标题: JAVA的面试题
String 和StringBuffer的区别?
JAVA平台提供了两个类:String和StringBuffer,它们可以储存和操作字符串,即包含多个字符的字符数据,请问两个区别和联系?
{:2_31:}
作者: Midicy    时间: 2016-5-4 08:20
1、执行速度方面的比较: StringBuffer  >  String
2、String是“字符创常量”,也就是不可改变的对象。StringBuffer就不一样了,它是字符串变量,是可改变的对象,每当我们用它对字符串做操作时,实际上是在一个对象上操作的,这样就不会像String一样创建一些而外的对象进行操作了,当然速度就快了。
3、如果要操作少量的数据用 = String ; 多线程操作字符串缓冲区 下操作大量数据 = StringBuffer
作者: 小K哥    时间: 2016-5-4 09:32
String内容不可变,StringBuffer内容可变。StringBuffer最终也是一个字符串。
作者: okchenyang44    时间: 2016-5-4 11:10
我不是很清楚
作者: 好大一只    时间: 2016-5-4 11:36
字符串常量和字符串变量
作者: 18573626921    时间: 2016-5-4 11:55
一个是可变的一个不可变
作者: ls20090726    时间: 2016-5-4 12:48
不可变字符序列和可变字符序列
作者: chenghaoming    时间: 2016-5-4 13:55
不可变字符序列和可变字符序列
作者: SilentMax    时间: 2016-5-4 13:58
StringBuffer是一个字符串缓冲区
作者: lijian    时间: 2016-5-4 14:02
1、String字符串一旦被初始化是不能更改的,StringBuffer是可以对字符串进行更改的;
作者: lijian    时间: 2016-5-4 14:20
1、String字符串一旦被初始化是不能更改的,StringBuffer是可以对字符串进行更改的;
2、StringBuffer是一个长度可变的容器,它可以直接操作多个数据类型
3、StringBuffer可以通过toString方法转换成字符串;
4、String类和StringBuffer类有很多方法是相同的
作者: AAAheilong    时间: 2016-5-4 21:25
联系:它们都可以储存和操作字符串,可以相互转换
作者: hmcxypzq    时间: 2016-5-4 21:46
赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞
作者: wkong    时间: 2016-5-4 21:48
区别:
String是一个不可变的字符序列,StringBuffer是一个可变的字符序列
联系:
A:String -- StringBuffer
        * a:通过构造方法
        * b:通过append()方法
* B:StringBuffer -- String
        * a:通过构造方法
        * b:通过toString()方法
        * c:通过subString(0,length);
作者: yuanzhen    时间: 2016-5-4 22:22
的顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶
作者: 15127673623    时间: 2016-5-4 22:25
别:
String是一个不可变的字符序列,StringBuffer是一个可变的字符序列
联系:
A:String -- StringBuffer
* a:通过构造方法
* b:通过append()方法
* B:StringBuffer -- String
* a:通过构造方法
* b:通过toString()方法
* c:通过subString(0,length);
作者: jiang0409    时间: 2016-5-4 22:25
1、String字符串一旦被初始化是不能更改的,StringBuffer是可以对字符串进行更改的;
2、StringBuffer是一个长度可变的容器,它可以直接操作多个数据类型
3、StringBuffer可以通过toString方法转换成字符串;
4、String类和StringBuffer类有很多方法是相同的
作者: ybqred    时间: 2016-5-4 22:26
一生只为黑马币!
作者: liuyu123    时间: 2016-5-4 22:31
涨姿势~
作者: zhangjinbu    时间: 2016-5-4 22:34
1.三者在执行速度方面的比较:StringBuilder > StringBuffer > String
  2.String <(StringBuffer,StringBuilder)的原因
    String:字符串常量
    StringBuffer:字符创变量
    StringBuilder:字符创变量
    从上面的名字可以看到,String是“字符创常量”,也就是不可改变的对象。对于这句话的理解你可能会产生这样一个疑问 ,比如这段代码:
1 String s = "abcd";
2 s = s+1;
3 System.out.print(s);// result : abcd1
作者: 18895700133    时间: 2016-5-4 22:34
1、String字符串一旦被初始化是不能更改的,StringBuffer是可以对字符串进行更改的;
2、StringBuffer是一个长度可变的容器,它可以直接操作多个数据类型
3、StringBuffer可以通过toString方法转换成字符串;
4、String类和StringBuffer类有很多方法是相同的
作者: xiangzhuni886    时间: 2016-5-4 22:37
一生只为黑马币!
作者: 幻影之舞    时间: 2016-5-4 22:37
一生只为黑马币!
作者: 18895700133    时间: 2016-5-4 22:38
1、String字符串一旦被初始化是不能更改的,StringBuffer是可以对字符串进行更改的;
2、StringBuffer是一个长度可变的容器,它可以直接操作多个数据类型
3、StringBuffer可以通过toString方法转换成字符串;
4、String类和StringBuffer类有很多方法是相同的
作者: z195061    时间: 2016-5-4 22:38
String字符串一旦被初始化是不能更改的,StringBuffer是可以对字符串进行更改的;
StringBuffer是一个长度可变的容器,它可以直接操作多个数据类型
StringBuffer可以通过toString方法转换成字符串;
String类和StringBuffer类有很多方法是相同的

作者: 我是黑    时间: 2016-5-4 22:39
String 表示的是字符串,一旦被赋值,就不能被改变,是常量,
StringBuffer表示存放字符的容器,这样理解快一点

作者: 00零度00    时间: 2016-5-4 22:40
String是字符串常量,StringBuffer可以改变
作者: 冯领峰    时间: 2016-5-4 22:42
一个可变,一个不能改变
作者: dujia121508394    时间: 2016-5-4 22:43
String是固定长度的字符串,StringBuffer是可变长度的字符串,String类型的字符串如果操作次数很多,就有可能出现栈内存溢出
作者: saiqqww234    时间: 2016-5-4 22:44
666666666666
作者: wenle00    时间: 2016-5-4 22:44
String内容不能改变,StringBuffer内容可改变
作者: hlh    时间: 2016-5-4 22:54
string的是不可变的字符串而Stringbuffer是可变的字符串
作者: wanli316644570    时间: 2016-5-4 23:08
每天点到啦
作者: lz19918888    时间: 2016-5-4 23:10
同求解答?
作者: 大宝剑大飞机    时间: 2016-5-4 23:11
1、String字符串一旦被初始化是不能更改的,StringBuffer是可以对字符串进行更改的;
2、StringBuffer是一个长度可变的容器,它可以直接操作多个数据类型
3、StringBuffer可以通过toString方法转换成字符串;
4、String类和StringBuffer类有很多方法是相同的
作者: 进击的鬼笔环肽    时间: 2016-5-4 23:16
一个在常量池,一个在堆
作者: Bruin4Android    时间: 2016-5-4 23:19
string 是不可变的,stringbuffer可变

作者: lujianfeng221    时间: 2016-5-4 23:20
String是不可以变的字符序列,StringBufeng是可以字符序列
作者: 日月当空    时间: 2016-5-4 23:21
String  和stringBuffer之间可以相互转换String 在常量池   StringBuffer 在缓冲区

作者: 黎贵福    时间: 2016-5-4 23:29
sTring是字符串,sTringbuffer是字符串缓冲区,是方法
作者: LexBurner    时间: 2016-5-4 23:30
String是不可变字符,StringBuffer是可变字符!
作者: wh19900105    时间: 2016-5-4 23:30
还没有学到这里啊
作者: 微米    时间: 2016-5-4 23:39
String是不可变的字符 视频之前有讲到  StringBuffer是可变的 因为String不能变 提供个StringBuffer 可以进行一系列的操作
作者: 今日微风    时间: 2016-5-4 23:40
我还没学
作者: runner    时间: 2016-5-4 23:50
赞一个,可以的
作者: leifuhua    时间: 2016-5-4 23:52
我还没学
作者: zhangzhibo    时间: 2016-5-4 23:56
赞一个!!
作者: qwe0754444    时间: 2016-5-5 00:03
还没学习 先mark先 嘻嘻
作者: 小小M    时间: 2016-5-5 00:06
1楼霸气
作者: hmcxypzq    时间: 2016-5-5 00:09
赞赞赞赞赞赞赞赞重中之重
作者: wxw_0818    时间: 2016-5-5 00:20
大牛牛牛牛
作者: rr53521    时间: 2016-5-5 00:43
StringBuffer是字符串缓冲区
作者: 百里青山    时间: 2016-5-5 00:45
好好学习,天天向上
作者: yangkaiwei    时间: 2016-5-5 00:54
String类表示内容不可改变的字符串。而StringBuffer类表示内容可以被修改的字符串,所以可以StringBuffers来动态构造字符数据,String覆盖了equals方法和hashCode方法,而StringBuffer没有覆盖equals方法和hashCode方法,所以,将StringBuffer对象存储进Java集合类中时会出现问题.
作者: wxw_0818    时间: 2016-5-5 00:55
好好学习,天天向上
作者: yangkaiwei    时间: 2016-5-5 00:59
jiang0409 发表于 2016-5-4 22:25
1、String字符串一旦被初始化是不能更改的,StringBuffer是可以对字符串进行更改的;
2、StringBuffer是一 ...

StringBuffer 的效率应该是要比String的效率要高些.
作者: yangkaiwei    时间: 2016-5-5 01:09
String与StringBuffer的区别
简单地说,就是一个变量和常量的关系。StringBuffer对象的内容可以修改;而String对象一旦产生后就不可以被修改,重新赋值其实是两个对象。
StringBuffer的内部实现方式和String不同,StringBuffer在进行字符串处理时,不生成新的对象,在内存使用上要优于String类。所以在实际使用时,如果经常需要对一个字符串进行修改,例如插入、删除等操作,使用StringBuffer要更加适合一些。
String:在String类中没有用来改变已有字符串中的某个字符的方法,由于不能改变一个Java字符串中的某个单独字符,所以在JDK文档中称String类的对象是不可改变的。然而,不可改变的字符串具有一个很大的优点:编译器可以把字符串设为共享的。
StringBuffer:StringBuffer类属于一种辅助类,可预先分配指定长度的内存块建立一个字符串缓冲区。这样使用StringBuffer类的append方法追加字符 比 String使用 + 操作符添加字符 到 一个已经存在的字符串后面有效率得多。因为使用 + 操作符每一次将字符添加到一个字符串中去时,字符串对象都需要寻找一个新的内存空间来容纳更大的字符串,这无凝是一个非常消耗时间的操作。添加多个字符也就意味着要一次又一次的对字符串重新分配内存。使用StringBuffer类就避免了这个问题。
StringBuffer是线程安全的,在多线程程序中也可以很方便的进行使用,但是程序的执行效率相对来说就要稍微慢一些。
StringBuffer的常用方法
StringBuffer类中的方法要偏重于对字符串的变化例如追加、插入和删除等,这个也是StringBuffer和String类的主要区别。
1、append方法
public StringBuffer append(boolean b)
该方法的作用是追加内容到当前StringBuffer对象的末尾,类似于字符串的连接。调用该方法以后,StringBuffer对象的内容也发生改变,例如:
StringBuffer sb = new StringBuffer(“abc”);
sb.append(true);
则对象sb的值将变成”abctrue”。
使用该方法进行字符串的连接,将比String更加节约内容,例如应用于数据库SQL语句的连接,例如:
StringBuffer sb = new StringBuffer();
String user = “test”;
String pwd = “123”;
sb.append(“select * from userInfo where username=“)
.append(user)
.append(“ and pwd=”)
.append(pwd);
这样对象sb的值就是字符串“select * from userInfo where username=test and pwd=123”。
2、deleteCharAt方法
public StringBuffer deleteCharAt(int index)
该方法的作用是删除指定位置的字符,然后将剩余的内容形成新的字符串。例如:
StringBuffer sb = new StringBuffer(“Test”);
sb. deleteCharAt(1);
该代码的作用删除字符串对象sb中索引值为1的字符,也就是删除第二个字符,剩余的内容组成一个新的字符串。所以对象sb的值变为”Tst”。
还存在一个功能类似的delete方法:
public StringBuffer delete(int start,int end)
该方法的作用是删除指定区间以内的所有字符,包含start,不包含end索引值的区间。例如:
StringBuffer sb = new StringBuffer(“TestString”);
sb. delete (1,4);
该代码的作用是删除索引值1(包括)到索引值4(不包括)之间的所有字符,剩余的字符形成新的字符串。则对象sb的值是”TString”。
3、insert方法
public StringBuffer insert(int offset, String s)
该方法的作用是在StringBuffer对象中插入内容,然后形成新的字符串。例如:
StringBuffer sb = new StringBuffer(“TestString”);
sb.insert(4,“false”);
该示例代码的作用是在对象sb的索引值4的位置插入字符串false,形成新的字符串,则执行以后对象sb的值是”TestfalseString”。
4、reverse方法
public StringBuffer reverse()
该方法的作用是将StringBuffer对象中的内容反转,然后形成新的字符串。例如:
StringBuffer sb = new StringBuffer(“abc”);
sb.reverse();
经过反转以后,对象sb中的内容将变为”cba”。
5、setCharAt方法
public void setCharAt(int index, char ch)
该方法的作用是修改对象中索引值为index位置的字符为新的字符ch。例如:
StringBuffer sb = new StringBuffer(“abc”);
sb.setCharAt(1,’D’);
则对象sb的值将变成”aDc”。
6、trimToSize方法
public void trimToSize()
该方法的作用是将StringBuffer对象的中存储空间缩小到和字符串长度一样的长度,减少空间的浪费。
7、构造方法:
StringBuffer s0=new StringBuffer();分配了长16字节的字符缓冲区
StringBuffer s1=new StringBuffer(512);分配了512字节的字符缓冲区
8、获取字符串的长度: length()
StringBuffer s = new StringBuffer("www");
int i=s.length();
m.返回字符串的一部分值
substring(int start) //返回从start下标开始以后的字符串
substring(int start,int end) //返回从start到 end-1字符串
9.替换字符串
replace(int start,int end,String str)
s.replace(0,1,"qqq");
10.转换为不变字符串:toString()。
作者: yangkaiwei    时间: 2016-5-5 01:10
最近学习到StringBuffer,心中有好些疑问,搜索了一些关于String,StringBuffer,StringBuilder的东西,现在整理一下。

关于这三个类在字符串处理中的位置不言而喻,那么他们到底有什么优缺点,到底什么时候该用谁呢?下面我们从以下几点说明一下

  1.三者在执行速度方面的比较:StringBuilder >  StringBuffer  >  String

  2.String <(StringBuffer,StringBuilder)的原因

    String:字符串常量

    StringBuffer:字符创变量

    StringBuilder:字符创变量

    从上面的名字可以看到,String是“字符创常量”,也就是不可改变的对象。对于这句话的理解你可能会产生这样一个疑问  ,比如这段代码:

1 String s = "abcd";
2 s = s+1;
3 System.out.print(s);// result : abcd1


      我们明明就是改变了String型的变量s的,为什么说是没有改变呢? 其实这是一种欺骗,JVM是这样解析这段代码的:首先创建对象s,赋予一个abcd,然后再创建一个新的对象s用来    执行第二行代码,也就是说我们之前对象s并没有变化,所以我们说String类型是不可改变的对象了,由于这种机制,每当用String操作字符串时,实际上是在不断的创建新的对象,而原来的对象就会变为垃圾被GC回收掉,可想而知这样执行效率会有多底。

     而StringBuffer与StringBuilder就不一样了,他们是字符串变量,是可改变的对象,每当我们用它们对字符串做操作时,实际上是在一个对象上操作的,这样就不会像String一样创建一些而外的对象进行操作了,当然速度就快了。

  3.一个特殊的例子:

1 String str = “This is only a” + “ simple” + “ test”;
3 StringBuffer builder = new StringBuilder(“This is only a”).append(“ simple”).append(“ test”);


  

    你会很惊讶的发现,生成str对象的速度简直太快了,而这个时候StringBuffer居然速度上根本一点都不占优势。其实这是JVM的一个把戏,实际上:

    String str = “This is only a” + “ simple” + “test”;

    其实就是:

    String str = “This is only a simple test”;

    所以不需要太多的时间了。但大家这里要注意的是,如果你的字符串是来自另外的String对象的话,速度就没那么快了,譬如:

    String str2 = “This is only a”;

    String str3 = “ simple”;

    String str4 = “ test”;

    String str1 = str2 +str3 + str4;

    这时候JVM会规规矩矩的按照原来的方式去做。

  4.StringBuilder与 StringBuffer

    StringBuilder:线程非安全的

    StringBuffer:线程安全的

    当我们在字符串缓冲去被多个线程使用是,JVM不能保证StringBuilder的操作是安全的,虽然他的速度最快,但是可以保证StringBuffer是可以正确操作的。当然大多数情况下就是我们是在单线程下进行的操作,所以大多数情况下是建议用StringBuilder而不用StringBuffer的,就是速度的原因。



           对于三者使用的总结: 1.如果要操作少量的数据用 = String

                        2.单线程操作字符串缓冲区 下操作大量数据 = StringBuilder

                        3.多线程操作字符串缓冲区 下操作大量数据 = StringBuffer
作者: zhoubinjian    时间: 2016-5-5 02:58
我是来学习的
作者: jialianghao    时间: 2016-5-5 07:01
区别:StringBuffer是可变的字符序列
         String是不可变的字符序列
作者: 子豪_kTa58    时间: 2016-5-5 08:27
一个可变的,一个不可变的,StringBu有append()方法添加字符串
作者: liuqjss    时间: 2016-5-5 08:59
String对象一创建就不会发生变化,StringBuffer只创建一个对象,但可以增删改查,效率高,可以toString
作者: liuqjss    时间: 2016-5-5 09:01
学习了,{:2_34:}
作者: 精彩    时间: 2016-5-5 09:12
学习一下
作者: 小红花    时间: 2016-5-5 09:25
学习了。。。。
作者: WDzyll    时间: 2016-5-5 10:06
茅塞顿开,提前了解了
作者: zhangzhen33053    时间: 2016-5-5 10:12
string是常量,stringBuffer是可变的!
作者: HackSon    时间: 2016-5-5 13:38
String是定长的,一旦创建就不被曝光更改其长度,而StringBuffer是变长的,创建之后还可以修改长度
作者: HackSon    时间: 2016-5-5 13:54
String是可变的,一旦创建就不可修改其长度,而StringBuffer 是可变的,创建完成后可以通过指定的方法对其内容进行修改
作者: 追忆睡梦已醒    时间: 2016-5-5 14:45
还在基础阶段。。。。。
作者: 丿若恋灬如初    时间: 2016-5-5 16:03
学习学习




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2