1. 程式人生 > >java學習筆記(二)parseInt和valueOf 以及字串+和StringBuilder的區別

java學習筆記(二)parseInt和valueOf 以及字串+和StringBuilder的區別

parseInt和valueOf
我們平時應該都用過或者見過parseInt和valueOf這兩個方法。一般我們是想把String型別的字元數字轉成int型別。從這個功能層面來說,這兩個方法都一樣,都可以勝任這個功能。

但是,我們進入原始碼,看下Integer類下這兩個方法

parseInt

public static int parseInt(String var0) throws NumberFormatException {

return parseInt(var0, 10);

}
valueOf

public static Integer valueOf(String var0) throws NumberFormatException {

return valueOf(parseInt(var0, 10));

}
從程式碼,我們起碼看到了兩點

返回結果型別不一樣,parseInt方法返回的是int基本型別,valueOf方法返回的是Integer的包裝型別

valueOf方法實際上是呼叫了parseInt方法,也就是說,如果我們僅僅只需要得到字串型別字元數值對應的整數數值,那我們大可不必呼叫valueOf,因為這樣得到整形數值之後還要做一個裝箱的操作,將int封裝為Integer。

裝箱拆箱
Java的八種基本資料型別:int, short, long, double, byte, char, float, boolean

分別有各自對應的包裝型別:Integer, Short, Long, Double, Byte, Character, Float, Boolean

拆箱與裝箱是相反的操作。裝箱是將一個原始資料型別比如int賦值給相應封裝類的變數比如Integer。而拆箱則是將一個封裝類的變數賦值給相應原始資料型別的變數。

看一段程式碼

int i = 0;

Integer j = new Integer();

i = j;
看完這段程式碼不知道你是否已經意識到問題所在了。沒錯,問題出在了i=j,有人說這沒有問題,因為j是Integer型別,在賦值給i的時候會自動拆箱變成int型別。但是如果這時候j在經過一番處理後得到的是一個null值呢,存放在Integer下是沒有問題的,因為Integer就是一個類,允許為null,但是在拆箱為null並賦值給基本型別i的時候,這時候就是丟擲異常。

所以,拆箱裝箱帶來便捷的時候,也會有一些坑,需要我們去避免,能有效的避免的前提就是我們要基礎紮實。

字串+和StringBuilder
我們是不是太習慣於在拼接一個字串時使用類似這樣的寫法

String result = a + “:” + b + “:” + c;
其實我們看原始碼就知道,其實每一次+的操作都是將要拼接的字串建立一個String型別的物件,然後塞到字串結果中,最後呼叫toString方法得到最終的字串。

這樣的場景,我們更加推薦使用StringBuilder,通過呼叫append方法拼接字串,不需要建立那麼多物件浪費系統資源。

我們可以寫一段測試程式碼來看下兩種方式的差異



public class StringAndStringBuilder {

   public static  void main(String[] args) {

  		testString();

  		testStringBuilder();

   }

   public static void testString(){

       long start = System.currentTimeMillis();

       String resultStr = "";

       int i = 0;

       for (int a = 0; a < 10000; a++) {

           resultStr += "abc" + "def" + "g" + i++;

       }

       System.out.println("using String:" + (System.currentTimeMillis() - start));

   }

   public static void testStringBuilder() {

       StringBuilder stringBuilder = new StringBuilder();

       long start = System.currentTimeMillis();

       int i = 0;

       for (int a = 0; a < 10000; a++) {

           stringBuilder.append("abc").append("def").append("g").append(i++);

       }

       System.out.println("using StringBuilder:" + (System.currentTimeMillis() - start));

   }

}

最終的執行結果如下

using String:2266

using StringBuilder:3
這種效果顯然意見,使用String是秒級的2秒多,而使用StringBuilder是毫秒級的3毫秒。