String、StringBuffer与StringBuilder之间区别(转)

String、StringBuffer与StringBuilder之间区别

  最近学习到StringBuffer,心中有好些疑问,搜索了一些关于String,StringBuffer,StringBuilder的东西,现在整理一下。
关于这三个类在字符串处理中的位置不言而喻,那么他们到底有什么优缺点,到底什么时候该用谁呢?下面我们从以下几点说明一下
  1.三者在执行速度方面的比较:StringBuilder > StringBuffer > String
  2.String <(StringBuffer,StringBuilder)的原因
    String:字符串常量
    StringBuffer:字符创变量
    StringBuilder:字符创变量
    从上面的名字可以看到,String是“字符创常量”,也就是不可改变的对象。对于这句话的理解你可能会产生这样一个疑问 ,比如这段代码:

String s = "abcd";
s = s+1;
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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1给定如下Java程序,编译运行时,将在()出现错误。(选一项) public class Test{ public static void main(String[]args){ int i= 0; //a语句 for(;i5){ String test = “hello”; //c语句 } } System.out.println(test); //d语句 } } A.a B.b C.c D.d(出作用域) 2在Java中,下列代码的运行结果是()。(选一项) public static void main(String[]args){ int a = 1,b=2,c=3; if(a<0){ if(b<0) c=10; else c=20; } System.out.pritnln(c); } A.输出:10 B.输出:20 C.输出:3 D.编译错误 3给定如下Java代码片段,编译运行时的结果是()。(选一项) int i= 2; switch(i) { default: System.out.pritnln(“default”); case 0: System.out.println(“zero”); break; case 1: System.out.pritnln(“one”); break; case 2: System.out.println(“two”); } A输出:default B输出:default C输出:two zero D编译出错,default语句的位置不符合switch结构的语法结构 4在Java中,要向控制台打印输出“Welcome to Space!”并自动换行,可以实现此功能的语句是()。(选一项) a) System.print(“Wecome to Space!”); b) System.out.print(“Wecomr to Space!”); c) System.out.println(“Wecome to Space!”); d) System.println(“Wecome to Space!”); 5分析下面的Java源程序,编译后的运行结果是()。(选一项) import java,util.*; public class Test{ public static void main(String[] args){ int[]numbers = new int[]{2,1,3}; Arrays.sort(numbers); System.out.println(Arrays.binarySearch(numbers,2)); } } A.输出:0 B.输出:1 C.输出:2 D.输出:3 6分析下面的Java程序,编译运行结果是()。(选一项) public class B{ public static void main(String[]args){ String s =”y”; System.out.println(s+1+2); System.out.println(1+2+s); } } A输出:y12 B输出:y12 C输出:y3 D程序编译出错 3y 12y 3y 7分析下面的Java代码片段,编译运行后的输出结果是()。(选一项) for(int i = 0;i<6;i++){ int k = ++i; while(k<5){ System.out.print (i); break; } } A.024 B.02 C.123 D.13 8在Java中,源文件Test.java中包含如下代码段,则程序编译运行结果是( )。(选择一项) public class Test{ public static main (String [ ] args) { system.out.print(“Hello!”); } } A输出:Hello! B编译出错,提示“无法解析system” C运行正常,但没有输出任何内容 D运行时出现异常 9在Java中,给定代码片段如下所示,则编译运行后,输出的结果是()。(选择一项) for (int i = 0; i < 10; i++) { if(i==10-i){ break; } if(i%3!=0){ continue; } System.out.print(i+" ");} A.0 B.0 3 C.0 3 6 D.0 3 6 9 10分析下面JAVA程序段,编译运行后的输出结果是().(选择l项) public class Test{ public void changeString(StringBuffer s){ s.append(“stringbuffer2”); } Public static void main(String[] args){ Test a = new Test(); StringBuffer sb = new StringBuffer(“stringbuffer1”); a.changeString(sb); System.out.println(“sb=”+sb); } } A.sb=stringbuffer2stringbuffer1 B.sb=stringbuffer1 C.sb=stringbuffer2 D.sb=stringbuffer1stringbuffer2 11给定一个Java程序的代码如下所示,则编译运行后,输出结果是()。(选择一项) public class Test { int count=9; public void count(){ System.out.println("count="+count++); } public static void main(String[] args) { new Test().count(); new Test().count(); } } A.count=9 B.count=10 C.count=10 D.count=9 count=9 count=9 count=10 count=10 12在Java语言中,有如下代码: (选择两项) switch(x){ case 100: System.out.println(“One hundred”); break; case 200: System.out.println(“Two hundred”); break; case 300: System.out.println(“Three hundred”); break; } 下列x的定义中,()可能使得上段代码编译通过。 A.double x=100; B.char x=100; C.String x=”100”; D.Int x=100; 13给定如下所示的Java代码,要使这段代码能够编译成功,横线处应该填入( )。(选择一项) Public______count(int i,double d){ return i*d; } A.void B.int C.char D.double 14在java中,源文件Test.java中包含如下代码段,则编译运行结果是(). public class HelloWorld{ public static void main(String[] args){ System.out.print(“Hello World!”); } } A输出:Hello Word! B编译出错,提示“共有类HelloWorld 必须在HelloWorld.java文件中定义”。 C运行正常,但没有输出内容 D运行时出现异常。 15java类的main方法如下所示,当程序启动运行后,用户在控制台输入“你好”,则程序将()。(选择一项) public static void main(String args[]){ Scanner input=new Scanner(System.in); int score=input.nexInt(); System.out.println(score); } A输出“你好” B输出“你“ C程序运行正常,但是不输出任何内容。 D程序出现错误,被中断,提示输入内容不匹配,无法获得整型数值。 16分析如下所示的Java代码,编译运行后的输出结果是( )。 (选择一项) public static void main(String arg [ ] ) { boolean b = true; System.out.print(b); if (b) { System.out.print(“真”); } else { System.out.print(“假”); } } A.true B.true 真 C.tere 假 D.1 17在Java中,Scanner类提供从控制台获取键盘输入的功能,下列语句()能够正确实例化Scanner类的对象,用于获得键盘输入的数据。(选一项) a) Scanner input = new Scanner(System.out); b) Scanner input = new Scanner(System.in); c) Scanner input = new Scanner(System); d) Scanner input = new Scanner(); 18关于Java类中带参数的方法,下列选项中的说法错误的是( )。 (选择一项) A使用带参数的方法分为两步:1.定义带参数的方法:2.调用带参数的方法 B带参数方法的返回值不能为void C带参数方法的参数个数可以为一个或多个 D带参数方法的参数可以是任意的基本类型数据或引用类型数据 19在Java语言的控制结构中,break语句是经常用到的语句。下面一段代码中break语句起到( )的作用。 (选择一项) int pointer=0; while(pointer<=10){ switch(pointer%3){ case 1: pointer+=1; break; case 2: pointer+=2; break; default: pointer+=3; break; } } A结束当次循环,使控制权直接移到控制循环的条件表达式 B从嵌套循环内部跳出最里面的循环 C终止switch语句的语句序列,提高switch-case语句性能 D退出循环

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值