--String s = "a" + "b" + "c" + "d";
一共创建了多少个对象?
--对于如下代码:
String s1 = "a";
String s2 = s1 + "b";
String s3 = "a" + "b";
System.out.println(s2 == "ab"); // false
System.out.println(s3 == "ab"); // true
说明javac编译可以对字符串常量直接相加的表达式进行优化,不必要等到运行期去进行加法运算处理,而是在编译时去掉其中的加号,直接将其编译成一个这些常量相连的结果。
对于String s = "a" + "b" + "c" + "d"; 相当于只创建了一个String对象。
String s = "a" + "b" + "c" + "d";
System.out.println( s == "abcd"); //true
--下面的程序输出的结果是什么?
public class Demo {
public static void main(String[] args) {
// TODO Auto-generated method stub
Demo d = new Demo();
int a = d.get();
System.out.println(a);
}
public int get(){
try{
return 1;
}
finally{
return 2;
}
}
}
--返回结果是2.
可以通过下面一个例子程序来帮助解释这个问题。
public class Demo {
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println(new Demo().test());
}
int test(){
try{
return func1();
}
finally{
return func2();
}
}
int func1(){
System.out.println("func1");
return 1;
}
int func2(){
System.out.println("func2");
return 2;
}
}
执行结果:
func1
func2
2
可以发现,try中的return语句调用的函数先于finally中调用的函数执行,也就是说return
func1()语句先执行,finally语句后执行,所以,返回的结果是2。return并不是让函数马上返回,而是return语句执行后,将把返回结果放置进函数栈中,此时语句并不是马上返回,他要执行finally语句后才真正的开始返回。
结论:finally中的代码在return和break语句后执行。
--final,finally,finalize的区别。
--final用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。内部类如果要访问局部变量,局部变量必须要定义成final类型。
finally是异常处理语句结构的一部分,表示总是执行。
finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。JVM不保证此方法总被调用。
--同步和异步有何不同,在什么情况下分别使用他们?
--如果数据将在线程间共享。例如正在写的数据以后可能被另一个线程读到,或者正在读的数据可能已经被另一个线程写过了,那么这些数据就是共享数据,必须进行同步存取。
当应用程序在对象上调用了一个需要花费很长时间来执行的方法,或者IO调用,并且不希望让程序等待方法的返回时,就应该使用异步编程,在很多情况下采用异步往往很有效率。
Java宝典(二)