黑马程序员技术交流社区
标题:
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