写在前面:
因本人目前能力有限,无法跟大家分享各种高逼格的问题,所以我决定从最基本的java基础开始,以下内容为原创或有部分借鉴,如有错误,望大家都直接指明出来。学识不足,甚是感激。如需转载,标明来源即可。谢谢大家。
———————————————————————————— * 一条分割线 * ————————————————————————————————
int 和 Integer 之间的比较,最近很多人对这两者的概念可能都只是模糊地记得一个"127",就是记得有这么一个范围而已。其他情况下可能很多东西都不清楚。但具体来说,这两者还是有明显的区别的。
一、两者之间的性质:
int 和 Integer,int是基本数据类型,Integer是一个包装类。这是有本质的区别。最主要的区别就是这句直接的性质表明: 一个是基本数据类型, 一个是类。
- Integer的默认初始值是null,而int的默认初试值是0。
- Integer变量必须先实例,int变量则可以直接使用
-
比如int a= 5;Integer b=5;(所以要把integer 当做一个类看,同时需要导包java.lang.Integer);a只能用来做计算,比如加减乘除,对于b你可以用来做很多事情,因为他是一个对象,他有很多方法,你可以像使用String对象那样使用它。
二、两者之间的相互转换:
1 /* 2 * 基本数据类型 -> 包装类 3 * 通过构造器进行转换 4 */ 5 @Test 6 public void test1(){ 7 int num = 10; 8 Integer integer = new Integer(num); 9 System.out.println(integer);//10 10 11 boolean boo = true; 12 Boolean boo2 = new Boolean(boo); 13 System.out.println(boo2);//true 14 } 15 16 /* 17 * 包装类 -> 基本数据类型 18 * 包装类对象.xxxValue() 19 */ 20 @Test 21 public void test2(){ 22 23 Integer integer = new Integer(20); 24 int intValue = integer.intValue(); 25 System.out.println(intValue);//20 26 27 Boolean boo = new Boolean(true); 28 boolean booleanValue = boo.booleanValue(); 29 System.out.println(booleanValue);//true 30 }
三、难点思考。
大家可以看一下下面一个例子。直接上代码。
package javabasicClass.type; public class Type { public static void main(String[] args) { Integer i1 = new Integer(128); int i2 = 128; System.out.println("new Integer与int"+(i1==i2));//true
System.out.println("=======================================");
Integer i3=new Integer(128);
System.out.println("new Integer与new Integer"+(i1==(i3)));//false
System.out.println("=======================================");
Integer i4=128;
Integer i44=127;
System.out.println("Integer与int"+(i3==i4));false
System.out.println("=======================================");
Integer i5=128; Integer i55=127; System.out.println("Integer为128与Integer为128"+(i4==i5));//false System.out.println("Integer为127与Integer为127"+(i44==i55));//true
System.out.println("=======================================") String a="123" String b=new String("123");
System.out.println("String与new String"+a==b);//false } } Integer与Integer间的比较,有“自动装箱”这么一个机制,在byte-128到127范围内(ps整型的八位二进制的表示的范围为-128到127),如果存在了一个值,
再创建相同值的时候就不会重新创建,而是引用原来那个。如果是超过byte范围还是会新建的对象。所以,i==i1为true,i2==i3为false。
自动装箱跟自动拆箱机制:
基本数据类型和对象比较的时候,对象会自动拆箱为基本数据类型再比较,比较的就是里面的值而不是地址,如 Integer i1=new Integer(128); int i2=128; i1==i2;
public class Test() { public static void main(String[] args) { Integer i1=new Integer(128); int i2=128;
//经历拆箱过程将i1对象变为int i1=128;所以为true System.out.println("new Integer与int"+(i1==i2)); Integer i3=new Integer(128);
//两个都是new。。两个对象间的比较,比较的是地址,所以为false System.out.println("new Integer与new Integer"+(i1==(i3))); Integer i4=128; Integer i44=127;
//不会经历拆箱过程,i3的引用指向堆,而i4指向专门存放他的内存(常量池),他们的内存地址不一样,所以为false System.out.println("new Integer与Integer"+(i3==i4)); Integer i5=128; Integer i55=127;
//Integer与Integer间的比较,自动装箱过程,超过范围则创建新对象 System.out.println("Integer为128与Integer为128"+(i4==i5)); System.out.println("Integer为127与Integer为127"+(i44==i55));
//补充(String) String a="123";
//在堆创建一个对象被b引用,然后堆中的值指向常量池的“123” String b=new String("123");
//两者指向的地址不同,所以为false System.out.println("String与new String"+a==b); } }
四、补充:
String str = new String("xyz")的内存中创建了几个对象(开辟了几块空间)?
答: 是 2 块。
写在后面:部分内容来自Toni新浪。
posted on
浙公网安备 33010602011771号