String和StringBuffer的区别

String和StringBuffer的区别

      String和StringBuffer都可以存储和操作字符串,即包含多个字符的字符数据。String类表示内容不可以改变的字符串。而StringBuffer类表示内容可以被修改的字符串。当你知道字符数据要改变的时候就可以使用StringBuffer。你可以使用StringBuffer来动态构造字符数据。另外,String覆盖了equals方法(也覆盖了hashCode方法),new String("abc").equals(new String("abc"))的结果为true,而StringBuffer没有实现equals方法,所以,new StringBuffer("abc").equals(new StringBuffer("abc"))的结果为false。

 

StringBuffer与StringBuilder的区别

  StringBuffer和StringBuilder类都可以表示内容可以修改的字符串,StringBuilder是线程不安全的,即不同步的,运行效率高,如果一个字符串变量是在方法里面定义的,这种情况只可能有一个线程访问他,不存在不安全的因素,则用StringBuilder。如果要在类里面定义成员变量,并且这个类的实例对象会在多个线程环境下使用,那么最好用StringBuffer。

 

如何把一段逗号分隔的字符串转换成一个数组?

  用split(String regex):根据给定正则表达式的匹配拆分此字符串,返回字符串数组。regex——定界正则表达式。

 

数组有没有length()这个方法?String有没有length()这个方法?

  数组没有length()这个方法,有length的属性。String有length()这个方法。

 

下面这条语句一共创建了多少个对象:String s="a"+"b"+"c"+"d";

  在得到答案之前,请看如下代码:

1 public class Demo{
2     public static void main(String args[]){
3         String s1="a";
4         String s2=s1+"b";  //s2的引用指向了新创建的对象“ab”
5         String s3="a"+"b"; //s3的引用指向常量池中的“ab”
6         System.out.println(s2=="ab");  //false
7         System.out.println(s3=="ab");  //true
8     }
9 }

  第六行打印的结果为false,第七行打印的结果为true,这说明javac编译可以对字符串常量直接相加的表达式进行优化,不必等到运行期去进行加法运算处理,而是在编译时去掉其中的加号,直接将其编译成一个这些常量相连的结果。

  题目中的代码被编译器在编译时优化后,相当于直接定义了一个“abcd”的字符串,所以,所以,上面的代码应该只创建了一个String对象。

String s="a"+"b"+"c"+"d";
System.out.println(s=="abcd");  //true

 

try{}里面有一个return语句,那么紧跟在这个try后的finally{}里的代码会不会被执行,什么时候被执行,在return前还是后?

  虽然网上流传的答案是return前,我觉得应该在return后。首先finally{}中的代码肯定会被执行的。finally被用来清理工作,在Java中,需要清理的资源包括:已经打开的文件或网络连接,在屏幕上画的图形,甚至可以是外部世界的某个开关。

  引自Thinking in Java:

    在return中使用finally

    因为finally子句总是会执行的,所以在一个方法中,可以从多个点返回,并且可以保证重要的清理工作仍旧会执行:

 1 public class MultipleReturns{
 2     public static void f(int i){
 3         System.out.println("Initialization that requires cleanup");
 4         try{
 5             System.out.println("Point 1");
 6             if(i==1) return;       
 7             System.out.println("Point 2");
 8             if(i==2) return;
 9             System.out.println("Point 3");
10             if(i==3) return;
11             System.out.println("End");
12             return;
13         }finally{
14             System.out.println("Performing cleanup");
15         }
16        }
17         public static void main(String[] args){
18             for(int i=1;i<=4;i++){
19                  f(i);
20             }
21         }}

输出结果:

 1 Initialization that requires cleanup
 2 Point 1
 3 Performing cleanup
 4 Initialization that requires cleanup
 5 Point 1
 6 Point 2
 7 Performing cleanup
 8 Initialization that requires cleanup
 9 Point 1
10 Point 2
11 Point 3
12 Performing cleanup
13 Initialization that requires cleanup
14 Point 1
15 Point 2
16 Point 3
17 End
18 Performing cleanup

     所以,try{}里的return不是让函数马上结束返回,而是return语句执行后,将结果放置进函数栈中,此时函数并不是马上返回,而是要执行完finally语句后才真正返回。

 

posted @ 2014-02-28 19:59  我是大嘴猴  阅读(2499)  评论(0编辑  收藏  举报