本文轉自 for_dream的 iteye博客
parseInt(String s)與valueOf(int i) 的區別
當我們需要將一個字符串轉換成整型時可能會使用以下的方法:
- String str = "12345";
- int one = Integer.parseInt(str);
- int two = Integer.valueOf(str);
使用parseInt()和valueOf()有何區別?我們來看JDK對這兩個方法的解析:
1.
public static int parseInt(String s) throws NumberFormatException將字符串參數作爲有符號的十進制整數進行分析。除了第一個字符可以是用來表示負值的 ASCII 減號
'-'
('\u002D'
)
外,字符串中的字符都必須是十進制數字。返回得到的整數值,就好像將該參數和基數 10 作爲參數賦予 parseInt(java.lang.String,
int)
方法一樣。
參數:
s
- 包含要分析的 int
表示形式的 String
。
返回:
用十進制參數表示的整數值。
拋出:
NumberFormatException
- 如果字符串不包含可分析的整數。
2.
public static Integer valueOf(String s) throws NumberFormatException返回保持指定的
String
的值的 Integer
對象。將該參數解釋爲表示一個有符號的十進制整數, 就好像將該參數賦予 parseInt(java.lang.String)
方法一樣。結果是一個表示字符串指定的整數值的 Integer
對象。
換句話說,該方法返回一個等於以下值的 Integer
對象:
new Integer(Integer.parseInt(s))
參數:
s
- 要解析的字符串。
返回:
保持字符串參數表示的值的 Integer
對象。
拋出:
NumberFormatException
- 如果字符串不能分析爲一個整數。
3.
public static Integer valueOf(int i)返回一個表示指定的 int 值的 Integer 實例。如果不需要新的 Integer 實例,則通常應優先使用該方法,而不是構造方法
Integer(int)
,因爲該方法有可能通過緩存經常請求的值而顯著提高空間和時間性能。
參數:
i
- 一個 int
值。
返回:
表示 i 的 Integer 實例。
從以下版本開始:
1.5
4.簡單地說就是:
static int parseInt(String s): 將字符串參數作爲有符號的十進制整數進行分析,返回一個int值。
static Integer valueOf(int i) : 返回一個表示指定的 int 值的 Integer 實例。
static Integer valueOf(String s) : 返回保持指定的 String 的值的 Integer 對象(實例)。
從返回值可以看出它們的區別 : parseInt()返回的是基本類型int, 而valueOf()返回的是包裝類Integer。Integer可以使用對象方法, 而int類型不能和Object類型進行互相轉換。
既然 static Integer valueOf(String s)返回的是一個Integer對象,卻可以像這樣用:
int i = Integer.valueOf("2012"); 因爲JDK1.5後的自動裝箱和拆箱操作使用Integer和int可以自動轉換,就像Integer i = 5; int j = i;一樣在編譯時是沒有錯誤的
5.從JDK的解析中我們能發現一個問題:
當使用parseInt(String str)方法時如果字符串str中的字符有某一個不是十進制的數字時就會拋出NumberFormatException異常,例如對身份證號碼310115199012242586X使用parseInt(String str)進行轉換時就會拋出NumberFormatException ,解決的方法就是改用Integer.valueOf(String
str)方法(現在好像也不行了,未測試過),因爲Integer.valueOf(String str)方法返回的是一個保持字符串參數表示的值的 Integer
對象, Integer.parseInt(String str)返回一個基本類型。但是Integer.valueOf(String
str)方法對完全非數字的字符串也是無能爲力的,例如使用Integer.valueOf(String str)方法對 str = "abc"進行轉換進就直接報NumberFormatException異常。
可以看下面的例子:
設有下面兩個賦值語句:
a = Integer.parseInt(“123”);
b = Integer.valueOf(“123”).intValue();
下述說法正確的是( d )。
A、a是整數類型變量,b是整數類對象。
B、a是整數類對象,b是整數類型變量。
C、a和b都是整數類對象並且值相等。
D、a和b都是整數類型變量並且值相等。
詳細解析:
parseInt(String s )方法是類Integer的靜態方法,它的作用就是將形參 s 轉化爲整數,比如:
Interger.parseInt("1")=1;
Integer.parseInt("20")=20;
Integer.parseInt("324")=324;
當然,s 表示的整數必須合法,不然是會拋異常的。
valueOf(String s )也是Integer類的靜態方法,它的作用是將形參 s 轉化爲Integer對象,Integer對象就是基本數據類型int型包裝類,就是將int包裝成一個類,這樣在很多場合下是必須的。Interger.valueOf("123")=Integer(123)這時候Integer(123)就是整數123的對象表示形式,它再調用intValue()方法,就是將123的對象表示形式轉化爲int基本數據123,所以,選擇D
6.關於整型的比較還有特別要說明的地方:
首先,定義一個整型的方式有:
(1) int i = 10;
(2) Integer j = new Integer(10);
(3) Integer k = Integer.valueOf(10);
我們來比較以下的結果:
- Integer a=Integer.valueOf(127);
- Integer b=Integer.valueOf(127);
- Integer aa=Integer.valueOf(128);
- Integer bb=Integer.valueOf(128);
- Integer c= 127;
- Integer d=127;
- Integer cc= 128;
- Integer dd=128;
- Integer e= new Integer(234);
- Integer f=new Integer(234);
- System.out.println("(a==b) ? "+(a==b));
- System.out.println("(c==d) ? "+(c==d));
- System.out.println("(aa==bb) ? "+(aa==bb));
- System.out.println("(cc==dd) ? "+(cc==dd));
- System.out.println("(e==f) ? "+(e==f));
- //輸出結果如下 :
- // (a==b) ? true
- // (c==d) ? true
- // (aa==bb) ? false
- // (cc==dd) ? false
- // (e==f) ? false
解析如下:
(1)new產生的Integer對象
new聲明的就是要生成一個新的對象,這是兩個對象,地址肯定不等,比較結果爲false。
(2)int i=10與使用valueOf()方法的效果是相同的,我們來看JDK中關於Integer.valueOf的實現代碼:
- public static Integer valueOf(int i) {
- final int offset = 128;
- if (i >= -128 && i <= 127) {
- // must cache
- return IntegerCache.cache[i + offset];
- }
- return new Integer(i);
- }
這段代碼的意思已經很明瞭了,如果是-128到127之間的int類型轉換爲Integer對象,則直接從cache數組中獲得,那 cache數組裏是什麼東西,代碼如下:
- static final Integer cache[] = new Integer[-(-128) + 127 + 1];
- static {
- for(int i = 0; i < cache.length; i++)
- cache[i] = new Integer(i - 128);
- }
cache是IntegerCache內部類的一個靜態數組,容納的是﹣128到127之間的Integer對象。通過valueOf產生包裝對象時,如果int參數在﹣128和127之間,則直接從整型池中獲得對象,不在該範圍的int類型則通過new生成包裝對象。
127的包裝對象是直接從整型池中獲得的,不管你輸入多少次127這個數字,獲得的對象都是同一個,那地址當然都是相等的。而128、555超出了整型池範圍,是通過new產生一個新的對象,地址不同,當然也就不相等了。
-----
原帖地址
http://for-dream.iteye.com/blog/1595847