List是一個接口,繼承自Collections接口
一、List特點
元素有序,可重復
二、ArrayList,LinkedList與List的不同
1、List是接口類,ArrayList和LinkedList是List的實現類。
2、ArrayList是動態數組(順序表)的數據結構。順序表的存儲地址是連續的,所以在查找比較快,但是在插入和刪除時,由於需要把其它的元素順序向后移動(或向前移動),所以比較耗時。
Vector也是動態數組結構,但是是線程同步的
3、LinkedList是鏈表的數據結構。鏈表的存儲地址是不連續的,每個存儲地址通過指針指向,在查找時需要進行通過指針遍歷元素,所以在查找時比較慢。由於鏈表插入時不需移動其它元素,所以在插入和刪除時比較快。
三、List的基本方法
List<String> list = new ArrayList<String>(); list.add("java"); // 向集合追加元素 list.add(2, "hadoop"); // 向集合插入元素 System.out.println(list.get(2)); // 根據下標取出元素 System.out.println(list.size()); // 集合中元素的個數 list.remove(2); // 根據下標刪除某一個元素 list.contains("java"); //true 看集合中是否包含某一個對象,使用equals比較 list.contains(new String("ibm")); //true
equals與==區別:
1.==是比較對象的地址值,即判斷是否是同一個對象
2.equals可以重寫,這里比較的是內容是否相同
3.equals在Object中,比較的是是否為同一對象,與==相同
四、hashmap工作原理
一、基本概念
HashMap儲存的是鍵值對;
HashMap可以接受null鍵值和值,而HashTable則不能;
HashMap是非synchronized;
二、工作原理
HashMap是基於hashing的原理,我們使用put(key, value)存儲對象到HashMap中,使用get(key)從HashMap中獲取對象。
當我們給put()方法傳遞鍵和值時,我們先對鍵調用hashCode()方法,返回的hashCode用於找到bucket位置來儲存Entry對象
HashMap是在bucket中儲存鍵對象和值對象,作為Map.Entry
三、當兩個對象的hashcode相同會發生什么?
因為hashcode相同,所以它們的bucket位置相同,‘碰撞’會發生。因為HashMap使用LinkedList存儲對象,這個Entry(包含有鍵值對的Map.Entry對象)會存儲在LinkedList中。
四、如果兩個鍵的hashcode相同,你如何獲取值對象?
找到bucket位置之后,會調用keys.equals()方法去找到LinkedList中正確的節點,最終找到要找的值對象
五、為什么hashmap是非線程安全的?
因為多線程會導致HashMap的Node鏈表形成環形數據結構,一旦形成環形數據結構,Node的next節點永遠不為空,就會在獲取Node時產生死循環
保證線程安全:
1、HashTable源碼中是使用synchronized
來保證線程安全的
2、ConcurrentHashMap,在8中CHM摒棄了Segment(包含一個segment數組,將數據分段存儲,給每一段數據配一把鎖,也就是所謂的鎖分段技術)的概念,而是啟用了一種全新的方式實現,利用CAS算法
3、SynchronizedMap也是使用synchronized
來保證線程安全的
六、Map的排序問題
TreeMap默認升序,可以用Comparator的compare方法進行排序
如果需要對值進行排序,需要Collections的sort的compare方法進行排序