初始化顺序、==、AB交换

来源:互联网 发布:java吧 编辑:程序博客网 时间:2024/06/05 06:49

初始化顺序

  • 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;
0 0