初始化顺序、==、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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值