数字游戏和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;
面试题,代码如下
- 当然JAVA也有做的不错的地方,像对集合(三大接口List,Map,Set)的操作,提供了丰富的工具类(java.util.Arrays,java.util.Collections),对象排序的两个接口,基本类型的包装类,也提供了对简单数据转换的方法,如下例:
一般有两种方式:
第一种用数据叠加后减回来
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对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树