1. 程式人生 > >int與Integer的區別

int與Integer的區別

支持 自己 這就是 line 就是 .html 重用 highlight ref

回顧下這些知識點:

Integer和int的區別

1、Integer是int提供的封裝類,而int是Java的基本數據類型;


2、Integer默認值是null,而int默認值是0;


3、聲明為Integer的變量需要實例化,而聲明為int的變量不需要實例化;


4、Integer是對象,用一個引用指向這個對象,而int是基本類型,直接存儲數值。

int與integer的區別從大的方面來說就是基本數據類型與其包裝類的區別:

int 是基本類型,直接存數值,而integer是對象,用一個引用指向這個對象

1.Java 中的數據類型分為基本數據類型和復雜數據類型

int 是前者而integer 是後者(也就是一個類);因此在類進行初始化時int類的變量初始為0.而Integer的變量則初始化為null

.

2.初始化時:

  int i =1;Integer i= new Integer(1);(要把integer 當做一個類看);但由於有了自動裝箱和拆箱  

(http://www.cnblogs.com/shenliang123/archive/2012/04/16/2451996.html),

java 自動裝箱與拆箱

這個是jdk1.5以後才引入的新的內容,

java語言規範中說道:在許多情況下包裝與解包裝是由編譯器自行完成的(在這種情況下包裝成為裝箱,解包裝稱為拆箱);

其實按照我自己的理解自動裝箱就可以簡單的理解為將基本數據類型封裝為對象類型,來符合java的面向對象;例如用int來舉例:

//聲明一個Integer對象
Integer num = 10;
//以上的聲明就是用到了自動的裝箱:解析為
Integer num = new Integer(10);
以上就是一個很好的體現,因為10是屬於基本數據類型的,原則上它是不能直接賦值給一個對象Integer的,但jdk1.5後你就可以進行這樣的聲明,這就是自動裝箱的魅力
自動將基本數據類型轉化為對應的封裝類型。成為一個對象以後就可以調用對象所聲明的所有的方法

自動拆箱:故名思議就是將對象重新轉化為基本數據類型:

//裝箱
Integer num = 10;
//拆箱
int num1 = num;
自動拆箱有個很典型的用法就是在進行運算的時候:因為對象時不恩直接進行運算的,而是要轉化為基本數據類型後才能進行加減乘除

Integer num = 10;
//進行計算時隱含的有自動拆箱
System.out.print(num--);
哈哈 應該感覺很簡單吧,下面我再來講點稍微難點的,是稍微
看下面一個例子,在看下面一個例子時如果對於 == 與 equal的區別不清楚的,可以先看http://www.cnblogs.com/shenliang123/archive/2012/04/16/2452156.html

//在-128~127 之外的數
         Integer num1 = 297;   Integer num2 = 297;           
         System.out.println("num1==num2: "+(num1==num2));                    
         // 在-128~127 之內的數 
         Integer num3 = 97;   Integer num4 = 97;   
         System.out.println("num3==num4: "+(num3==num4)); 
打印的結果是:num1==num2: false    num3==num4: true 

很奇怪吧:這就歸結於java對於Integer與int的自動裝箱與拆箱的設計,是一種模式:叫享元模式(flyweight)

為了加大對簡單數字的重利用,java定義:在自動裝箱時對於值從–128到127之間的值,它們被裝箱為Integer對象後,會存在內存中被重用,始終只存在一個對象

而如果超過了從–128到127之間的值,被裝箱後的Integer對象並不會被重用,即相當於每次裝箱時都新建一個 Integer對象;明白了吧

以上的現象是由於使用了自動裝箱所引起的,如果你沒有使用自動裝箱,而是跟一般類一樣,用new來進行實例化,就會每次new就都一個新的對象;

這個的自動裝箱拆箱不僅在基本數據類型中有應用,在String類中也有應用,比如我們經常聲明一個String對象時:

String str = "sl";
//代替下面的聲明方式
String str = new String("sl");

  

  使得對Integer類也可使用:Integer i= 1;    

  int 是基本數據類型(面向過程留下的痕跡,不過是對java的有益補充),Integer 是一個類,是int的擴展,定義了很多的轉換方法

  類似的還有:float Float;double Double;string String等,而且還提供了處理 int 類型時非常有用的其他一些常量和方法

  舉個例子:當需要往ArrayList,HashMap中放東西時,像int,double這種內建類型是放不進去的,因為容器都是裝 object的,這是就需要這些內建類型的外覆類了。

  Java中每種內建類型都有相應的外覆類。

  Java中int和Integer關系是比較微妙的。關系如下:

  1.int是基本的數據類型;

  2.Integer是int的封裝類;

  3.int和Integer都可以表示某一個數值;

  4.int和Integer不能夠互用,因為他們兩種不同的數據類型;

  舉例說明

  ArrayList al=new ArrayList();

  int n=40;

  Integer nI=new Integer(n);

  al.add(n);//不可以

  al.add(nI);//可以

  並且泛型定義時也不支持int: 如:List<Integer> list = new ArrayList<Integer>();可以 而List<int> list = new ArrayList<int>();則不行

總而言之:如果我們定義一個int類型的數,只是用來進行一些加減乘除的運算or作為參數進行傳遞,那麽就可以直接聲明為int基本數據類型,但如果要像

對象一樣來進行處理,那麽就要用Integer來聲明一個對象,因為java是面向對象的語言,因此當聲明為對象時能夠提供很多對象間轉換的方式,與一些常用

的方法。自認為java作為一們面向對象的語言,我們在聲明一個變量時最好聲明為對象格式,這樣更有利於你對面向對象的理解。

int與Integer的區別