1. 程式人生 > >Java當中的集合框架

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介面

Collection介面:它定義了集合體系中最共性的功能

// 簡書作者:達叔小生
java.util
介面 Collection<E>
所有超級介面:
Iterable<E>
// 簡書作者:達叔小生
public interface Collection<E>
extends Iterable<E>

Collection介面為層次結構中的根介面,由上方提供的圖片得知,Collection表示為一組物件,這些物件稱為Collection的元素,在這個類集合框架中,我們主要學習的為三大類,分別是集合,列表和對映。

注意一些collection允許有重複的元素,有的不允許,有的是有序的,有的是無序的。

這些都跟三大類有關。

java中,jdk不提供Collection介面的實現,都是由它的子介面進行實現的。

Collection是List和Set的父類

如圖

ListSet也都是由再次向下,由它們的子類介面實現的。

// 簡書作者:達叔小生
Set 和 HashSet 為Set的實現類 使用
Iterator -> Collection -> Set -> HashSet
Iterator -> Collection -> List -> ArrayList

來解釋:一些collection允許有重複的元素,有的不允許,有的是有序的,有的是無序的。是因為資料結構的不同。為 -> 三大類集合,列表,對映

出現了集合框架,有了很多種容器可以完成很多需求,我們區分容器是靠著每個容器的資料結構不同,去命名瞭解的。

04

三大類集合,列表,對映

Set為集合,在集合中的物件是不按照順序排列的,並且是沒有重複的物件的。
簡單為:無序,無重複。

Set

List為列表,中在列表中的物件是由順序的排序的,並且是有重複的物件。
簡單為:有序,有重複。

List

Map為對映,在集合中的每個元素都有一個鍵物件和一個值物件,在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

Collection介面

// 簡書作者:達叔小生
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);
 }
 }
}

SetHashSetSet的實現類 使用

// 簡書作者:達叔小生
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 = new  HashMap<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後帥氣小夥,良好的開發習慣;獨立思考的能力;主動並且善於溝通
簡書部落格: https://www.jianshu.com/u/c785ece603d1

結語

  • 下面我將繼續對 其他知識 深入講解 ,有興趣可以繼續關注
  • 小禮物走一走 or 點贊