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毫秒。