一、集合簡介
集合本質是基於某種數據結構數據容器。常見的數據結構:數組(Array)、集(Set)、隊列 (Queue)、鏈表(Linkedlist)、樹(Tree)、堆(Heap)、棧(Stack)和映射(Map)等結構。
Java中提供了豐富的集合接口和類,它們來自於java.util包。如圖所示是Java主要的集合接口和 類,從圖中可見Java集合類型分爲:Collection和Map,Collection子接口有:Set、Queue和List等接口。 每一種集合接口描述了一種數據結構。
在Java SE中List名稱的類型有兩個,一個是java.util.List,另外一個是java.awt.List。 java.util.List是一個接口,而java.awt.List是一個類,用於圖形用戶界面開 發,它是一個圖形界面中的組件。學習Java中的集合,首先從兩大接口入手,重點掌握List、Set和Map三個接口,熟悉這些接 口中提供的方法。然後再熟悉這些接口的實現類,並瞭解不同實現類之間的區別。
二、List集合
List集合中的元素是有序的,可以重複出現。List接口的實現類有:ArrayList 和 LinkedList。ArrayList是基於動態數組數據結構的實現,LinkedList 是基於鏈表數據結構的實現。ArrayList訪問元素速度優於LinkedList,LinkedList佔用的內存空間比較 大,但LinkedList在批量插入或刪除數據時優於ArrayList。
(1)常用方法
List接口繼承自Collection接口,List接口中的很多方法都繼承自Collection接口的。List接口中常用方法如下。
- 操作元素
get(int index):返回List集合中指定位置的元素。
set(int index, Object element):用指定元素替換List集合中指定位置的元素。
add(Object element):在List集合的尾部添加指定的元素。該方法是從Collection集合繼承 過來的。
add(int index, Object element):在List集合的指定位置插入指定元素。 remove(int index):移除List集合中指定位置的元素。
remove(Object element):如果List集合中存在指定元素,則從List集合中移除第一次出現的 指定元素。該方法是從Collection集合繼承過來的。
clear():從List集合中移除所有元素。該方法是從Collection集合繼承過來的。 - 判斷元素
isEmpty():判斷List集合中是否有元素,沒有返回true,有返回false。該方法是從 Collection集合繼承過來的。
contains(Object element):判斷List集合中是否包含指定元素,包含返回true,不包含返回 false。該方法是從Collection集合繼承過來的。 - 查詢元素
indexOf(Object o):從前往後查找List集合元素,返回第一次出現指定元素的索引,如果
此列表不包含該元素,則返回-1。
lastIndexOf(Object o):從後往前查找List集合元素,返回第一次出現指定元素的索引,如果此列表不包含該元素,則返回-1。 - 其他
iterator():返回迭代器(Iterator)對象,迭代器對象用於遍歷集合。該方法是從Collection 集合繼承過來的。
size():返回List集合中的元素數,返回值是int類型。該方法是從Collection集合繼承過來 的。
subList(int fromIndex, int toIndex):返回List集合中指定的 fromIndex(包括 )和 toIndex(不包括)之間的元素集合,返回值爲List集合。
代碼如下:
package 集合.list集合;
import java.util.ArrayList;
import java.util.List;
//list集合:有序,重複
public class HelloWorld {
public static void main(String[] args) {
//
List list = new ArrayList();
String b = "B";
// 向集合中添加元素
list.add("A");
list.add(b);
list.add("C");
list.add(b);
list.add("D");
list.add("E");
// 打印集合的元素個數
System.out.println("集合 size = "+list.size());
// 打印集合
System.out.println(list);
//從前往後查找b元素
System.out.println("indexOf(\"B\") = " +list.indexOf(b));
// 從後往前查找"B"元素
System.out.println("lastindexOf(\"B\") = " +list.lastIndexOf(b));
//刪除集合中第一個"B"元素
list.remove(b);
System.out.println("remove(3)前: "+list);
//判斷集合中是否包含"B"元素
System.out.println("是否包含\"B\":" + list.contains(b));
//刪除集合第4個元素
list.remove(3);
System.out.println("remove(3)後: " + list);
//判斷集合是否爲空
System.out.println("list集合是空的:" + list.isEmpty());
System.out.println("替換前:" + list); //替換集合第2個元素
list.set(1, "F");
System.out.println("替換後:" + list);
//清空集合
list.clear();
System.out.println(list);
// 重新添加元素
list.add(1);// 發生自動裝箱
list.add(3);
int item = (Integer)list.get(0);//發生自動拆箱
}
}
運行結果:
集合 size = 6
[A, B, C, B, D, E]
indexOf("B") = 1
lastindexOf("B") = 3
remove(3)前: [A, C, B, D, E]
是否包含"B":true
remove(3)後: [A, C, B, E]
list集合是空的:false
替換前:[A, C, B, E]
替換後:[A, F, B, E]
[]
(2)遍歷集合
集合最常用的操作之一是遍歷,遍歷就是將集合中的每一個元素取出來,進行操作或計算。List集合遍歷有三種方法:
- 使用for循環遍歷:List集合可以使用for循環進行遍歷,for循環中有循環變量,通過循環變量可
以訪問List集合中的元素。 - 使用for-each循環遍歷:for-each循環是針對遍歷各種類型集合而推出的,筆者推薦使用這種遍歷
方法。 - 使用迭代器遍歷:Java提供了多種迭代器,List集合可以使用Iterator和ListIterator迭代器。
代碼如下:
package 集合.list集合遍歷;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class HelloWorld {
public static void main(String[] args) {
List list = new ArrayList();
String b = "B";
// 向集合中添加元素
list.add("A");
list.add(b);
list.add("C");
list.add(b);
list.add("D");
list.add("E");
// 打印集合
System.out.println(list);
// for循環遍歷集合
System.out.println("--1.使用for循環遍歷--");
for (int i = 0;i<list.size();i++){
// System.out.println(list.get(i));
System.out.printf("讀取集合元素(%d): %s \n", i, list.get(i));
}
// 2.使用for-each循環遍歷
System.out.println("--2.使用for-each循環遍歷--");
for (Object items:list){
String s = (String) items;
System.out.println("讀取集合元素:"+s);
}
// 3.使用迭代器遍歷
System.out.println("--3.使用迭代器遍歷--");
Iterator iterator = list.iterator();
while (iterator.hasNext()){
Object items = iterator.next();
String s = (String)items;
System.out.println("讀取集合元素:"+s);
}
}
}
運行結果:
[A, B, C, B, D, E]
--1.使用for循環遍歷--
讀取集合元素(0): A
讀取集合元素(1): B
讀取集合元素(2): C
讀取集合元素(3): B
讀取集合元素(4): D
讀取集合元素(5): E
--2.使用for-each循環遍歷--
讀取集合元素:A
讀取集合元素:B
讀取集合元素:C
讀取集合元素:B
讀取集合元素:D
讀取集合元素:E
--3.使用迭代器遍歷--
讀取集合元素:A
讀取集合元素:B
讀取集合元素:C
讀取集合元素:B
讀取集合元素:D
讀取集合元素:E
二、Set集合
Set集合是由一串無序的,不能重複的相同類型元素構成的集合。List集合強調的是有序,Set集合強調的是不重複。當不考慮順序,且沒有重複元素時,Set集合和List集 合可以互相替換的。Set接口直接實現類主要是HashSet,HashSet是基於散列表數據結構的實現。
(1)常用方法
Set接口也繼承自Collection接口,Set接口中大部分都是繼承自Collection接口,這些方法如下。
- 操作元素
add(Object element):在Set集合的尾部添加指定的元素。該方法是從Collection集合繼承過來的。
remove(Object element):如果Set集合中存在指定元素,則從Set集合中移除該元素。該方法是從Collection集合繼承過來的。
clear():從Set集合中移除所有元素。該方法是從Collection集合繼承過來的。 - 判斷元素
isEmpty():判斷Set集合中是否有元素,沒有返回true,有返回false。該方法是從 Collection集合繼承過來的。
contains(Object element):判斷Set集合中是否包含指定元素,包含返回true,不包含返回 false。該方法是從Collection集合繼承過來的。 - 其他
iterator():返回迭代器(Iterator)對象,迭代器對象用於遍歷集合。該方法是從Collection
集合繼承過來的。
size():返回Set集合中的元素數,返回值是int類型。該方法是從Collection集合繼承過來的。
代碼如下:
//set集合:無序,不重複
import java.util.HashSet;
public class Set {
public static void main(String[] args) {
java.util.Set set = new HashSet();
String b = "B";
// 向集合中添加元素
set.add("A");
set.add(b);
set.add("C");
set.add(b);
set.add("D");
set.add("E");
// 打印集合個數
System.out.println("集合size = "+set.size());
// 打印集合
System.out.println(set);
// 刪除集合中的B元素
set.remove(b);
// 判斷集合中是否包含"B"元素
System.out.println("判斷是否包含B元素"+set.contains(b));
// 判斷集合是否爲空
System.out.println("判斷集合是否爲空"+set.isEmpty());
// 清空集合
set.clear();
// 打印集合
System.out.println(set);
}
}
運行結果:
集合size = 5
[A, B, C, D, E]
判斷是否包含B元素false
判斷集合是否爲空false
[]
(2)遍歷集合
Set集合中的元素由於沒有序號,所以不能使用for循環進行遍歷,但可以使用for-each循環和迭代器進 行遍歷。事實上這兩種遍歷方法也是繼承自Collection集合,也就是說所有的Collection集合類型都有這 兩種遍歷方式。
代碼如下:
public class Bianli {
public static void main(String[] args) {
Set set = new HashSet();
String b = "B";
// 向集合中添加元素
set.add("A");
set.add(b);
set.add("C");
set.add(b);
set.add("D");
set.add("E");
// 打印集合
System.out.println(set);
// 1,使用增強for遍歷
System.out.println("--1,使用增強for遍歷--");
for (Object item : set){
String s = (String)item;
System.out.println(s);
}
// 2.使用迭代器遍歷集合
System.out.println("--2.使用迭代器遍歷集合--");
Iterator iterator = set.iterator();
while (iterator.hasNext()){
Object item = iterator.next();
String s = (String)item;
System.out.println("讀取集合"+s);
}
}
}
運行結果:
[A, B, C, D, E]
--1,使用增強for遍歷--
A
B
C
D
E
--2.使用迭代器遍歷集合--
讀取集合A
讀取集合B
讀取集合C
讀取集合D
讀取集合E
三、Map集合
Map(映射)集合表示一種非常複雜的集合,允許按照某個鍵來訪問元素。Map集合是由兩個集合構 成的,一個是鍵(key)集合,一個是值(value)集合。鍵集合是Set類型,因此不能有重複的元素。 而值集合是Collection類型,可以有重複的元素。Map集合中的鍵和值是成對出現的。Map接口直接實現類主要是HashMap,HashMap是基於散列表數據結構的實現。
(1)常用方法
Map集合中包含兩個集合(鍵和值),所以操作起來比較麻煩,Map接口提供很多方法用來管理和操 作集合。主要的方法如下。
- 操作元素
get(Object key):返回指定鍵所對應的值;如果Map集合中不包含該鍵值對,則返回null。 put(Object key, Object value):指定鍵值對添加到集合中。
remove(Object key):移除鍵值對。
clear():移除Map集合中所有鍵值對。 - 判斷元素
isEmpty():判斷Map集合中是否有鍵值對,沒有返回true,有返回false。
containsKey(Object key):判斷鍵集合中是否包含指定元素,包含返回true,不包含返回false。
containsValue(Object value):判斷值集合中是否包含指定元素,包含返回true,不包含返回false。 - 查看集合
keySet():返回Map中的所有鍵集合,返回值是Set類型。
values():返回Map中的所有值集合,返回值是Collection類型。
size():返回Map集合中鍵值對數。
代碼如下:
package 集合.map集合;
import java.util.HashMap;
public class Map {
public static void main(String[] args) {
java.util.Map map = new HashMap();
map.put(101,"A");
map.put(102, "B");
map.put(103, "C");
map.put(104, "D");
// B重複
map.put(105, "B");
//把102的值換成E
map.put(102, "E");
// 打印集合
System.out.println(map);
// 打印集合元素個數
System.out.println("集合size="+map.size());
// 通過鍵取值
System.out.println("102-"+map.get(102));
System.out.println("105-"+map.get(105));
// 刪除鍵值對
map.remove(102);
System.out.println(map);
// 判斷集合中是否包含105
System.out.println("集合中是否包含102"+map.containsKey(105));
// 集合中是否包含"A"
System.out.println("集合中是否包含A"+map.containsValue("A"));
// 判斷集合是否爲空
System.out.println("集合是否爲空"+map.isEmpty());
// 清空集合
map.clear();
System.out.println(map);
}
}
運行結果:
{101=A, 102=E, 103=C, 104=D, 105=B}
集合size=5
102-E
105-B
{101=A, 103=C, 104=D, 105=B}
集合中是否包含102true
集合中是否包含Atrue
集合是否爲空false
{}
(2)遍歷集合
Map集合遍歷與List和Set集合不同,Map有兩個集合,因此遍歷時可以只遍歷值的集合,也可以只遍歷鍵的集合,也可以同時遍歷。這些遍歷過程都可以使用for-each循環和迭代器進行遍歷。
代碼如下:
package 集合.map集合遍歷;
import java.util.*;
public class Mapbianli {
public static void main(String[] args) {
Map map = new HashMap();
map.put(101,"A");
map.put(102, "B");
map.put(103, "C");
map.put(104, "D");
// 使用增強for循環遍歷
System.out.println("使用增強for循環遍歷");
// 獲得鍵集合
Set keys = map.keySet();
for (Object key:keys){
// 自動拆箱
int ikey = (Integer) key;
// 自動裝箱
String value = (String)map.get(ikey);
System.out.printf("key=%d-value=%s \n",ikey,value);
}
// 使用迭代器遍歷集合
System.out.println("使用迭代器遍歷集合");
// 獲得值集合
Collection values = map.values();
// 遍歷值集合
Iterator iterator = values.iterator();
while (iterator.hasNext()){
Object item = iterator.next();
String s = (String)item;
System.out.println("集合元素集合:"+s);
}
}
}
運行結果:
使用增強for循環遍歷
key=101-value=A
key=102-value=B
key=103-value=C
key=104-value=D
使用迭代器遍歷集合
集合元素集合:A
集合元素集合:B
集合元素集合:C
集合元素集合:D
以上內容僅供參考學習,如有侵權請聯繫我刪除!
如果這篇文章對您有幫助,左下角的大拇指就是對博主最大的鼓勵。
您的鼓勵就是博主最大的動力!