Java集合框架以及Collection集合的學習
- 前言(案例引入集合概念)
- 1.集合的由來
- 2.Java集合的框架
- 3.Collection介面常見方法
- 3.1 添加元素
- 3.2 洗掉元素
- 3.3 判斷是否包含元素
- 3.4 獲取集合的長度
- 3.5 獲取集合的交集
- 3.6 將集合轉換為陣列
- 4.Collection集合的遍歷
- 4.1 foreach回圈遍歷
- 4.2 Iterator迭代器遍歷
- 總結
前言(案例引入集合概念)
- 案例演示:我有3個學生,請把這個學生的資訊存盤到陣列中,并遍歷陣列,獲得每一個學生資訊,
下面是給定學生類的具體資訊:
| 學生:Student |
|---|
| 成員變數:name,age |
| 構造方法:無參構造,有參構造 |
| 成員方法:get()以及set()方法 |
陣列實作學生資訊的存盤:
//Student學生類
public class Student {
private String name;
private int age;
public Student() {
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
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;
}
//重寫toString方法
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
//測驗類:
public class MyTest {
public static void main(String[] args) {
//存盤三個學生資訊,存盤在陣列中并進行遍歷
Student student1 = new Student("張三", 13);
Student student2 = new Student("李四", 15);
Student student3 = new Student("王五", 16);
Student[] studentlist = new Student[3];
studentlist[0]=student1;
studentlist[1]=student2;
studentlist[2]=student3;
for (int i = 0; i < studentlist.length; i++) {
System.out.println(studentlist[i]);
}
}
}
但是使用陣列存盤元素也會存在弊端:當陣列中需要添加或者洗掉元素時,就比較麻煩,而集合概念的引入就解決這一問題,
1.集合的由來
- 不管是哪一種資料結構,其實本質上就是容器,就是裝物件的,因此我們需要搞清楚兩點:(1)如何存盤(2)存盤特點,
前面我們學習過陣列,我們先來看下陣列是如何存盤的以及陣列的存盤特點:
- 邏輯結構:線性的
- 物理結構:順序的存盤結構
- 申請記憶體:一次申請一大段連續的空間·,一旦申請到了,記憶體就固定了
- 存盤特點:所有資料存盤在這個連續的空間中,陣列中的每一個元素都是一個具體的資料(物件),所有資料都緊密排布,不能有間隔

| 關于陣列的操作 |
|---|
| 查詢:每一個元素都是一個數值下標,可以通過下標瞬間定位到某個元素 |
| 增加:1.先使用total變數輔助記錄實際存盤元素個數 |
| 2.從尾部增加:陣列名【total++】=新元素 |
| 3.從其他位置插入:先把index位置開始所有元素后移,然后陣列名【index】=新元素 |
| 洗掉:先把index后面的元素前移,然后陣列名【total- -】=null |
| 改:直接陣列名【index】=新元素 |
| 陣列的優點:按索引查詢效率高 |
| 陣列的缺點:添加/洗掉效率低 |
由于我們使用的是面向物件語言,所以,我們要經常使用物件,而很多時候,我們可能需要使用很的物件,這個時候,我們就只能使用以前講過的陣列進行存盤了,而陣列的特點是長度固定,這樣的話就不適合變化的資料,所以,java重新提供了一種容器,用于存盤物件,這種容器叫集合,
下面是陣列與集合之間的區別:
| 陣列和集合之間的區別 |
|---|
| 長度區別:陣列的長度是固定的;集合的長度是可變 |
| 存盤資料型別:陣列可以存盤基本資料型別,也可以存盤參考資料型別;而集合只能存盤參考資料型別 |
| 內容區別:陣列只能存盤同種資料型別的元素;集合可以存盤不同型別的元素 |
2.Java集合的框架
為了滿足用戶資料更多種的邏輯關系,而設計一系列的不同于陣列的聚合的抽象資料型別,這些介面和類在java.util包中,因為型別很豐富,因此我們通常稱為集合框架,


Java集合類主要由兩個根介面Collection和Map派生出來的,Collection派生出了三個子介面:List、Set、Queue(Java5新增的佇列),因此Java集合大致也可分成List、Set、Queue、Map四種介面體系,(注意:Map不是Collection的子介面),
其中List代表了有序可重復集合,可直接根據元素的索引來訪問;Set代表無序不可重復集合,只能根據元素本身來訪問;Queue是佇列集合;Map代表的是存盤key-value對的集合,可根據元素的key來訪問value,
上圖中淡綠色背景覆寫的是集合體系中常用的實作類,分別是ArrayList、LinkedList、HashSet、TreeSet、HashMap、TreeMap等實作類,
3.Collection介面常見方法
Collection介面中常見的方法如下,這些都是最基本常用的,

3.1 添加元素
| Collection集合中添加元素的方法 |
|---|
| add(Object obj) :添加元素物件到當前的集合中去 |
| addAll(Collection other):添加other集合中的所有元素物件到當前集合中,即this = this ∪ other |
import java.util.ArrayList;
import java.util.Collection;
public class MyTest {
public static void main(String[] args) {
Collection collection = new ArrayList();//Arraylist是Collection的子介面List的實作
//add()往集合中添加元素,回傳值的意思為該元素是否添加成功
boolean flag = collection.add("aaa");
System.out.println(flag);
collection.add("bbb");
collection.add("ccc");
System.out.println(collection);
}
}
public class MyTest2 {
public static void main(String[] args) {
Collection collection = new ArrayList();
//集合中存盤的元素為參考資料型別
collection.add(10);//這里的數為Integer型別
collection.add(20);
collection.add(30);
collection.add(5);
collection.add(Integer.valueOf(25));
collection.add(new Integer(60));
System.out.println(collection);
}
import java.util.ArrayList;
import java.util.Collection;
public class MyTest2 {
public static void main(String[] args) {
Collection list = new ArrayList();
//集合中的資料為參考資料型別
list.add(1);//這里為Integer資料型別
list.add(2);
System.out.println(list);
ArrayList list2 = new ArrayList();
list2.add(1);
list2.add(2);
list2.add(3);
list2.add(4);
System.out.println(list2);
list.addAll(list2);
//list.add(list2);
System.out.println("經過addAll方法后的list集合為:" + list);
System.out.println("經過addAll方法后的list2集合為:" + list2);
}
}
- 這里需要注意的是:list.addAll(list2);與list.add(list2)方法的區別:

3.2 洗掉元素
| Collection集合中洗掉元素的方法 |
|---|
| void clear():移除所有元素 |
| boolean remove(Object o):移除一個元素 |
| boolean removeAll(Collection c):移除一個集合中的元素(移除一個以上回傳的就是true)洗掉的元素是兩個集合的交集元素,如果沒有交集元素,則洗掉失敗,回傳false, |
import java.util.ArrayList;
import java.util.Collection;
public class MyTest3 {
public static void main(String[] args) {
Collection collection = new ArrayList();
collection.add("張三");
collection.add("李四");
collection.add("王五");
System.out.println(collection);
//boolean remove(Object o):移除一個元素
collection.remove("王五");
System.out.println("經過remove方法后:"+collection);
//void clear():移除所有元素移除集合中所有的元素
collection.clear();
System.out.println(collection);
}
}
import java.util.ArrayList;
import java.util.Collection;
public class MyTest4 {
public static void main(String[] args) {
Collection collection1 = new ArrayList();
collection1.add(100);
collection1.add(200);
collection1.add(300);
collection1.add(400);
Collection collection2 = new ArrayList();
collection2.add(1);
collection2.add(2);
collection2.add(100);
collection2.add(200);
//移除一個集合的元素(移除一個以上回傳的就是true) 洗掉的元素是兩個集合的交集元素
boolean flag = collection1.removeAll(collection2);
System.out.println(flag);
System.out.println(collection1);
System.out.println(collection2);
}
}
3.3 判斷是否包含元素
| Colection集合是否包含元素 |
|---|
| boolean isEmpty():判斷當前集合是否為空集合 |
| boolean contains(Object o):判斷集合中是否包含指定的元素 |
| boolean containsAll(Collection c):判斷c集合中的元素是否在當前集合中都存在,即c集合是否是當前集合的“子集”, |
import java.util.ArrayList;
import java.util.Collection;
public class MyTest5 {
public static void main(String[] args) {
Collection collection = new ArrayList();
collection.add(100);
collection.add("王五");
collection.add(300);
collection.add(200);
//判斷集合中是否包含該元素,如果包含元素回傳true
boolean flag = collection.contains(100);
System.out.println(flag);
System.out.println(collection);
}
}
import java.util.ArrayList;
import java.util.Collection;
public class MyTest6 {
public static void main(String[] args) {
Collection collection1=new ArrayList();
collection1.add(100);
collection1.add(200);
collection1.add(300);
collection1.add(400);
collection1.add(500);
Collection collection2 = new ArrayList();
collection2.add(100);
collection2.add(200);
/* 判斷集合中是否包含指定的集合元素(這個集合 包含 另一個集合中所有的元素才算包含 才回傳true)
比如:[1,2,3]containsAll [1,2] = true, [1, 2, 3]containsAll[2, 3, 4]= false*/
boolean flag = collection1.containsAll(collection2);
System.out.println(flag);
System.out.println(collection1);
System.out.println(collection2);
collection2.clear();
//boolean isEmpty():判斷當前集合是否為空集合
boolean b = collection2.isEmpty();
System.out.println(b);
}
}
3.4 獲取集合的長度
- 我們知道陣列和字串中有length()方法可以獲得其長度,但集合中沒有length()方法,那我們如何獲取集合的長度呢?
| Collection集合為獲取集合的長度的方法 |
|---|
| int size():元素的個數 |
import java.util.ArrayList;
import java.util.Collection;
public class MyTest7 {
public static void main(String[] args) {
Collection collection = new ArrayList();
collection.add(100);
collection.add(200);
collection.add(300);
collection.add(400);
//獲取集合長度的方法
int size = collection.size();
System.out.println(size);
}
}
3.5 獲取集合的交集
- 集合的交集功能實質性決議:A集合對B集合取交集,獲取到的交集元素在A集合中,回傳的布林值是A集合是否發生變化,A集合對B集合取交集元素,如果沒有取到交集元素,A集合會被清空,
| Collection集合獲取兩個集合交集 |
|---|
| boolean retainAll(Collection c):獲取兩個集合的交集元素(交集:兩個集合都有的元素) |
import java.util.ArrayList;
import java.util.Collection;
public class MyTest8 {
public static void main(String[] args) {
Collection collection1 = new ArrayList();
collection1.add(10);
collection1.add(20);
collection1.add(30);
collection1.add(200);
Collection collection2 = new ArrayList();
collection2.add(10);
collection2.add(20);
collection2.add(300);
collection2.add(400);
// boolean retainAll(Collection c):獲取兩個集合的交集元素(交集:兩個集合都有的元素)
/*
例如:A集合對B集合取交集,獲取到的交集元素在A集合中,回傳的布林值表示的是A集合是否發生變化
A集合對B集合取交集元素,如果沒有取到交集元素A集合會被清空
*/
boolean flag = collection1.retainAll(collection2);
System.out.println(flag);
System.out.println(collection1);
System.out.println(collection2);
}
}
3.6 將集合轉換為陣列
| Collection集合將集合轉換為陣列 |
|---|
| Object[] toArray():回傳包含當前集合中所有元素的陣列 |
public class MyTest9 {
public static void main(String[] args) {
Collection collection=new ArrayList();
collection.add(100);
collection.add(200);
collection.add(300);
collection.add(400);
//將集合轉換為陣列
Object[] objects = collection.toArray();
//遍歷陣列
for (int i = 0; i < objects.length; i++) {
System.out.println(objects[i]);
}
}
}
public class Student {
private String name;
private int age;
public Student() {
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
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;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
public class MyTest {
public static void main(String[] args) {
Student s1 = new Student("張三", 23);
Student s2 = new Student("李四", 24);
Student s3 = new Student("王五", 25);
Collection collection=new ArrayList();
collection.add(s1);
collection.add(s2);
collection.add(s3);
//將集合轉換為陣列
Object[] objects = collection.toArray();
for (int i = 0; i < objects.length; i++) {
Student stu= (Student) objects[i];
System.out.println(stu);
}
}
}
4.Collection集合的遍歷
Collectio集合中有兩種常見的遍歷的方式:foreach回圈遍歷以及Iterator迭代器遍歷,
4.1 foreach回圈遍歷
Java5以后Collection介面中繼承了java.lang.Iterable介面,因此Collection系列集合就可以直接使用foreach回圈來進行遍歷,
foreach回圈遍歷格式:for(元素的型別 迭代變數: 陣列/集合名稱){
//每一個回圈迭代變數依次代表集合中的每一個元素

public class MyTest2 {
public static void main(String[] args) {
Collection collection = new ArrayList();
collection.add(10);
collection.add(20);
collection.add(30);
collection.add(40);
//增強for回圈
for (Object o : collection) {
System.out.println(o);
//collection.add(5); //錯誤
//collection.remove(10); //錯誤
/*
foreach回圈只適用于查看/查找集合中的元素,不能在
遍歷集合時,有任何影響集合元素個數的操作,否則會
報例外或者操作結果不確定
*/
}
}
}
- 在這里需要注意的是:foreach遍歷只適用于查看/查找集合中的元素,不能在遍歷集合時有任何影響集合元素個數的操作,否則會報例外或者操作結果不確定
提示:集合中只能添加物件,不能添加基本資料型別的資料,如果添加基本資料型別的資料,它會自動裝箱為對應包裝型別的物件,
4.2 Iterator迭代器遍歷
因為Collection介面繼承了java.lang.Iterable介面,該介面中有iterator()方法,那么所有實作了Collection介面的集合類都有一個iterator()方法,用以回傳一個實作了Iterator介面的物件,該物件可以迭代集合中的元素
- Iterator僅用于遍歷集合,Iterator本身并不提供承裝物件的能力,如果需要Iterator物件,就必須有一個被迭代的集合
- 集合物件每次呼叫iterator()方法都能得到一個全新的迭代器物件,默認游標都在集合的第一個元素,

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
public class MyTest2 {
public static void main(String[] args) {
//使用迭代器遍歷Collection集合
//java.util 介面 Iterator<E >
//java.util.ArrayList$Itr @ 1 b6d3586
//迭代器是內部類,內部類直接可以訪問外部類的成員
// private class Itr implements Iterator<E>
/* 方法摘要
boolean hasNext ()
如果仍有元素可以迭代,則回傳 true,
E next ()
回傳迭代的下一個元素,*/
//
Collection collection = new ArrayList();
collection.add(10);
collection.add(20);
collection.add(30);
collection.add(40);
collection.add(50);
Iterator iterator = collection.iterator();
while (iterator.hasNext()) {
Object next = iterator.next();
System.out.println(next);
}
}
}
public class Student {
private int id;
private String name;
public Student() {
}
public Student(int id, String name) {
this.id = id;
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Student{" +
"id=" + id +
", name='" + name + '\'' +
'}';
}
}
public class MyTest {
public static void main(String[] args) {
Collection collection = new ArrayList();
Student s1 = new Student(1, "張三");
Student s2 = new Student(2, "李四");
Student s3 = new Student(3, "王五");
collection.add(s1);
collection.add(s2);
collection.add(s3);
Iterator iterator = collection.iterator();
while (iterator.hasNext()) {
//向下轉型
Student student= (Student) iterator.next();
System.out.println(student);
}
}
}
總結
本節首先對集合的引入進行介紹,比較集合與陣列之間的區別,總體探討了下Java集合框架圖,對于后面的集合具體學習明確了方向,最后,對于Collection集合中的常用方法以及遍歷方式進行介紹,希望此篇文章對于正在學習集合的朋友有所幫助,

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/262184.html
標籤:java
下一篇:并發編程核心——九、阻塞佇列
