號稱精通Java的你,是否真的名副其實

慎用精通

隨着獵頭行業的興盛,一些應聘者往往可以從獵頭那得到一些注意事項和過往經驗。比如,在簡歷中切不可隨意用上“精通”二字,尤其對於剛入職場的小夥伴。

因爲,對於應聘者寫上精通和了解沒有什麼區別,無非是想爲自己的簡歷增色。但是,作爲面試官,他們看到“精通”二字可是兩眼放光,待着滿心的期許和興奮,開始帶着“精通”的標準來向你提問。往往,最終都是以尷尬的氣氛收場。

你真的精通麼

昨天聽了一位資深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毫秒。

如何做到精通

上面的例子只是冰山一角,說出從入門到精通只需要一秒鐘,但是要達到精通的級別卻需要我們花費很大的功夫。

  • 看源碼 看源碼是瞭解一個數據結構或者算法的最好的方式,通過測試或者調試,我們可以明白那些結構爲什麼這麼設計,也更能夠加深自己的理解。

  • 多思考 當代碼寫多的時候,我們不妨給自己留一點思考的時間,想想我們爲什麼要這麼寫,還有沒有更好的寫法了。

  • 多看書 找些優秀的書籍來讀,站在巨人的肩膀上,可以幫助我們少走很多彎路。

精通是一種修行,你我都不能鬆懈和懈怠。

我有一個微信公衆號,經常會分享一些Java技術相關的乾貨;如果你喜歡我的分享,可以用微信搜索“Java團長”或者“javatuanzhang”關注。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章