数字游戏和JAVA的一些坑

  • 面试题,如何不用临时变量,让整型变量A和B的值互换。
    一般有两种方式:
    第一种用数据叠加后减回来
    A=A+B;
    B=A-B;
    A=A-B;
    第二中是异或运算,异或运算是按照二进制进行“异或”的,对于A.B两个数字,如果某个二进制位上都是0,或都是1,则返回0,不同返回1,这样得到一个新的数字,当这个数字在与A异或,就可以得到B,技巧是二进制位上的一个加法单不进位的做法,按反向的规则还原数据,这个运算是最低级的CPU位运算,效率极高,不会越界。
    A=A^B;
    B=A^B;
    A=A^B;
  • 面试题,代码如下
/**
 * 
 * @author wangl
 * @deprecated Integer的“==”操作的坑 
 */
public class Int_Intetger {

    public static void main(String[] args) {
        Integer a = 2;//右边int数据赋值  会自动进行装箱操作,用的是Integer.valueOf(int i);
        Integer b = 2;
        Integer c = 200;
        Integer d = 200;
        System.out.println(a==b);//true
        System.out.println(c==d);//false
        System.out.println(c>=d);//true 进行大小比较时自动拆箱,比较的是int的值大小,所以正常
    }
    /**
     *Integer.valueOf(int i)源码 
     */
     public static Integer valueOf(int i) {
            assert IntegerCache.high >= 127;
            if (i >= IntegerCache.low && i <= IntegerCache.high)
                return IntegerCache.cache[i + (-IntegerCache.low)];
            return new Integer(i);
        }
}
Integer 是int的包装类,他是对象,按对象的规则储存在堆中,而栈只储存对象的引用地址,而int是基本数据类型,栈直接保存了他们的值,而不是引用,按理来说上面代码的例子是对象引用的比较,应该都输出false,实际上因为Integer的装箱方法,将-127到IntegerCache.high(默认127)内的数字,在第一次装箱的时候缓存了起来,后面用同一个引用,大于IntegerCache.high的才创建新的对象,所以会有上面的结果,其他基本类型的装箱方法有些也有这样处理(short,long),而double,float则没有cache。IntegerCache.high的值可以在jvm启动参数中设置。
这就是JAVA的API提供的坑,我们在使用时不注意就会出现问题,拆装箱操作在我们进行集合赋值时,一直在自动的进行,因为集合参数都是Object的,基本类型在存入取出时,会进行拆装箱,这样不知不觉就浪费大量空间。

- 当然JAVA也有做的不错的地方,像对集合(三大接口List,Map,Set)的操作,提供了丰富的工具类(java.util.Arrays,java.util.Collections),对象排序的两个接口,基本类型的包装类,也提供了对简单数据转换的方法,如下例:

public class CollectionsUtil {

    public static void main(String[] args) {
        List<String> a = new ArrayList<String>();
        a.add("a");
        a.add("b");
        a.add("c");
        List<String> b = Arrays.asList("a","b","c");//赋值简略写法

    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值