Java基礎狂補--常用API的常見問題

1.   

Math.round(11.5) = ? 

Math.round(-11.5) = ?

round爲參數+0.5取整就近數

 

2.

String 、stringbuffer、stringbuilder的區別

首先,string只讀不可修改,修改則引用新的對象,之前的被修改對象已經不可及了。

其次,buffer/builder都是可修改的

最後,builder所有的方法都用synchronized修飾,單線程使用。效率比buffer高。

 

3.知識點:字符串連接的加號,本質上就是new一個stringbuilder,再把結果返回。

如果一個空字符串一百次循環用加號添加0~100的話,會創建100個stringbuilder,

而這時候直接使用stringbuilder可以增加效率,節約內存。

 

4.

string x = "x"   string y = new string ("x")

x==y爲0,因爲==比較的是地址

 

string a = "love"   string b = "u" string c = "loveu"

c=="love"+"u"爲1,因爲stringbuider會自動去常量池中匹配

c==a+b爲0,因爲新建新的stringbuilder

 

涉及JVM常量池的一個知識點:

string a = "x"     a==a.intern()爲1

string a = new string ("x")  a==a.intern()爲0

intern()去常量池中尋找一樣內容,沒有則添加並返回。

直接賦值,先去常量池中尋找,不存在在常量池中開闢一個內存空間存放mystring。存在的話不開闢。直接開闢一個棧存放a指向mystring。

使用new,先去常量池中尋找,不存在在常量池中開闢一個內存空間存放mystring。存在的話不開闢。然後在內存堆中開闢一塊空間存放new出來的實例,在棧中開闢一個空間爲a指向mystring。

總結,new和直接賦值對常量池的作用相同,區別在於new肯定是用的堆裏的新地址,而賦值則直接引用常量池。這也解釋了爲什麼直接賦值的字符串是隻讀的。

 

集合:

1.ArraryList底層是數組實現的,用於查(遍歷)。

2.LinkedList底層是鏈表實現的,用於增刪

3.Vector C++裏的神器,可惜是同步單線程的,所以被ArraryList取代了

4.hashset先計算哈希值判斷是否相同後判斷元素內容equals是否有相同來取決是否加入。

所以同樣哈希值的“重地”和“通話”兩個字符串可以加入同一個hashset

5.但是在自定義類的時候,如果不重寫equals和hashcode這兩個方法,那hashset可以存入內容相同的值,需要注意。(Map同理)

6.LinkedHashSet在hashset的基礎上(數組+鏈表/紅黑樹),多了一個鏈表用於保持順序。

7.Collection類的作用類似C++中的algorithm庫,在排序自定義類的時候,記得實現comparable接口,自定義排序規則,主要是利用this.xx和參數o.xx自己對比,還有可以自定義comparator類,一個是在自己內部對比,另一個是使用第三方的類對比。太老套了,就不細說了。

 

 

 

 

 

發佈了23 篇原創文章 · 獲贊 17 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章