第一篇寫的博客給本身的學習路線立了個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是不可變對象。這點能夠從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