List和Map


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方法進行排序


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM