黑马程序员技术交流社区

标题: Integer和int之间的一个小问题! [打印本页]

作者: 吴华二    时间: 2012-3-26 15:38
标题: Integer和int之间的一个小问题!
class IntegerTest
{
        public static void main(String[] args)
        {
                Integer a=150;
                Integer b=150;
                if(a==b)
                {
                        System.out.println("a==b");
   
                }else
   
                {
                        System.out.println("a!=b");
                }


        }
}

为什么会是输出:a!=b呢?有点不解!
作者: 肖发腾    时间: 2012-3-26 16:12
这个不难理解,a,b 是Integer对象,而不是整形数据。
在内存中a指向一个地址,b指向的是另一个地址。
在判断a==b的时候,是判断a,b,是否指向的而同一个地址。
显然指向的不是同一个地址,即结果为不等于。
这是判断对象与整形数据是否相等的区别。
作者: 孙地豪    时间: 2012-3-26 16:21
Integer a=150;
Integer b=150;   
当这个数的值不属于  -128 ---  127 中 的数时 ,内存 分配 就不同了。所以a == b 为 false
当这个数的值属于   -128 ---  127 中 的数时  内存分配的地址是同一地址,所以a == b 为 true


作者: 阿牛    时间: 2012-3-26 16:54
因为你比较的是a,b两个引用的地址,当引用指向的值在-128-127之间时,它会先在栈内存找看有没有这个值,如果有它就直接指向,不再开辟新空间,如果没有,就开辟新空间。
比如:Integer a=120;Integer b=120;,因为内存中已有120这个值,所以b和a指向的是同一个内存地址。Integer a=120;Integer b=125.因为内存中没有125这个值,所以b指向一块新的地址,所以a,b不等。你的代码中Integer a=150;Integer b=150,因为他们超出127了,所以即使值相等,a,b也分别指向不同的地址,所以a!=b。
作者: 李创    时间: 2012-3-26 17:06
java 提供两种不同的类型:引用类型(或者封装类型,Warpper)和原始类型(或内置类型,Primitive)。Int是java的原始数据类型,Integer是java为int提供的封装类。Java为每个原始类型提供了封装类。
原始类型 封装类
boolean Boolean
char Character
byte Byte
short Short
int Integer
long Long
float Float
double Double
引用类型和原始类型的行为完全不同,并且它们具有不同的语义。引用类型和原始类型具有不同的特征和用法,它们包括:大小和速度问题,这种类型以哪种类型的 数据结构存储,当引用类型和原始类型用作某个类的实例数据时所指定的缺省值。对象引用实例变量的缺省值为 null,而原始类型实例变量的缺省值与它们的类型有关。

Integer是int的封装类,里面有很多进行处理的静态方法   
Integer是对象而int不是,内存的分配位置也不一样

int是一种基本数据类型,而Integer是相应于int的类类型,称为对象包装。   
实现这种对象包装的目的主要是因为类能够提供必要的方法,用于实现基本数据类型的数值与可打印字符串之间的转换,以及一些其他的实用程序方法;   
另外,有些数据结构库类只能操作对象,而不支持基本数据类型的变量,包装类提供一种便利的方式,能够把基本数据类型转换成等价的对象,从而可以利用数据结构库类进行处理。   


作者: 〆_xin_、_跳    时间: 2012-3-26 17:39
如果两个Integer类型的数据相同,并且在-128~127之间,系统会自动分配同一内存地址,所以两者比较相等。然而,你定义的Integer a=150;Integer b=150;,这样他们不在-128~127之间,所以这两个变量各占有一个内存地址,所以a != b。
作者: 郑涛    时间: 2012-3-26 22:41
Interger其实是一个类。 Integer a=150写成这样是一种简化后的写法。这种写法JDK1.5后才出现,叫做自动装箱。实际为Integer a=new Integer(150); 这样看不难发现,a其实是一个对象,在堆内存中间有他自己的地址值。b也是同样的有地址值。你拿两个对象比较,能相同吗。所有输出结果为a!=b就不奇怪了。多说一句,String对象比较可以用equals()方法,赋值运算符==同样不可以用。
作者: 李增强    时间: 2012-3-26 23:32
==只能用来判断基本数据类型的
作者: 杨华威    时间: 2012-3-27 08:45
a==b其实比较的是a和b的内存地址,Integer 类型中,如果内存中已经存在一个数据,并且数据的值在-128到127之间,当创建第二个相同的对象时,为了节省资源,系统会自动指向第一个对象的内存地址。所以,假如a=100,b=100,那么这个时候a和b指向的是同一个地址。a==b,例子中,a=150,b=150;明显不符合-128到127的条件,那么a和b分别指向各自的150的内存地址。a!==b。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2