數組長度是固定,當添加的元素超過了數組的長度時須要對數組從新定義,太麻煩,java內部給咱們提供了集合類,能存儲任意對象,長度是能夠改變的,隨着元素的增長而增長,隨着元素的減小而減小。java
區別1 :
數組既能夠存儲基本數據類型,又能夠存儲引用數據類型,基本數據類型存儲的是值,引用數據類型存儲的是地址值。
集合只能存儲引用數據類型(對象)集合中也能夠存儲基本數據類型,可是在存儲的時候會自動裝箱變成對象。
區別2:
數組長度是固定的,不能自動增加。
集合的長度的是可變的,能夠根據元素的增長而增加。程序員
1.若是元素個數是固定的推薦用數組
2.若是元素個數不是固定的推薦用集合算法
Collection爲集合的根接口,因此只能實例化他的子類。數組
Collection coll = new ArrayList();安全
boolean add(E e) //添加元素並返回是否包含指定元素布爾值
boolean remove(Object o) //從該集合中刪除指定元素的單個實例
void clear() //今後集合中刪除全部元素
boolean contains(Object o) //若是此集合包含指定的元素,則返回 true
boolean isEmpty() //若是此集合不包含元素,則返回 true 。
int size() //返回此集合中的元素數。數據結構
boolean addAll(Collection c)
boolean removeAll(Collection c)
boolean containsAll(Collection c)
boolean retainAll(Collection c)併發
......框架
注意:add方法若是是List集合會一直返回true,由於List集合能夠存儲重複元素;函數
若是是Set集合當存儲重複元素的時候就會返回false。測試
Collection c = new ArrayList(); c.add("a"); c.add("b"); c.add("c"); c.add("d"); Iterator it = c.iterator(); //獲取迭代器的引用 while(it.hasNext()) { //集合中的迭代方法(遍歷) System.out.println(it.next()); }
迭代器原理
迭代器原理:迭代器是對集合進行遍歷,而每個集合內部的存儲結構都是不一樣的,因此每個集合存和取都是不同,那麼就須要在每個類中定義hasNext()和next()方法,這樣作是能夠的,可是會讓整個集合體系過於臃腫,迭代器是將這樣的方法向上抽取出接口,而後在每一個類的內部,定義本身迭代方式,這樣作的好處有二,第一規定了整個集合體系的遍歷方式都是hasNext()和next()方法,第二,代碼有底層內部實現,使用者不用管怎麼實現的,會用便可。
List list = new ArrayList();
void add(int index,E element)
E remove(int index)
E get(int index)
E set(int index,E element)
經過size()和get()方法結合使用遍歷。
List list = new ArrayList(); list.add(new Student("張三", 18)); list.add(new Student("李四", 18)); list.add(new Student("王五", 18)); list.add(new Student("趙六", 18)); for(int i = 0; i < list.size(); i++) { Student s = (Student)list.get(i); System.out.println(s.getName() + "," + s.getAge()); }
集合遍歷時添加元素會拋出ConcurrentModificationException併發修改異常。
解決辦法:
迭代器迭代元素,迭代器修改元素(ListIterator的特有功能add)。
ListIterator lit = list.listIterator();
lit.add("javaee");
public static ArrayList getSingle(ArrayList list) { ArrayList newList = new ArrayList(); //建立一個新集合 Iterator it = list.iterator(); //獲取迭代器 while(it.hasNext()) { //判斷老集合中是否有元素 String temp = (String)it.next(); //將每個元素臨時記錄住 if(!newList.contains(temp)) { //若是新集合中不包含該元素 newList.add(temp); //將該元素添加到新集合中 } } return newList; //將新集合返回 }
public void addFirst(E e)及addLast(E e)
public E getFirst()及getLast()
public E removeFirst()及public E removeLast()
public E get(int index);
Java 泛型(generics)是 JDK 5 中引入的一個新特性, 泛型提供了編譯時類型安全檢測機制,該機制容許程序員在編譯時檢測到非法的類型。
泛型的本質是參數化類型,也就是說所操做的數據類型被指定爲一個參數。
2.泛型的特徵
B:泛型好處
提升安全性(將運行期的錯誤轉換到編譯期)
省去強轉的麻煩
C:泛型基本使用
<>中放的必須是引用數據類型
D:泛型使用注意事項
先後的泛型必須一致,或者後面的泛型能夠省略不寫(1.7的新特性菱形泛型)
咱們使用Set集合都是須要去掉重複元素的, 若是在存儲的時候逐個equals()比較, 效率較低,哈希算法提升了去重複的效率, 下降了使用equals()方法的次數
當HashSet調用add()方法存儲對象的時候, 先調用對象的hashCode()方法獲得一個哈希值, 而後在集合中查找是否有哈希值相同的對象
若是沒有哈希值相同的對象就直接存入集合
若是有哈希值相同的對象, 就和哈希值相同的對象逐個進行equals()比較,比較結果爲false就存入, true則不存
類中必須重寫hashCode()和equals()方法
hashCode(): 屬性相同的對象返回值必須相同, 屬性不一樣的返回值儘可能不一樣(提升效率)
equals(): 屬性相同返回true, 屬性不一樣返回false,返回false的時候存儲
底層是鏈表實現的,是set集合中惟一一個能保證怎麼存就怎麼取的集合對象。
由於是HashSet的子類,因此也是保證元素的惟一性,與HashSet的原理同樣。
1.特色
TreeSet是用來排序的, 能夠指定一個順序, 對象存入以後會按照指定的順序排列
2.使用方式
a.天然順序(Comparable)
TreeSet類的add()方法中會把存入的對象提高爲Comparable類型
調用對象的compareTo()方法和集合中的對象比較
根據compareTo()方法返回的結果進行存儲
b.比較器順序(Comparator)
建立TreeSet的時候能夠制定 一個Comparator
若是傳入了Comparator的子類對象, 那麼TreeSet就會按照比較器中的順序排序
add()方法內部會自動調用Comparator接口中compare()方法排序
調用的對象是compare方法的第一個參數,集合中的對象是compare方法的第二個參數
c.兩種方式的區別
TreeSet構造函數什麼都不傳, 默認按照類中Comparable的順序(沒有就報錯ClassCastException)
TreeSet若是傳入Comparator, 就優先按照Comparator
A:Map接口概述
將鍵映射到值的對象
一個映射不能包含重複的鍵
每一個鍵最多隻能映射到一個值
B:Map接口和Collection接口的不一樣
Map是雙列的,Collection是單列的
Map的鍵惟一,Collection的子體系Set是惟一的
Map集合的數據結構值針對鍵有效,跟值無關;Collection集合的數據結構是針對元素有效