0.Java集合框架圖數組
1.集合類(Collection)數據結構
(1)集合是存儲對象最經常使用的一種方式。框架
(2)集合的特色:
①存儲對象
②集合長度可變
③集合不能夠存儲基本數據類型ide
集合容器由於內部數據結構的不一樣,有多種具體容器,不斷的向上抽取,就造成了集合框架。。函數
(3)框架的頂層Collection接口this
Collection的常見方法:spa
①添加
boolean add(E e) code
boolean addAll(Collection c)
②刪除
boolean remove(Object o)
boolean removeAll(Collection c)
void clear()
③判斷
boolean contains(Object o)
boolean containsAll(Collection c)
boolean isEmpty() 對象
④獲取
size() 返回此 collection 中的元素數
Iterator iterator() 取出元素的方式,迭代器
⑤該對象必須依賴於具體容器,由於每個容器的數據結構都不一樣,因此該迭代器對象是在容器內部進行實現的。
對於容器使用者而言,具體的實現方式不重要,只要經過容器獲取到該實現的迭代器對象便可,也就是iterator方法。
Iterator接口就是對全部的Collection容器進行元素取出的公共接口。blog
(4)其它
boolean retainAll(Collection c) 取交集
toArray() 將集合轉成數組
(5)分支
--List:有序(存入和取出的順序一致),元素都有索引(角標),元素能夠重複。
--Set:元素不能重複,無序。
2.List
(1)List常見特有方法:
①添加
void add(index,element);
void add(index,collection);
②刪除
Object remove(index);
③修改
Object set(index,element);
④獲取
Object get(int index);
int indexOf(Object);
int lastIndexOf(Object);
List subList(from,to);
(2)ListIterator接口
在迭代過程當中,不要使用集合操做元素,容易出現異常。
可使用Iterator接口的子接口ListIterator來完成迭代中對元素進行更多操做。
(3)List常見
--Vector:內部是數組數據結構,是同步的。
--ArrayList:內部是數組數據結構,不一樣步,替代Vector。
--LinkList:內部是鏈表數據結構,是不一樣步的。
addFirst();
addLast():
jdk1.6
offerFirst();
offetLast();
getFirst();.//獲取但不移除,若是鏈表爲空,拋出NoSuchElementException.
getLast();
jdk1.6
peekFirst();//獲取但不移除,若是鏈表爲空,返回null.
peekLast():
removeFirst();//獲取並移除,若是鏈表爲空,拋出NoSuchElementException.
removeLast();
jdk1.6
pollFirst();//獲取並移除,若是鏈表爲空,返回null.
pollLast();
3.Set
Set接口中的方法和Collection一致
(1)HashSet:內部數據結構是哈希表,是不一樣步的。
如何保證該集合的元素的惟一性呢?
是經過對象的hashCode和equals方法來完成對象惟一性的。
若是對象的hashCode值不一樣,那麼不判斷equals方法,就直接存儲到哈希表中。
若是對象的hashCode值相同,那麼要再次判斷對象的equals方法。
記住:
若是元素要存儲到HashSet集合中,必須覆蓋hashCode方法和equals方法。
通常狀況下,若是定義的類會產生不少對象,好比人,學生,書,一般都須要覆蓋
equals,hashCode方法。創建對象判斷是否相同的依據。
public class Person extends Object { private int age; private String name; Person(String name,int age){ this.age=age; this.name=name; } public boolean equals(Object e) { if(this==e) return true; if(!(e instanceof Person)) return false; Person p=(Person)e; return (this.age==p.age)&&(this.name.equals(p.name)); } public int hashCode() { return name.hashCode()+age*39; } }
(2)TreeSet:能夠對Set集合中的元素進行排序。是不一樣步的。
判斷元素惟一性的方式,就是根據compareTo()比較方法返回結果是否爲0。
①TreeSet對元素進行排序的方式1:
讓元素自身具有比較功能,就須要實現Comparable接口,覆蓋compareTo方法。
public class Person extends Object implements Comparable{ private int age; private String name; Person(String name,int age){ this.age=age; this.name=name; } @Override public int compareTo(Object o) { // TODO Auto-generated method stub Person p=(Person)o; int temp=this.age-p.age; return temp==0?this.name.compareTo(p.name):temp; } }
②TreeSet對元素進行排序的方式2:
讓集合自身具有比較功能,定義一個類實現Comparator接口,覆蓋compare方法。
將該類對象做爲參數傳遞給TreeSet集合的構造函數。
public class ComparatorByName implements Comparator { @Override public int compare(Object o1, Object o2) { // TODO Auto-generated method stub String p1=(String)o1; String p2=(String)o2; int temp=p1.length()-p2.length(); return temp==0?p1.compareTo(p2):temp; } }
public class TreeSetTest{ public static void main(String[] args) { // TODO Auto-generated method stub TreeSet ts=new TreeSet(new ComparatorByName()); ts.add("aaa"); ts.add("ab"); ts.add("abcd"); ts.add("aaabbbb"); Iterator it=ts.iterator(); while(it.hasNext()) { System.out.println(it.next()); } } }
4.集合的一些技巧
(1)須要惟一嗎?
須要:Set
須要制定順序:
須要: TreeSet
不須要:HashSet
可是想要一個和存儲一致的順序(有序):LinkedHashSet
不須要:List
須要頻繁增刪嗎?
須要:LinkedList
不須要:ArrayList
(2)如何記錄每個容器的結構和所屬體系呢?
看名字!
List
|--ArrayList
|--LinkedList
Set
|--HashSet
|--TreeSet
後綴名就是該集合所屬的體系。
前綴名就是該集合的數據結構。
看到array:就要想到數組,就要想到查詢快,有角標.
看到link:就要想到鏈表,就要想到增刪快,就要想要 add get remove+frist last的方法
看到hash:就要想到哈希表,就要想到惟一性,就要想到元素須要覆蓋hashcode方法和equals方法。
看到tree:就要想到二叉樹,就要想要排序,就要想到兩個接口Comparable,Comparator 。
並且一般這些經常使用的集合容器都是不一樣步的。