Integer&int 区别,转换以及相关知识点

两者区别(基本知识点)

1.Integer是int的包装类(Integer 类型的对象包含一个 int 类型的字段。 此外,该类提供了多个方法,能在 int 类型和 String 类型之间互相转换,还提供了处理道 int 类型时非常有用的其他一些常量和方法,比如定义了表示整数的最大值和最小值的常量),int则是java的一种基本数据类型 (面向过程留下的痕迹,不过是对java的有益补充)。
2.Integer变量必须实例化后才能使用,而int变量不需要 。
3.Integer实际是对象的引用,当new一个Integer时,实际上是生成一个指针指向此对象;而int则是直接存储数据值 。
4.Integer的默认值是null,int的默认值是0。

Integer&int的比较

1、由于Integer变量实际上是对一个Integer对象的引用,所以两个通过new生成的Integer变量用判相等(行为等价性)是不相等的(因为new生成的是两个对象,其内存地址不同)。但是通过equal判相等(观察等价性)是true,因为Integer中重写了equal。
2、Integer变量和int变量用
比较时,只要两个变量的值是相等的,则结果为true。因为包装类Integer和基本数据类型int比较时,java会自动拆包装为int,然后进行比较,实际上就变为两个int变量的比较(值相同就一样)。
3、非new生成的Integer变量和new Integer()生成的变量比较时,结果为false。因为非new生成的Integer变量指向的是java常量池中的对象(对于-128127,java会进行缓存,也就是Java会先创建好-128127这些对象,放在常量池中,下次要创建这几个数的integer对象时(除了new方式外)直接指向常量池的那一个已经存在的地址),而new Integer()生成的变量指向堆中新建的对象,两者在内存中的地址不同。
4、对于两个非new生成的Integer对象,进行
比较时,如果两个变量的值在区间-128到127之间,则比较结果为true,如果两个变量的值不在此区间,则比较结果为false。

Integer&int 自动拆箱和装箱

java1.5之前是没有提供自动拆箱和装箱的机制,也就是说 Integer i = 12;是错的。但之后的版本就提供了自动装箱和拆箱。
自动拆,装箱实际上算是一种语法糖。也就是java为我们自动进行一些转换,保证不同的写法在运行时等价,它们发生在编译阶段,也就是生成的字节码是一致的。装箱integer.valueOf(),拆箱integer.intValue()
例如:Integer i = 12;实质上java自动调用了Integer.valueof()将12(int)->Integer;Map a = new HashMap<>(); a.put(“a”,1);这个过程同样调用了Integer.valueof,将1(int)->Integer。
拆箱也可以使用强制转换

Integer x = new Integer(3);
Integer y = new Integer(3);
(int)x == (int)y;----true

x,y被强制转换为int。

分别在什么时候用Integer,int

1.int类型:绝大部分时候用int,用来进行一些加减乘除的运算or作为参数进行传递。
2.Integer:在泛型的时候必须用Integer,比如List
list = new ArrayList();可以 而List list = new
ArrayList();则不行。因为像ArrayList,HashMap这些容器都是装object,向其中中放东西时,像int,double这种内建类型是放不进去的,这时就需要这些内建类型的外覆类了。
然后就是声明对象时建议用Integer,声明一个变量时最好声明为对象格式,这样更能体现java面向对象的思想。

你可能感兴趣的:(java,编程语言,jdk)