关于Integer大小比较的问题
昨天跟朋友一起吃饭,他说到两个Integer类型值比较是否相等的问题。经理也在这里把java的Integer值比较的问题拿出来说一说。因为在面试的时候这个是经常遇到的问题。
首先给大家看一个例子:
1public class Test {
2
3 /**
4 * 关于Integer大小比较问题
5 * @author 经理
6 */
7 public static void main(String[] args) {
8 Integer a = 10;
9 Integer b = 10;
10 System.out.println("a==b : " + String.valueOf(a==b));
11 System.out.println("a.equals(b) : " + String.valueOf(a.equals(b)));
12 }
13}
14
运行一下,在控制台得到的结果是这样的
a==b : true
a.equals(b) : true
当是当我们变换一下值
1public class Test {
2
3 /**
4 * 关于Integer大小比较问题
5 * @author 经理
6 */
7 public static void main(String[] args) {
8 Integer a = 1000;
9 Integer b = 1000;
10 System.out.println("a==b : " + String.valueOf(a==b));
11 System.out.println("a.equals(b) : " + String.valueOf(a.equals(b)));
12 }
13}
运行一下,控制台的结果又是
a==b : false
a.equals(b) : true
这是什么原因呢?我当时也有点犯糊涂。有点冲动就直接开源码看了。
实际上在我们用Integer a = 数字;来赋值的时候Integer这个类是调用的public static Integer valueOf(int i)这个方法。
1public static Integer valueOf(int i) {
2 if(i >= -128 && i <= IntegerCache.high)
3 return IntegerCache.cache[i + 128];
4 else
5 return new Integer(i);
6 }
我们来看看ValueOf(int i)的代码,可以发现他对传入参数i做了一个if判断。在-128<=i<=127的时候是直接用的int原始数据类型,而超出了这个范围则是new了一个对象。我们知道"=="符号在比较对象的时候是比较的内存地址,而对于原始数据类型是直接比对的数据值。那么这个问题就解决了。
至于为什么用int型的时候值会在-128<=i<=127范围呢呢?我们知道八位二进制的表示的范围正好就是-128到127。大概就是因为这吧。
把平时出现的问题记录下来,自己就可以一点一点进步了。
分享到:
相关推荐
HugeInteger Class) Create a class HugeInteger that uses a 40-element array of digits to store integers as large as 40 digits each. Provide member functions input, output, add and subtract. For ...
/home/data/anaconda3/lib/python3.7/site-packages/pymysql/cursors.py:170: Warning: (1681, 'Integer display width is deprecated and will be removed in a future release.') result = self._query(query) ...
义一个整数集合类integerSet。这种类型的对象可以存储10个20~80之间的整数,即他的内部有一个整型数组存储数据。编程: (1) 判断两个inergerSet类对象S1和S2是否相等。提示:集合相等的前提是所有元素相等。 (2)...
Clock_Integer 指令库应用例程rar,Clock_Integer 指令库应用例程
在一些需求中,我们可能需要将 BigDecimal 值转换为 Integer 类型。这时,可以使用 BigDecimal 的 intValue() 方法进行转换。 当 BigDecimal 值小于或等于 Integer.MAX_VALUE(2^31-1)时,intValue() 方法返回 ...
Transform Coding with Integer-to-Integer Transforms.pdf H.264學習資料
c++ 大整数库 big integer 来自https://mattmccutchen.net/bigint/
bigdecimal转integer
由于使用模板,所以只有一个Integer.h头文件 支持如下操作:>, >=, <, , ==, !=, +, +=, -, -=, *, =, /, /=,(输出);支持利用基本整数类型(int,unsigned,long long,……)和字符串(char和std::string)构造类型
Mybatis Generator将tinyint映射成Integer的解决办法
mybatis逆向工具generator,中文注释,把自动生成的Byte改成了Integer
integer 8x. This presupposes a knowledge about how to find the prime factors of 8. But since 8x only has prime factors that are primes less than or equal to 8, we need only consider relatively small ...
HugeInteger.java
mybatis返回int会报错,改成Integer封装类型可以解决,具体参考我的博客
北大POJ1503-Integer Inquiry 解题报告+AC代码
该资源主要介绍了android数组资源string-array integer-array的用法 包括int类型、string类型、文件类型的使用
LinkedList<Integer> ab=new LinkedList(); for(int i=0;i;i++) ab.add(i+1); for(;;){ if(ab.size()==0)break;//结束条件 int i=1; while(i!=M){ ab.add(ab.remove());//如果没有报到M这个数字的人将其从...
创建一个大整数类HugeInteger,该类用一个40个元素的数组来存放一个大整数(最多不超过40位)。 构造函数原型: HugeInteger(String); (1)定义几个大整数算术运算的成员函数,包括input、output、add和sub, add, ...
功能相对完整的大整数类:Integer.使用VC++2008编写。较好地支持了无限长大整数乘、除、加、减、取模、移位、比较运算。可以于信息安全的加密算法中。算法效率较高。由于类中使用了运算符重载,功能强大,并且易于...
4类型:integer SSL:false