Java集合框架
- 集合框架被設計成的目標:
高性能、高效
允許不同類型的結合,以類似的方式進行工作,有高度的互操作性
對一個集合的擴展和適應必須是簡單的
兩種容器:集合Collection、圖Map
集合接口被分為了三種子類型:List、Set、Queue
具體的實現類:ArrayList、LinkedList、HashSet、LinkedHashSet、HashMap、LinkHashMap
集合接口
集合框架定義了一些接口,每個接口都提供了不同的功能。
詳情可見:https://www.runoob.com/java/java-collections.html
Set和List區別
Set是一個集合,無序而且不允許被重復
Set檢索效率低下
List和數組相似,但是它可以被動態地增長,會自動增加List的長度
Java ArrayList
- ArrayList是一個可以被動態修改的數組,它和普通數組的區別就是沒有固定的長度,可以隨時被更改(增加或者刪除)
- ArrayList繼承了AbstractList,并且實現了List接口
- ArrayList位于java.util包中,使用之前必須導入它
import java.util.ArrayList;
ArrayList<E> objectName = new ArrayList<>()
- E是泛型數據類型,用于設置objectName的數據類型,只能作為引用數據類型
- objectName 對象名字
添加元素
public static void main(String[] args){ArrayList<String> sites = new ArrayList<String>();sites.add("Google");sites.add("Bing");sites.add("Youtube");sites.add("Bilibili");System.out.println(sites);}
訪問元素
- 使用get()方法來訪問元素
System.out.println(sites.get(1));
//訪問第一個
修改元素
- 使用set方法來修改ArrayList中的元素
sites.set(2,"Wiki");
//第一個參數是索引的位置,第二個位置是修改之后的值
刪除元素
- 使用remove方法可以用于刪除元素
sites.remove(3);
//刪除3號元素
輸出元素數量
- 使用size()來輸出ArrayList()中的元素個數
sites.size();
迭代數組列表
- 使用for來迭代數組中列表中的元素
for(int i=0;i<sites.size();i++){System.out.println(sites.get(1));
}
- 當然Java中還封裝了for–each循環,我們也可通過for-each來迭代元素
for(String i:sites){System.out.println(i);
}
其他的引用類型
ArrayList中的元素實際上是對象,在上述的實例中,數組列表元素都是字符串String類型。
如果我們需要存儲其他的類型,而只能為引用數據類型,這個時候我們就需要使用到基本類型的包裝類,即Java的裝箱
ArrayList排序
Collections類也是一個非常有用的類,位于java.utils包中,提供sort()方法對字符或者數字列表進行排序,以下的實例對字母進行排序。
import java.util.ArrayList;import java.util.Collections;
// 引入 Collections 類
public class RunoobTest {public static void main(String[] args) {ArrayList<Integer> myNumbers = new ArrayList<Integer>(); myNumbers.add(33);myNumbers.add(15);myNumbers.add(20);myNumbers.add(34); myNumbers.add(8); myNumbers.add(12); Collections.sort(myNumbers); // 數字排序 for (int i : myNumbers) {System.out.println(i); } }
}
LinkedList
鏈表LinkedList是一種常見的基礎類型數據結構,是一種線性表,但是不會按照線性的順序來存儲數據,而是每個節點里面存儲了下一個結點的地址
- 與ArrayList相比較,LinkedList的增加和刪除操作的效率更高,但是查找和修改的效率更低。
建議使用ArrayList的情況
- 頻繁地訪問列表中的某一個元素
- 只需要在列表末尾進行添加和刪除的元素的操作
建議使用LinkedList的情況
- 需要通過循環迭代來訪問列表中的某些元素
- 需要頻繁地在列表開頭、中間、末尾等地方進行增加和刪除元素的操作
LinkedList 類位于 java.util 包中,使用前需要引入它,語法格式如下:
// 引入 LinkedList 類
import java.util.LinkedList; LinkedList<E> list = new LinkedList<E>();
// 普通創建方法或者
LinkedList<E> list = new LinkedList(Collection<? extends E> c);
// 使用集合創建鏈表
- 以下是存放LinkList的一個實例,這個實例中使用了LinkedList來存放了String類型的變量
import java.util.LinkedList;public class Init {//main函數,程序入口public static void main(String[] args) {LinkedList<String> sites = new LinkedList<String>();sites.add("google");sites.add("baidu");sites.add("yahoo");System.out.println(sites);for(String i:sites){System.out.println(i);}}
}
- 在LinkedList中添加了很多的方法,給我們提供了很多方便的地方,例如getFirst()取第一個,getLast()取最后一個等,詳見:
https://www.runoob.com/java/java-linkedlist.html
Java HashSet
- Java HashSet是基于HashMap來實現的,是一個不允許有重復元素的集合。
- 允許具有null值。
- 無序,不會記錄順序。
- 不是線程安全的,多個線程嘗試修改了它,那么結果也會具有不確定性。
- 它實現了Set接口。
- 他的基本元素實際上是對象,那么一些基本的類型可以使用它的包裝類。
- 導入包:java.util.HashSet
添加元素
- 使用add()方法來添加元素
import java.util.HashSet;public class Init {//main函數,程序入口public static void main(String[] args) {HashSet<Integer> newhashset = new HashSet<Integer>();newhashset.add(1);newhashset.add(2);newhashset.add(3);System.out.println(newhashset);}
}
判斷元素是否存在
- 使用contains()方法來判斷元素是否存在
import java.util.HashSet;public class Init {//main函數,程序入口public static void main(String[] args) {HashSet<Integer> newhashset = new HashSet<Integer>();newhashset.add(1);newhashset.add(2);newhashset.add(3);System.out.println(newhashset.contains(3));}
}
刪除元素
- 使用remove()方法來刪除某個元素
import java.util.HashSet;public class Init {//main函數,程序入口public static void main(String[] args) {HashSet<Integer> newhashset = new HashSet<Integer>();newhashset.add(1);newhashset.add(2);newhashset.add(3);System.out.println(newhashset.contains(3));newhashset.remove(3);System.out.println(newhashset.contains(3));}
}
清空
- 使用clear方法清空所有的元素,變成空的集合
import java.util.HashSet;public class Init {//main函數,程序入口public static void main(String[] args) {HashSet<Integer> newhashset = new HashSet<Integer>();newhashset.add(1);newhashset.add(2);newhashset.add(3);System.out.println(newhashset);newhashset.clear();System.out.println(newhashset);}
}
計算大小
- 使用size()方法來計算大小
import java.util.HashSet;public class Init {//main函數,程序入口public static void main(String[] args) {HashSet<Integer> newhashset = new HashSet<Integer>();newhashset.add(1);newhashset.add(2);newhashset.add(3);System.out.println(newhashset.size());}
}
迭代HashSet
- 通過foreach循環來迭代HashSet中的元素
import java.util.HashSet;public class Init {//main函數,程序入口public static void main(String[] args) {HashSet<Integer> newhashset = new HashSet<Integer>();newhashset.add(1);newhashset.add(2);newhashset.add(3);for(Integer item:newhashset){System.out.println(item);}}
}
HashMap
- HashMap是一個散列表,用于存儲鍵值對的映射
- HashMap實現了Map接口,根據鍵的HashCode值存儲數據,具有很快的訪問速度,最多允許的一條記錄的鍵為null,不支持線程同步
- HashMap是無序的
- HashMap 繼承于AbstractMap,實現了 Map、Cloneable、java.io.Serializable 接口。
初始化一個鍵值對
- 使用類的初始化來建立一個HashMap
HashMap<Integer, String> sites = new HashMap<Integer, String>();
添加元素
- 通過put()方法來添加鍵值對映射
public class Init {//main函數,程序入口public static void main(String[] args) {HashMap<Integer, String> sites = new HashMap<Integer, String>();sites.put(1,"Google");sites.put(2,"Baidu");sites.put(3,"Microsoft");System.out.println(sites);}
}
{1=Google, 2=Baidu, 3=Microsoft}
訪問元素
- 使用get(key)方法來通過key獲取value
System.out.println(sites.get(3));
刪除元素
- 使用remove(key)方法類刪除key對應的鍵值對(key-value)
import java.util.HashMap;public class Init {//main函數,程序入口public static void main(String[] args) {HashMap<Integer, String> sites = new HashMap<Integer, String>();sites.put(1,"Google");sites.put(2,"Baidu");sites.put(3,"Microsoft");System.out.println(sites);sites.remove(2);System.out.println(sites);}
}
{1=Google, 2=Baidu, 3=Microsoft}
{1=Google, 3=Microsoft}
刪除所有元素
- 使用clear()方法來刪除所有的元素
import java.util.HashMap;public class Init {//main函數,程序入口public static void main(String[] args) {HashMap<Integer, String> sites = new HashMap<Integer, String>();sites.put(1,"Google");sites.put(2,"Baidu");sites.put(3,"Microsoft");System.out.println(sites);sites.clear();System.out.println(sites);}
}
{1=Google, 2=Baidu, 3=Microsoft}
{}
迭代HashMap
- 使用for-each來迭代HashMap的元素
- 如果你只想獲取 key,可以使用 keySet() 方法,然后可以通過 get(key) 獲取對應的 value,如果你只想獲取 value,可以使用 values() 方法。
import java.util.HashMap;public class Init {//main函數,程序入口public static void main(String[] args) {HashMap<Integer, String> sites = new HashMap<Integer, String>();sites.put(1,"Google");sites.put(2,"Baidu");sites.put(3,"Microsoft");for(Integer i : sites.keySet()){System.out.println("Key: "+i+", Values: "+sites.get(i));}for(String value: sites.values()){System.out.println(value+" ");}}
}
Key: 1, Values: Google
Key: 2, Values: Baidu
Key: 3, Values: Microsoft
Baidu
Microsoft
Iterator迭代器
- Java迭代器是Java集合框架中的一種機制,提供了一種在不暴露集合內部實現的情況下遍歷集合元素的方法。
- 是一種訪問集合的方法,可用于迭代ArrayList、HashSet等集合。
- Iterator是Java迭代器最簡單的實現
- 三個基本操作:next()、hasNext()、remove()
獲取一個迭代器
- 使用iterator()方法來初始化一個迭代器
import java.util.Iterator;public class Init {//main函數,程序入口public static void main(String[] args) {ArrayList<String>list = new ArrayList<String>();list.add("Zhangsan");list.add("Lisi");list.add("Wangwu");Iterator<String> it = list.iterator();System.out.println(it.next());System.out.println(it.next());System.out.println(it.next());}
}
Zhangsan
Lisi
Wangwu
如果超過了遍歷的范圍,就會報錯
循環集合元素
import java.util.ArrayList;
import java.util.Iterator;public class Init {//main函數,程序入口public static void main(String[] args) {ArrayList<String>list = new ArrayList<String>();list.add("Zhangsan");list.add("Lisi");list.add("Wangwu");Iterator<String> it = list.iterator();while(it.hasNext()){System.out.println(it.next());}}
}
刪除元素
- 使用remove()方法來刪除元素
- 下面方法通過remove()刪除"Lisi"元素
import java.util.ArrayList;
import java.util.Iterator;public class Init {//main函數,程序入口public static void main(String[] args) {ArrayList<String>list = new ArrayList<String>();list.add("Zhangsan");list.add("Lisi");list.add("Wangwu");Iterator<String> it = list.iterator();while(it.hasNext()){String tmp = it.next();if(tmp.equals("Lisi")){it.remove();}}}
}