Java成長記錄第二集--基礎重點

  第一篇寫的博客給本身的學習路線立了個flag後,感受如今學習的積極性大增,這也離不開那幾位老鐵們的互相鼓勵。廢話很少說,如今給出本身總結的Java基礎部分所要重點注意的內容,對之後的開發工做也是很經常使用,至少我目前的感受是這樣的!對於基礎的語法和數據類型,邏輯判斷等相關的,若是是剛入門的話,推薦兩個簡單易懂的網站:菜鳥教程w3cschool這裏能夠進行相關的基礎知識的學習。既然是要學習,那編程工具固然是少不了的,除了經常使用的記事本、notepad++等,我想你們確定都少不了要安裝一款能夠運行代碼的編程工具吧。學習Java的確定對eclipse和myeclipse不陌生,至於這兩個有什麼區別,我想度娘確定比我解釋的清除。不過慢慢的工做過程當中,當我接觸到intellij idea這款編程工具後,真的是如獲至寶啊。想了解它有什麼優點,一樣找度娘,不在此篇博客範圍內。html

  說了這麼多,其實就是告訴你們要安裝一款編程軟件,後期能夠隨時進行代碼的運行驗證,這裏仍是建議你們先安裝eclipse,由於idea裏面的東西我本身都尚未徹底搞懂呢(苦笑不得),這裏推薦這位老鐵的搭建教程:Java開發環境搭建。好了,這下真的要進入到此次的重要內容了!java

一、Java的訪問權限面試

Java中有四種訪問權限:默認訪問權限、public、private、protected編程

這四種訪問權限中,只有默認訪問權限和public才能修飾類(這裏所說的類爲外部類,對於內部類,四種權限均可以進行修飾),對於字段和方法,四種權限均可以進行修飾。數組

默認訪問權限(字段或類前不加任何修飾符):用默認訪問權限進行修飾,只能在同包中進行訪問。安全

public:任何地方均可見(方法、字段、包)。併發

private:用private修飾的方法或字段只能在本類中進行訪問。app

protected:用protected修飾類的方法或字段,在同包中能夠被訪問,對於不一樣的包,只能經過繼承對其方法或字段進行訪問。eclipse

具體細節參考:http://www.cnblogs.com/dolphin0520/p/3734915.html,這篇博文中有詳細解釋。ide

二、開發過程當中不得不面臨的equals和==的區別

 

1)對於8種基礎數據類型,"=="比較值是否相等。

 

     若是做用於引用類型的變量,則比較的是所指向對象的地址。

 

注:equals方法是不能做用與基礎類型數據的,只能做用與引用類型數據。

 

2)對於equals方法:

 

     若是equals方法未被重寫,則比較的是引用類型變量所指向的對象地址。

 

     對於String、Integer、Date等複寫了equals方法的對象,則比較的是對象內容。

 

注:重寫了equals方法的對象:String、8種基礎類型的包裝類、Date等,這裏並未列舉完。

 

具體參考:

 

http://www.javashuo.com/article/p-hbgdatxk-cs.html

 

http://www.cnblogs.com/dolphin0520/p/3592500.html

注:在重寫equals方法時爲何要同時重寫hashCode方法?

具體參考:http://www.cnblogs.com/happyPawpaw/p/3744971.html

重寫hashCode方法,主要是爲了維護hashCode方法的協定,該協定規定,相等的對象必須有相同的哈希碼。

三、String、StringBuffer和StringBuilder的區別點在哪裏、?

這三個對象在平時使用和麪試中出現的頻次很是的高。

要點:

String是不可變對象。這點能夠從String的源碼中看到。

StringBuffer是線程安全的。從源碼中能夠看到函數上使用了synchronized進行修飾。

StringBuilder是非線程安全的。

特別指出String中的intern()方法,該方法從源代碼中能夠看出爲本地方法(而且與jdk的版本有關係,以jdk1.6爲分界點),而且在面試題中極其容易出現,具體區別爲:

在jdk1.6之前:

調用intern方法時,首先會去常量池中查找是否存在與當前String值相同的值,

若是存在的話,則直接返回常量池中這個String值的引用;若是不存在的話,則會將原先堆中的該字符串拷貝一份到常量池中,並返回該字符串在常量池中的引用

jdk1.7:

調用intern方法時,首先會去常量池中查找是否存在與當前String值相同的值,

若是存在的話,則直接返回常量池中這個String值的引用;若是不存在的話,則只會將原先堆中該字符串的引用放置在常量池中。注意:不會拷貝這個字符串到常量池中

注意:因爲jdk1.7對字符串常量池作出了調整,從PermGen區中調整到了堆中,因此在使用intern方法時,並不會進行字符串的拷貝。

下面給出相應例子,更清楚的說明intern方法。

1 String str1 = "abcd";
2 String str2 = new String("ab") + new String("cd");
3 System.out.println(str2.intern() == str1);
4 System.out.println(str2 == str1);

jdk1.6中輸出:

false

false

jdk1.7中輸出:

true

false

解釋:

在jdk1.6中字符串常量池和堆區被徹底區分開,因此會返回兩個false。

在jdk1.7中

在執行第1行String str1=「abcd」時,會將「abcd」直接存儲到常量池中。

