初始化顺序
-
题
public class Demo01 { public static void main(String[] args) { Card card = new Card(); card.f(); } } class Tag { Tag(int marker) { System.out.println("Tag(" + marker + ")"); } } class Card { Tag t1 = new Tag(1); Card() { System.out.println("Card()"); t3 = new Tag(33); } Tag t2 = new Tag(2); void f() { System.out.println("f()"); } Tag t3 = new Tag(3); }
在一个类里,初始化的顺序是由变量在类内的定义顺序决定的. 即使变量定义大量遍布于方法定义的中间,
那些变量仍会在调用任何方法之前得到初始化——甚至在构建器调用之前.Tag(1)
Tag(2)
Tag(3)
Card()
Tag(33)
f()
关于==
-
题
String str = "a" + "b" + 1;
的编译结果为:String str = "ab1";
因为都是常量,所以编译器认为叠加会得到固定值,就在编译时优化的.public class Demo02 { public static void main(String[] args) { test(); } public static void test() { String a = "a"; final String c = "a"; String b = a + "b"; String d = c + "b"; String e = getA() + "b"; String compare = "ab"; System.out.println(b == compare); System.out.println(d == compare); System.out.println(e == compare); } private static String getA() { return "a"; } } // false -- a作为局部变量,其值具有不确定性 // true -- 由于final不可变,编译器直接将c赋值为"a" // false -- 编译器不会查看getA()方法内部逻辑
交换变量
-
A
int temp = a; a = b; b = temp;
-
B:存在越界问题
a = a + b; b = a - b; a = a - b;
-
C:通过最低级的CPU位运算,效率极高,且不会越界
a = a ^ b; b = a ^ b; a = a ^ b;