第48節:Java當中的集合框架
Java當中的集合框架
01
在我們班裡有 50
位同學,就有 50
位物件。
// 簡書作者:達叔小生 Student[] stus = new Student[20];
結果來了一位插班生,該同學因為覺得學 IT
行業好,才要求老師轉專業的。可以結果沒有多餘的空位了,數組裡的長度都是安排好的,沒有空間了。
為了解決新同學的問題,老師們重新建立一個空間( 重複建立一個新的陣列 ),為了能夠更好的解決問題,老師提供了可以不斷擴大空間( Java提供了集合,當資料多了,個數不穩定時,可以用集合 )。
在 Java
中,陣列的長度是不可以改變的,在陣列中儲存的是同種型別的元素,可以儲存基本資料型別值;但是集合的長度是可以改變的,儲存的是物件,物件的型別可以不一樣,集合是儲存物件的,當資料多,即物件多的時候,可以用集合來儲存。
雖然陣列和集合類都是容器
為什麼用集合來解決問題,陣列難道就不可以嗎?
陣列也可以儲存物件的,但是因為長度的固定,限制了陣列,而集合的長度是可以改變的, 在陣列中可以用來儲存基本資料型別,而在集合中只能用來儲存物件,但是可以存的物件可以是不同型別的物件哦~
陣列可以存放基本資料型別和物件
集合只能存放物件
在 Java
語言這種面嚮物件語言中, 對一切事物的體現都可以用物件的形式來表現 ,為了對物件進行方便的操作, Java
就提供了集合這個名詞,用來儲存物件一種方式。
02
類集合框架主體
集合框架的構成及分類
// 簡書作者:達叔小生 java.util 類 Vector<E> java.lang.Object -> java.util.AbstractCollection<E> -> java.util.AbstractList<E> -> java.util.Vector<E>
// 簡書作者:達叔小生 public class Vector<E> extends AbstractList<E> implements List<E>, RandomAccess,Cloneable,Serializable
類集框架,那麼什麼是類集框架,集合的種類有哪些,類集框架的基礎結構。
類集框架是一組類和介面的集合,位於java.util包當中,是用來使用者儲存和管理物件的, 在這個類集合框架中,我們主要學習的為三大類,分別是集合,列表和對映。
集合,列表,對映
類集合框架是 jdk
提供的一類類和介面,主要掌握集合,列表,對映, 集合是無序的,集合中的元素不允許是重複的,列表是有序的,列表中的元素是允許重複的,對映是以鍵值對的方式來儲存資料,鍵是不可重複的,值是可以重複的。
其實在 jdk
最早的時候 jdk1.0
版的時候,提供的集合是很少的,但是隨著發展,到 jdk1.2
的時候就變多了,為了營造更多的需求,就有了集合框架。
所以的根介面為 Collection.
// 簡書作者:達叔小生 // 集合框架體系 Iterator ->Collection -> Map
// 簡書作者:達叔小生 Collection -> Set 無序不重複 -> 無序HashSet,需要排序TreeSet -> List 有序可重複 -> 查,改ArrayList,增刪LinkedList Map -> 無序 HashMap -> 排序 TreeMap
03
頂級Iterator和Collection
Collection
的相關方法,可以去官方下載文件來看哦:
方法 | 說明 |
---|---|
add(E e) | 返回的是 boolean 的型別,確保 collection 包含指定的元素 |
addAll(Collection<? extends E> e) | 返回的是 boolean 的型別,將指定 collection 中的所有元素新增到 collection 中 |
clear() | 返回 Void ,移除此 collection 中的所有元素 |
contains(Object o) | 返回 boolean 型別,如果此 collection 包含指定的元素,則返回 true |
containsAll(Collection<?> c) | 返回 boolean 型別,如果此 collection 包含指定 collection 中的所有元素,則返回 true |
equals(Object o) | 返回 boolean 型別,比較 collection 與指定物件是否相等 |
hashCode() | 返回的是 int 型別,返回此 collection 的雜湊碼值 |
isEmpty() | 返回 boolean 型別,如果此 collection 不包含元素,則返回 true |
iterator() | 返回 Iterater<E> ,返回在此 collection 的元素上進行迭代的迭代器 |
size() | 返回 Int 型別,返回此 collection 中的元素數 |
Collection
介面:它定義了集合體系中最共性的功能
// 簡書作者:達叔小生 java.util 介面 Collection<E> 所有超級介面: Iterable<E>
// 簡書作者:達叔小生 public interface Collection<E> extends Iterable<E>
Collection
介面為層次結構中的根介面,由上方提供的圖片得知, Collection
表示為一組物件,這些物件稱為 Collection
的元素,在這個類集合框架中,我們主要學習的為三大類,分別是集合,列表和對映。
注意一些 collection
允許有重複的元素,有的不允許,有的是有序的,有的是無序的。
這些都跟三大類有關。
在 java
中, jdk
不提供 Collection
介面的實現,都是由它的子介面進行實現的。
Collection是List和Set的父類
List
和 Set
也都是由再次向下,由它們的子類介面實現的。
// 簡書作者:達叔小生 Set 和 HashSet 為Set的實現類 使用 Iterator -> Collection -> Set -> HashSet Iterator -> Collection -> List -> ArrayList
來解釋:一些 collection
允許有重複的元素,有的不允許,有的是有序的,有的是無序的。是因為資料結構的不同。為 ->
三大類集合,列表,對映
出現了集合框架,有了很多種容器可以完成很多需求,我們區分容器是 靠著每個容器的資料結構不同 ,去命名瞭解的。
04
三大類集合,列表,對映
Set
為集合,在集合中的物件是不按照順序排列的,並且是沒有重複的物件的。
簡單為:無序,無重複。
List
為列表,中在列表中的物件是由順序的排序的,並且是有重複的物件。
簡單為:有序,有重複。
Map
為對映,在集合中的每個元素都有一個鍵物件和一個值物件,在 Map
中鍵是不可以重複的,值是可以重複的。
鍵不可重複,值可以重複;
Set
為無序集合,無序無重複;
List
為有序集合,有序有重複;
Map
為對映,儲存鍵值對,鍵不可重複,值可以重複;
05
Collection
是所有集合類的根介面,有人問那麼這個呢?
Collections
,其實這個是集合操作的工具類。
// 簡書作者:達叔小生 Collection -> Set -> HashSet -> LinkedHashSet -> TreeSet -> List -> ArrayList -> Vector -> LinkedList -> Queue -> LinkedList -> PriorityQueue -> Map -> Hashtable -> HashMap -> TreeMap -> LinkedHashMap
// 簡書作者:達叔小生 import java.util.List; import java.util.ArrayList; public class Demo{ public static void main(String args[]){ // 建立列表的實現類物件 ArrayList<String> arrayList = new ArrayList<String>(); // 新增資料 arrayList.add("a"); arrayList.add("b"); arrayList.add("c"); // 移除 arrayList.remove(1); // 獲取資料 String s = arrayList.get(1); System.out.println(s); // 獲取長度 int a = arrayList.size(); // 列印所有元素 for(int i=0; i<arrayList.size(); i++){ String s = arrayList.get(i); System.out.println(s); } } }
Set
和 HashSet
為 Set
的實現類 使用
// 簡書作者:達叔小生 import java.util.Set; import java.util.HashSet; public class Demo{ public static void main(String args[]){ HashSet<String> hashSet = new HashSet<String>(); Set<String> set = hashSet; // 實現類向上轉型為介面 // 同理 Set<String> set = new HashSet<String>(); // 新增元素 set.add("a"); set.add("b"); set.add("c"); set.add("d"); // 獲取集合中的元素長度 int a = set.size(); } }
Iterator 介面 迭代器物件
迭代是 Java
中的用來表示取元素的名稱而已, Iterator
介面 迭代器物件用來取元素,無論是什麼資料結構,最終共性的取出方式,取值是一個一個取的,在之前先要判斷是否有值,如果有就取一個,如果沒有就 over
,不取。
// 簡書作者:達叔小生 Iterator - > Collection -> Set - > HashSet hasNext() next() it.hasNext() 是否還有元素 it.next() 取出元素
Iterator -> Collection -> List -> ArrayList
Set 和 HashSet 為Set的實現類 使用
// 簡書作者:達叔小生 hasNext() 判斷是否還有下一個元素 next() 取出這個元素,然後把遊標移動到下一位
Iterator -> Collection -> Set -> HashSet
// 簡書作者:達叔小生 import java.util.Set; import java.util.HashSet; import java.util.Iterator; public class Demo{ public static void main(String args[]){ HashSet<String> hashSet = new HashSet<String>(); Set<String> set = hashSet; // 實現類向上轉型為介面 // 同理 Set<String> set = new HashSet<String>(); // 新增元素 set.add("a"); set.add("b"); set.add("c"); set.add("d"); // 迭代器 iterator() 遍歷整個set // 通過迭代器取出集合中的物件 Iterator<String> it = set.iterator<String>(); while(it.hasNext){ String s = it.next(); System.out.println(s); } } }
Iterator
迭代器 iterator()
// 簡書作者:達叔小生 Iterator<E> iterator() // 返回在此collection的元素上的迭代效果。
Iterable<E>中的iterator
在此 collection
的元素上進行迭代
iterator()
可以獲取具體容器中的迭代器物件
迭代器返回的是 Iterator
介面
迭代器的方法
方法 | 說明 |
---|---|
hasNext() | 返回 boolean 型別,如果有元素可以迭代(取出),則返回 true |
next() | 返回 E ,返回迭代的下一個元素 |
remove() | 返回 void ,從迭代器中移除迭代器返回的最後一個元素 |
java.util.NoSuchElementException
沒有這個元素異常
it.next()
// 簡書作者:達叔小生 public class IteratorDemo{ public static void mian(String[] args){ // 建立集合物件 Collection collection= new ArrayList(); // 儲存的是物件的引用 // 集合儲存不了基本資料型別 // collection.add(12); == 內部效果 collection.add(Integer.valueOf(12); // 自動裝箱 // 即在jdk1.5後,儲存的是基本資料型別包裝類的物件 collection.add("ab"); collection.add("bbb"); collection.add("cbbb"); collection.add("dbbbb"); // 獲取迭代器 iterator()方法 Iterator it = collection.iterator(); while(it.hasNext(){ System.out.println(it.next()); } // //可以轉變為 // for(Iterator it = collection.iterator(); it.hasNext(); ) {} // // 每個儲存物件的長度 for(Iterator it = collection.iterator(); it.hasNext(); ){ // 取出物件 Object object = it.next(); // 向下轉型,才能使用元素的特殊方法 String str = (String)object; // 列印物件長度 System.out.println(str.length()); } } }
// 簡書作者:達叔小生 // 可以使用這個,節省記憶體 for(java.util.Iterator iterator = collection.iterator(){ Object object = (Object) iterator.next(); }
06
// 簡書作者:達叔小生 // 建立一個Student類 public class Student{ // 定義私有的String變數 name private String name; // 定義私有的int變數 age private int age; // 建立建構函式 public Student(){ super(); } public Student(String name, int age){ super(); this.name = name; this.age = age; } // 建立toString()方法 @Override public String toString(){ return "Student [name=" + name + ", age=" + age + "]"; } // 建立getXxx(),setXXX()方法 public String getName(){ return name; }; public void setName(String name){ this.name = name; } public int getAge(){ return age; } public void setAge(int age){ this.age = age; } // equals(); @Override public boolean equals(Object obj){ if(this == obj){ return; } if(! (obj instanceof Student) ){ throw new ClassCastException("型別錯誤"); } Student stu = (Student)obj; return this.name.equals(stu.name) && this.age == stu.age; } }
equals()
方法
// 簡書作者:達叔小生 public class CollectionDemo { public static void main(String[] args){ // 建立集合物件 Collection collection = new ArrayList(); // 新增元素 新增一個地址兩次為重複 Student stu = new Student( "a",12 ); collection.add( stu ); collection.add( new Student("b",13) ); collection.add( new Student("c",14) ); collection.add( new Student("d",15) ); for(Iterator it = collection.iterator(); it.hasNext(); ){ Student student = (Student) it.next(); System.out.println(student.getName()); } } }
Map 與 HashMap(Map的實現類) 的使用
Map
為對映,對映中的每個元素都有一個鍵物件和一個值物件,在 Map
中鍵是不可以重複的,值是可以重複的。從 jdk1.2
有了這個類。
// 簡書作者:達叔小生 java.util Interface Map<K,V> K - the type of keys maintained by this map V - the type of mapped values
Map
是一種物件,將 keys
鍵和 values
值建立起一種對映關係,一個 map
不能有重複的 keys
,每個 key
只能唯一對映到一個值。
// 簡書作者:達叔小生 import java.util.Map; import java.util.HahMap; public class Demo{ public static void main(String args[]){ HashMap<String,String> hasMap = newHashMap<String,String>(); Map<String,String> map = hasMap; // 向上轉型 // 同理 Map<Stirng,String> map = new HashMap<String,String>(); // put() 用來存放鍵值對 map.put("1","a"); map.put("2","b"); map.put("3","c"); // 獲取長度 int i = map.size(); // 獲取鍵為2的值 String s = map.get("2"); } }
在 Map
中鍵是不可以重複的,值是可以重複的。如果 map
中新增一樣的鍵,那麼新的值會覆蓋老的值。
Collection
// 簡書作者:達叔小生 public interface List<E> extends Collection<E>
// 簡書作者:達叔小生 java.util 介面 List<E> 所有超級介面:Collection<E>,Iterable<E> 所有已知實現類:AbstractList,AbstractSequentialList,ArrayList,AttributeList,CopyOnWriteArrayList,LinkedList,RoleList,Vector,Stack。 可以用 ArrayList
public interface List<E> extends Collection<E>
// 簡書作者:達叔小生 public class ListDemo{ public static void main(String[] args){ // List List list = new ArrayList(); // 新增元素 list.add( new Student("a",12) ); list.add( new Student("b",13) ); list.add( new Student("c",14) ); // 插入元素 // list.add( 1, new Student("d",15) ); // list.remove(44); // 角標越界IndexOutOfBoundsException) // list.set( 2, new Student("dashucoding", 16) ); // 迴圈出物件 for(Iterator it = List.iterator(); it.hasNext(); ){ Student stu = (Student) it.next(); System.out.println(stu); } // 獲取物件 Object obj = list.get(1); System.out.println(obj); // 獲取物件 for(int i = 0; i<list.size(); i++){ System.out.println(list.get(i)); } }
往後餘生,唯獨有你
簡書作者:達叔小生
90後帥氣小夥,良好的開發習慣;獨立思考的能力;主動並且善於溝通
簡書部落格: ofollow,noindex" target="_blank">https://www.jianshu.com/u/c785ece603d1
結語
- 下面我將繼續對 其他知識 深入講解 ,有興趣可以繼續關注
- 小禮物走一走 or 點贊