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"); //false7 System.out.println(s3=="ab"); //true8 }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 110 Point 211 Point 312 Performing cleanup13 Initialization that requires cleanup14 Point 115 Point 216 Point 317 End18 Performing cleanup
所以,try{}里的return不是让函数马上结束返回,而是return语句执行后,将结果放置进函数栈中,此时函数并不是马上返回,而是要执行完finally语句后才真正返回。