您的位置:首页 > 编程语言 > Java开发

数字游戏和JAVA的一些坑

2016-03-29 17:38 393 查看
面试题,如何不用临时变量,让整型变量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");//赋值简略写法

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java