java Integer的比较实践(转自blogjava)
2009-05-23 14:41
197 查看
package com.test;
public class 解包装包 {
public static void main(String []args) {
Integer a = 100;
Integer b = 100;
System.out.println(a==b);
}
}
打印结果为:true
但是如果换成 128 > var >= -128 之外的整数就打false了。
这是什么原因呢?
1。java在编译的时候 Integer a = 100; 被翻译成-> Integer a = Integer.valueOf(100);
2。比较的时候仍然是对象的比较
3。在jdk源码中
。。。
public static Integer valueOf(int i) {
final int offset = 128;
if (i >= -128 && i <= 127) { // must cache
return IntegerCache.cache[i + offset];
}
return new Integer(i);
}
。。。
而
。。。
private static class IntegerCache {
private IntegerCache(){}
static final Integer cache[] = new Integer[-(-128) + 127 + 1];
static {
for(int i = 0; i < cache.length; i++)
cache = new Integer(i - 128);
}
}
。。。
这边是java为了提高效率,初始化了-128--127之间的整数对象
所以在赋值在这个范围内都是同一个对象。
再加一句
Integer a = 100;
a++;
//这边a++是新创建了一个对象,不是以前的对象。
public static void main(String []args) {
Integer a = 100;
Integer b = a;
a++;
System.out.println(a==b);
}
打印就是false
对于127--128没有多大关系,但是在这范围之外就影响性能了吧,就像StringBuffer VS String一样了
原文地址http://www.blogjava.net/zhaochengming/archive/2007/08/13/136468.html
这也就解释了下面代码的结果了
结果:
i1==i2
i3!=i4
参见
http://topic.csdn.net/u/20090523/14/443e23d0-6266-4e7d-b4c3-0fbc94aaa23b.html?seed=1562409845
JAVA这样做,
哦。。。是为了效率
才想起来,java “==”就是比较引用,没有重载过
而由于-128至127内的Interger都是同一个对象引用,所以第一个比较式true
之外的Interger 则不是同一个对象,所以比较为false
重载的应该是equals()方法,所以如果用equals来比较应该都为true
学到了
public class 解包装包 {
public static void main(String []args) {
Integer a = 100;
Integer b = 100;
System.out.println(a==b);
}
}
打印结果为:true
但是如果换成 128 > var >= -128 之外的整数就打false了。
这是什么原因呢?
1。java在编译的时候 Integer a = 100; 被翻译成-> Integer a = Integer.valueOf(100);
2。比较的时候仍然是对象的比较
3。在jdk源码中
。。。
public static Integer valueOf(int i) {
final int offset = 128;
if (i >= -128 && i <= 127) { // must cache
return IntegerCache.cache[i + offset];
}
return new Integer(i);
}
。。。
而
。。。
private static class IntegerCache {
private IntegerCache(){}
static final Integer cache[] = new Integer[-(-128) + 127 + 1];
static {
for(int i = 0; i < cache.length; i++)
cache = new Integer(i - 128);
}
}
。。。
这边是java为了提高效率,初始化了-128--127之间的整数对象
所以在赋值在这个范围内都是同一个对象。
再加一句
Integer a = 100;
a++;
//这边a++是新创建了一个对象,不是以前的对象。
public static void main(String []args) {
Integer a = 100;
Integer b = a;
a++;
System.out.println(a==b);
}
打印就是false
对于127--128没有多大关系,但是在这范围之外就影响性能了吧,就像StringBuffer VS String一样了
原文地址http://www.blogjava.net/zhaochengming/archive/2007/08/13/136468.html
这也就解释了下面代码的结果了
public class Test { public static void main(String[] args) { Integer i1 = 100; Integer i2 = 100; if (i1 == i2) { System.out.println("i1==i2"); } else { System.out.println("i1!=i2"); } Integer i3 = 200; Integer i4 = 200; if (i3 == i4) { System.out.println("i3==i4"); } else { System.out.println("i3!=i4"); } } }
结果:
i1==i2
i3!=i4
参见
http://topic.csdn.net/u/20090523/14/443e23d0-6266-4e7d-b4c3-0fbc94aaa23b.html?seed=1562409845
JAVA这样做,
哦。。。是为了效率
才想起来,java “==”就是比较引用,没有重载过
而由于-128至127内的Interger都是同一个对象引用,所以第一个比较式true
之外的Interger 则不是同一个对象,所以比较为false
重载的应该是equals()方法,所以如果用equals来比较应该都为true
学到了
相关文章推荐
- Java 小例子:不通过逻辑运算和类库,比较两个 integer 大小
- Java int 同步和原子AtomicInteger效率比较
- Java中Integer与int类型的比较--装箱和拆箱
- java Integer和int之间==的比较问题。求解释
- java基本对象Integer,String比较相等及equal案例说明
- JAVA中Long与Integer比较容易犯的错误
- 1.00 【基础知识之基础类型】 JAVA中Long与Integer比较容易犯的错误
- Java Integer 比较
- Java包装类,以及Integer与int之间的比较
- Java进阶(三十四)Integer与int的种种比较你知道多少?
- JAVA中Long与Integer 比较的误区
- Java String 比较和 Integer 比较
- Java的String.valueOf 转换 与、空串+类型变量转换与封装类(Integer)的toString方式转换比较
- 大型网站系统与JAVA中间件实践——chapter1-4之各种类型的IO比较
- Java中Integer两种转int方法比较
- Java的String.valueOf 转换 与、空串+类型变量转换与封装类(Integer)的toString方式转换比较。
- java项目开发实践经验之二:几种常见数据库连接池的使用比较
- Java之Integer与int类型数据的比较-yellowcong
- Java Integer为什么要使用equals而不会==比较
- Java面试题:Integer i = 127;Integer j = 127;比较