0
点赞
收藏
分享

微信扫一扫

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


初始化顺序

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 条评论