A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王鹏伟 中级黑马   /  2013-2-26 14:33  /  2307 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. public class Demo0 {
  2.      public static void main(String[] args) {
  3.            int x = 1;
  4.            int a = new Integer(1);
  5.            Integer y = new Integer(1);
  6.            Integer z = 1;  
  7.             System.out.println(x==y);
  8.             System.out.println(y==z);
  9.             System.out.println(x==z);
  10.             System.out.println(x==a);  
  11.             System.out.println(y==a);  
  12.        }
  13. }
复制代码
为什么输出结果是:int与Integer有什么区别?
true
false
true
true
true

6 个回复

倒序浏览
int是一个基本数据类型,
Integer是一个基本数据类型封装类,
int i=0;//0是数值
Integer i=0;0是对象
第一个是false是因为比较的是对象地址.equals比较的是对象内容.
哎版主恨透了这类问题...因为换汤不换药的帖太多了...
回复 使用道具 举报
int是基本数据类型,Integer是整形对象。
int x=1;这里x是基本数据类型,Integer y=1,这里y是整形对象。
当x与y想比较时,y自动拆箱为基本类型,所以输出true。
而 Integer y = new Integer(1);和 Integer z = 1; 是两个对象,y指向的内存地址与z指向的内存地址不同,只是两个地址中保存的值都是1.
回复 使用道具 举报
Integer是int的封装对象,两个对象==比较的是栈的值
Integer a = new Integer(1);
Integer b = new Integer(1);
a与b存的是Integer的堆中的地址,而不是值
a、b指向堆中的地址显然不同所以 a==b 为false

int c = 1; int为值类型,引用类型Integer与值类型int比较显然比较的是值
因为int在堆中是不开辟内存的,他在栈中的值则为他本身的值
所以a==c比较的是他们各自的value, a==c为true

Integer e=1; 这个比较特殊,直接赋值  它有独立的内存,每次赋值时将检查内存中是否有值跟他匹配的,若有则把此内存地址付给e,若没有,开辟新的内存

你可以尝试下面的例子:
Integer t = 1;
Integer t1 = 1;
t==t1 为true,如上所说,此时t与t1指向的是同一块内存

new 一定是开辟新的内存,直接赋值则不一定开辟新的内存
因为a的引用指向堆,而e指向专门存放他的内存,所以他们的内存地址不一样
所以a==e为false

c==e等同于 a==c,一个引用类型一个值类型
回复 使用道具 举报
我上面没有说明白,在补充一下
Integer x=1;
Integer y=1;
因为x和y的值都小于等于127,所以Java中提供了一种享元模式,x和y指向同一个对象。

Integer z=new Integer(1); z是新建立一个对象,与x,y所指向的对象不一样。
回复 使用道具 举报
Java 5.0以后加入了auto-boxing。
之前是不能这么写Integer z = 1;,之前只能Integer z = new Integer(1);
现在自动帮你把前一种改成后一种,反过来有自动拆箱。从源代码看好像赋值的不是一种类型,类型不兼容,实际上有自动装箱和拆箱。
回复 使用道具 举报
Java 提供两种不同的类型:引用类型和原始类型(或内置类型)。Int是java的原始数据类型,Integer是java为int提供的封装类。Java为每个原始类型提供了封装类。
原始类型封装类
boolean -->Boolean
char --->Character
byte -->Byte
short -->Short
int -->Integer
long -->Long
float -->Float
double -->Double
引用类型和原始类型的行为完全不同,并且它们具有不同的语义。引用类型和原始类型具有不同的特征和用法,它们包括:大小和速度问题,这种类型以哪种类型的数据结构存储,当引用类型和原始类型用作某个类的实例数据时所指定的缺省值。对象引用实例变量的缺省值为 null,而原始类型实例变量的缺省值与它们的类型有关。同时为了面向对象操作的一致性,这些基本类型都有相应的封装类型:Integer、Short、Long、Byte、Float、Double、Character等。
因为封装类型是对象,所以可以进行相应的很多对象能力函数操作,这样就可以提供很多基本类型难以完成的工作的完成和实现。
你可以通过以下方式来声明该类型。




int 和 Integer 问题

java提供两种不同类型:简单类型和引用类型

int是java的简单类型,Integer是 java为int 提供的封装类(wrapper)。

java为每个简单类型提供了封装类:

boolean-Boolean byte-Byte short-Short  char-Char

long-Long float-Float int-Integer double-Double

引用类型和简单类型行为完全不同,并且它们具有不同的语义。

引用类型和简单类型具有不同的特征和用法,这包括大小和速度问题。

引用类型和简单类型有不同的默认值:引用类型默认值为null,简单类型的默认值于本身的类型有关。基本数据类型本身就是一个值

  

主题:(int)与Integer.parseInt()的区别是什么?

(int)是强制类型转换,比如double,float转int时就必须强制转换,由精度高到精度低嘛。
Integer.parseInt(),是把字符窜类型转换成整形,比如,String a="123";int b=Integer.parseInt(a);  


我的理解也是这样的,Integer.parseInt()处理的是对象级别的,而(int)处理的是简单类型
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马