集合能夠存儲多個元素,但咱們對多個元素也有不一樣的需求java
常見問題:數組
1:長度的區別安全
2:內容不容數據結構
3:元素的數據類型性能
使用數組的缺陷:spa
2.數組的效率更高.例如:IO流 byte[] arr=new byte[1024];就是使用的數組線程
須要惟一嗎?code
須要:Set 須要制定順序嗎? 須要:TreeSet 不須要:HashSet 可是想要一個和存儲一致的順序(有序):LinkedHashSet 不須要:List 須要頻繁增長或者刪除元素嗎? 須要:LinkedList 不須要:ArrayList
前綴名就是該集合的數據結構.後綴名就是該集合所屬的體系對象
看到array:就要想到數組,就要想到查詢快,有角標 看到link:就要想到鏈表,就要想到增刪快,就要想到 add get remove+first last 方法 看到hash:就要想到哈希表,就要想到惟一性,就要想到元素須要覆蓋hashcode方法和equals方法 看到tree:就要想到二叉樹,就要想到排序,就要想到兩個接口Comparable和Comparator
List常見方法:blog
List:有順序的collection,而且能夠包含重複元素。
├ArrayList - 數組結構,查詢元素快,添加慢(通常狀況下),線程不安全,效率高 └Vector - 數組結構,查詢元素快,線程安全.效率比ArrayList低 - 如今幾乎不適用 ├LinkedList - 鏈表結構,添加元素快,查詢慢,線程不安全,效率高
細節說明:
LinkedList不一樣於前面兩種List,它不是基於數組的,因此不受數組性能的限制。
他的每個節點(Node)都包含了三方面的內容:
1.節點自己的數據: E item;
2.上一個節點的信息:Node<E> prev;
3.下一個節點的信息:Node<E> next;
因此當對LinkedList作添加,刪除動做的時候就不用像基於數組的ArrayList同樣,必須進行大量的數據移動。只要更改nextNode的相關信息就能夠實現了,這是LinkedList的優點。 因此LinkedList集合添加數組效率高
LinkedList的經常使用方法:
注意事項:LinkedList在內存中不是連續的,ArrayList在內存中是連續的.
List集合的遍歷方式:
方式一:迭代器模式,假設集合名爲(al)
Iterator<String> iterator = al.iterator(); while (iterator.hasNext()) { String s = iterator.next(); System.out.println(s); }
擴展:使用ListIterator方式進行遍歷,能夠在遍歷的過程當中對集合進行增刪改查,只有list有這種方式,使用ListIterator方式還能進行反向遍歷
方式二:加強for
for (String s : al) { System.out.println(s); }
方式三:普通for (List特有)
for (int i = 0; i <al.size(); i++) { System.out.println(al.get(i)); }
├HashSet (數據結構是哈希表) HashSet 怎麼確認惟一? 首先判斷的是兩個元素的哈希值確認元素是否相同,若是相同,再判斷兩個對象的內容是否相同 判斷哈希值是否相同,便是判斷hashCode方法,判斷內容是否相同,便是判斷equals方法 注意:若是哈希值不一樣,是不須要判斷equals方法的 若是兩個哈希值相同會形成哈希衝突,通常狀況下,哈希值都是不會衝突的(這裏不作詳細介紹) 記住:若是元素要存儲到HashSet集合中,必須覆蓋hashCode和equals方法. 通常狀況下,若是定義的類會產生不少對象,好比人,學生,書,一般都是覆蓋hashCode和equals方法.創建對象是否相同的依據. └LinkedhashSet (HashSet的一個子類,一個鏈表) LinkedhashSet能夠保證元素的有序! └TreesSet (排序,不重複,無索引)
方式一:迭代器
Set<String> set = new HashSet<String>(); Iterator<String> it = set.iterator(); while (it.hasNext()) { String str = it.next(); System.out.println(str); }
方式二:加強for
for (String str : set) { System.out.println(str); }
方式一(讓Bean類實現Comparable接口重寫compareTo方法) 天然排序
返回值 0 , 不存
正數 , 右邊 負數 , 左邊
方式二(自定義一個類實現Comparator接口重寫compare方法,經過構造方法傳入自定義類的對象)比較器排序
好比:String ,Integer 對象 ,實現特殊的排序需求, 須要傳遞比較器的子類對象 .