转自:http://hi.baidu.com/fandywang_jlu/blog/item/c5590b4eae053cc3d1c86a13.html
这是CSDN上的一个帖子,问题如下:
public static void main(String[] args) {
Integer a = 128;
Integer b = 128;
System.out.println(a == b);
}
请问输出结果是什么,并给出解释。
-------------------------------------------------------------------------------
输出结果为:false,分析如下:
首先,看看Integer的封装吧:
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);
}
当你直接给一个Integer对象一个int值的时候,其实它调用了valueOf方法,然后你赋的这个值很特别,是128,那么没有进行cache方法,相当于new了两个新对象。所以问题中定义a、b的两句代码就类似于:
Integer a = new Integer(128);
Integer b = new Integer(128);
这个时候再问你,输出结果是什么?你就知道是false了。如果把这个数换成127,再执行:
Integer a = 127;
Integer b = 127;
System.out.println(a == b);
结果就是:true
由上可知,我们进行对象比较时最好还是使用equals,便于按照自己的目的进行控制。
--------------------------------------------------补充-----------------------------------------------------------------------
我们看一下IntegerCache这个类里面的内容:
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[i] = new Integer(i - 128);
}
}
由于cache[]在IntegerCache类中是静态数组,也就是只需要初始化一次,即static{......}部分,所以,如果Integer对象初始化时是-128~127的范围,就不需要再重新定义申请空间,都是同一个对象---在IntegerCache.cache中,这样可以在一定程度上提高效率。
public static void main(String[] args) {
Integer b = 0;
int c = 0;
if (b == c) {
System.out.println(true);
} else {
System.out.println(false);
}
输出的结果为true,但并不意味这他们两个不同类型的值就相等,是因为其过程中系统自动拆箱造成的,b==c的时候java自动拆箱了,最后比较的是两个int
结论:
Java中的关系操作符==和!=比较的都是对象的引用,并非对象的内容,如果想比较两个对象的实际内容是否相同,必须使用所有对象都适合的特殊方法equals(),但是,equals()默认行为也是比较引用,所以,一般需要自己重写该方法。注意:equals不适合基本类型。
分享到:
相关推荐
主要介绍了Java基本数据类型与封装类型详解(int和Integer区别) ,需要的朋友可以参考下
integer 是引用数据类型,是int的封装类型,默认值为null,创建该类型需要进行实例化。 基本数据类型是可以用“==”进行比较,而引用数据类型则不可以,一般是通过equals方法来实现比较。 二 、再说说基本数据...
mybatis返回int会报错,改成Integer封装类型可以解决,具体参考我的博客
Java为每个原始类型提供了封装类,Integer是java为int提供的封装类。int的默认值为0,而Integer的默认值为null,即Integer可以区分出未赋值和值为0的区别,int则无法表达出未赋值的情况,例如,要想表达出没有参加...
通过JAVA反射技术对HttpServlet进行简单封装,类似于struts框架,页面请求过来的参数名只需要与Action<T> T这个Bean里的变量对应即可,getForm()就是获得页面传过来的参数[注:当前这个只能传T里的string和int/...
⑴ Java简单类型与封装类 我们知道,Java语言是...当然,Java在提供大量的其它类时,也提供了与简单数据类型对应的封装类,于是,Java中就有了诸如int和Integer(float和Float、double和Double……)的不同的数据类型。
Int是java的原始数据类型,Integer是java为int提供的封装类。Java为每个原始类型提供了封装类。 原始类型 封装类 boolean Boolean char Character byte Byte short Short int Integer long Long float Float double ...
原始类型封装类booleanBoolean charCharacter byteByte shortShort intInteger longLong floatFloat doubleDouble 引用类型和原始类型的行为完全不同,并且它们具有不同的语义。引用类型和原始类型具有不同的特征和...
原始类型封装类,booleanBoolean,charCharacter,byteByte,shortShort,intInteger,longLong,floatFloat,doubleDouble引用类型和原始类型的行为完全不同,并且它们具有不同的语义。引用类型和原始类型具有不同的特征和...
byte——Byte short——Short int——Integer ...封装了字符串转化成基本数据类型的方法(重点) 常用的字符串转化为基本数据类型的方法: Integer.parseInt() Long.parseLong() Double.parseDouble()
intInteger longLong floatFloat doubleDouble 引用类型和原始类型的行为完全不同,并且它们具有不同的语义。引用类型和原始类型具有不同的特征和用法,它们包括:大小和速度问题,这种类型以哪种类型的数据结构...
企业java工程师测试题 1. 面向对象的特征有哪些方面? 答案:最基本特征:封装,继承,多态...答案:int是基本类型。Integer是引用类型。Integer可以把String转换成int。 5. 运行时异常与一般异常有何异同? 。。。。。
intInteger longLong floatFloat doubleDouble 引用类型和原始类型的行为完全不同,并且它们具有不同的语义。引用类型和原始类型具有不同的特征和用法,它们包括:大小和速度问题,这种类型以哪种类型的数据结构存储...
面向对象的特征有哪些方面 1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择...intInteger longLong floatFloat doubleDouble
intInteger longLong floatFloat doubleDouble 引用类型和原始类型的行为完全不同,并且它们具有不同的语义。引用类型和原始类型具有不同的特征和用法,它 们包括:大小和速度问题,这种类型、、、、、、
存在下述例子,判断其输出结果。 public class Main{ public static void main(String[] agrs){ Integer a = 110;...我们知道,在Java中存在基本数据类型和引用数据类型,而Integer作为int的封装类,Integer
1.int是基本数据类型,Integer是int的封装类,是引用类型 2.基本数据类型在声明时系统会自动给它分配空间,而引用类型声明时只是分配了引用空间,必须
1、面向对象的特征有哪些方面 1.抽象:抽象就是忽略一个...Int是java的原始数据类型,Integer是java为int提供的封装类。Java为每个原始类型提供了封装类。 原始类型封装类booleanBoolean charCharacter byteByte sho
Excel POI读取封装(文件+示范代码) package org.excel.service; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileWriter; import java.io.IOException; import java....