写在前面:

  因本人目前能力有限,无法跟大家分享各种高逼格的问题,所以我决定从最基本的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 2019-04-21 14:51  心有一城,位于南  阅读(275)  评论(0)    收藏  举报