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類,一個是在自己內部對比,另一個是使用第三方的類對比。太老套了,就不細說了。