慎用精通
隨着獵頭行業的興盛,一些應聘者往往可以從獵頭那得到一些注意事項和過往經驗。比如,在簡歷中切不可隨意用上“精通”二字,尤其對於剛入職場的小伙伴。
因為,對於應聘者寫上精通和了解沒有什么區別,無非是想為自己的簡歷增色。但是,作為面試官,他們看到“精通”二字可是兩眼放光,待着滿心的期許和興奮,開始帶着“精通”的標准來向你提問。往往,最終都是以尷尬的氣氛收場。
你真的精通么
昨天聽了一位資深Java工程師的分享,讓我意識到自己的火候還不夠,基礎不夠扎實,平時的思考還是少了點。下面分享幾個比較基礎的點,以點帶面,希望可以帶來一些思考,也看看你我離精通二字還有多遠的距離。
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方法拼接字符串,不需要創建那么多對象浪費系統資源。
我們可以寫一段測試代碼來看下兩種方式的差異
/**
* Created by jackie on 17/7/22.
*/
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毫秒。
如何做到精通
上面的例子只是冰山一角,說出從入門到精通只需要一秒鍾,但是要達到精通的級別卻需要我們花費很大的功夫。
-
看源碼 看源碼是了解一個數據結構或者算法的最好的方式,通過測試或者調試,我們可以明白那些結構為什么這么設計,也更能夠加深自己的理解。
-
多思考 當代碼寫多的時候,我們不妨給自己留一點思考的時間,想想我們為什么要這么寫,還有沒有更好的寫法了。
-
多看書 找些優秀的書籍來讀,站在巨人的肩膀上,可以幫助我們少走很多彎路。
精通是一種修行,你我都不能松懈和懈怠。
如果您覺得閱讀本文對您有幫助,請點一下“推薦”按鈕,您的“推薦”將是我最大的寫作動力!如果您想持續關注我的文章,請掃描二維碼,關注JackieZheng的微信公眾號,我會將我的文章推送給您,並和您一起分享我日常閱讀過的優質文章。