在執行第2行String str2=new String("ab")+new String("cd")時,在類加載的時候,會在常量池中存儲"ab"和"cd"。

當執行str2.intern()方法時,發現常量池中存在"abcd"(第一行代碼的結果),因此返回此時"abcd"字符串的引用,即str1因此str2.intern()==str1爲true,兩處的引用相同的。

第四行,str2==str1,兩個引用的地址明顯不一樣,str2指向堆,str1指向字符串常量池中,因此爲false。

將上述代碼進行變形,形式以下:

1 String str2 = new String("ab") + new String("cd");
2 str2.intern();
3 String str1="abcd";
4 System.out.println(str2 == str1);

 

 

在jdk1.6中,一樣輸出false。

可是在jdk1.7中輸出true

解釋:

在執行第1行String str2=new String("ab")+new String("cd")時,在類加載的時候,會在常量池中存儲"ab"和"cd"。注意:這時常量池中是沒有"abcd"的。

在執行第2行str2.intern()方法時,發現常量池中沒有"abcd",因而將str2的引用放入常量池中,並不會進行拷貝

在執行第3行時,發現常量池中已經存在"abcd"的引用了,直接賦值給str1,因此最後的結果爲true。

將上述代碼再次變形,將第2行與第3行互換位置。形式以下:

1 String str2 = new String("ab") + new String("cd");
2 String str1 = "abcd";
3 str2.intern();
4 System.out.println(str2 == str1);

在jdk1.6與jdk1.7中都是輸出false。

這個原理比較簡單了,str2與str1,明顯是兩個不一樣的引用,str2指向堆,str1指向字符串常量池,因此爲false。

具體參考:

http://www.cnblogs.com/dolphin0520/p/3778589.html

http://blog.csdn.net/seu_calvin/article/details/52291082

http://www.importnew.com/14142.html

http://blog.csdn.net/bigtree_3721/article/details/74907670

http://blog.csdn.net/hzw19920329/article/details/51262925

四、集合類不得不掌握的東西

 

數組(能夠存儲基本數據類型)是用來存現對象的一種容器,可是數組的長度固定,不適合在對象數量未知的狀況下使用。

 

集合(只能存儲對象,對象類型能夠不同)的長度可變,可在多數狀況下使用。

要點:

List有序集合,能夠包含重複元素。

Set無序(TreeSet有序,二叉樹排序),不能包含重複元素。

Map不能包含重複的鍵值,由於鍵值對。

注:參考博文中說,全部集合類都實現了Iterator接口,可是Map集合是沒有實現該接口的

集合中有幾個重要的對象須要特別提出來:HashMap、Hashtable、ConcurrentHashMap

這裏給出兩位老鐵總結比較詳細的博客:

http://www.javashuo.com/article/p-xtnpuchz-bp.html

HashMap的實現原理,參考:http://www.cnblogs.com/xwdreamer/archive/2012/06/03/2532832.html

注:參考博文中說,全部集合類都實現了Iterator接口,可是Map集合是沒有實現該接口的

集合中有幾個重要的對象須要特別提出來:HashMap、Hashtable、ConcurrentHashMap

HashMap的主要特色:

1)非同步的,也就說是非線程安全的,與Hashtable相反。

2)無序,容許null鍵和null值(HashTable不容許鍵或值爲null),不能包含重複的鍵,可是重複的鍵是能夠put進HashMap集合的。

3)繼承自AbstractMap,並實現了Map接口。

4)在HashMap中擴容時,是很是耗性能的;HashMap默認數據容量大小爲16,loadFactor(擴容因子默認值爲0.75),當元素個數大於16*0.75=12時,就會進行擴容,擴大一倍:2*16=32。

5)HashMap線程不安全的具體體現,參考:http://www.importnew.com/22011.html

HashTable的實現原理,參考:http://www.javashuo.com/article/p-dqadwfdc-eg.html

Hashtable的主要特色:

1)Hashtable是線程安全的。

2)無序,不容許null鍵或null值。

3)繼承與Dictionary接口,也實現了Map接口。

4)Hashtable擴容時,擴大的容量爲:2n*+1,擴大一倍並加1。Hashtable默認數據容量爲11。

ConcurrentHashMap的實現原理,參考:

https://my.oschina.net/hosee/blog/639352

https://www.cnblogs.com/chengxiao/p/6842045.html

http://pettyandydog.com/2017/07/27/concurrentHashMap/

https://my.oschina.net/hosee/blog/675884

ConcurrentHashMap的主要特色:(基本上到目前沒遇到過這個集合)

1)線程安全的,主要使用鎖分離技術(分段鎖)。

2)初始容量大小爲16,默認併發度也爲16。

3)因爲使用分段鎖技術,只有對於同一段數據操做,纔會考慮線程同步。

4)無序,不容許null鍵或null值。(源碼put函數能夠得出該結論)

  今天的博客就主要分享這幾個吧,畢竟一口吃不了一個大胖子。還有點要說明一下,上述內容並不都是我本身寫的,我沒有那麼好的文采。但這些東西絕對是我本身都認真看過以後才貼出來的,不喜勿噴,發這個的最初目的就是爲了督促本身天天進步一點點就夠了~by:lmyou

相關文章
相關標籤/搜索