Java集合01 1.什麼是集合? 前面我們保存數據使用的是數組,數組有不足的地方,我們來分析一下: 長度開始時必須指定,而且一但指定不能更改 保存的必須是同一類型的元素 使用數組進行增加/刪除元素的很麻煩 重新創建一個數組,將舊數組的元素拷貝過來 集合的好處: 可以動態地保存任意多個對象,使用比較 ...
Java集合01
1.什麼是集合?
前面我們保存數據使用的是數組,數組有不足的地方,我們來分析一下:
- 長度開始時必須指定,而且一但指定不能更改
- 保存的必須是同一類型的元素
- 使用數組進行增加/刪除元素的很麻煩----重新創建一個數組,將舊數組的元素拷貝過來
- 集合的好處:
- 可以動態地保存任意多個對象,使用比較方便
- 提供了一系列方便的操作對象的方法:add、remove、set、get等
- 使用集合添加、刪除新元素簡單高效
1.1集合的框架體系
- 集合主要是兩組(單列集合,雙列集合)
- Collection介面有兩個重要的子介面List和Set,它們的實現子類都是單列集合
- Map介面的實現子類 是雙列集合,存放的是 K-V
例子
package li.collections;
import java.util.*;
public class CollectionsTest {
public static void main(String[] args) {
//Collection
//Map
ArrayList arrayList = new ArrayList();
arrayList.add("jack");//單列
arrayList.add("tony");
HashMap hashMap = new HashMap();
hashMap.put("No1","北京");//雙列
hashMap.put("No2","上海");
}
}
2.Collection介面
- Collection介面實現類的特點
public interface Collecion<E> extends Iterable<E>
- Collection 實現子類可以存放多個元素,每個元素可以是Object
- Collection的實現類,有些可以存放重覆的元素,有些不可以
- Collection的實現類,有些是有序的(List),有些是無序的(Set)
- Collection介面沒有直接實現的子類,是通過它的子介面List和Set來實現的
2.1Collection方法
- add()添加單個元素
- remove()刪除指定元素
- contains()查找元素是否存在
- size()獲取元素個數
- isEmpty()判斷是否為空
- clear()清空
- addAll()添加多個元素
- containsAll()查找多個元素是否都存在
- removeAll()刪除多個元素
例子1:Collection介面不能直接被實例化,因此以實現了介面的子類ArrayList來演示
package li.collections;
import java.util.*;
public class CollectionMethod {
public static void main(String[] args) {
List list = new ArrayList();
//1. add()添加單個元素
list.add("jack");
list.add(10);//list.add(new Integer(10)); 自動裝箱
list.add(true);
System.out.println("list="+list);//list=[jack, 10, true] 註意裡面的元素都是對象,非基本數據類型
//2. remove()刪除指定元素
//list.remove(0);//指定刪除的索引
//System.out.println("list="+list);//list=[10, true]
list.remove(true);//指定刪除某個對象
System.out.println("list="+list);//list=[jack, 10]
//3. contains()查找元素是否存在
System.out.println(list.contains("jack"));//true
//4. size()獲取元素個數
System.out.println(list.size());//2
//5. isEmpty()判斷是否為空
System.out.println(list.isEmpty());//false
//6. clear()清空
list.clear();
System.out.println(list);//[] 空的集合
//7. addAll()添加多個元素
ArrayList list2 =new ArrayList();
list2.add("紅樓夢");
list2.add("三國演義");
list.addAll(list2);
System.out.println("list="+list);//list=[紅樓夢, 三國演義]
//8. containsAll()查找多個元素是否都存在
System.out.println(list.containsAll(list2));//true
//9. removeAll()刪除多個元素
list.add("聊齋誌異");
list.removeAll(list2);
System.out.println("list="+list);//list=[聊齋誌異]
}
}
3.迭代器遍歷
-
迭代:即Collection集合元素的通用獲取方式。在取元素之前先要判斷集合中有沒有元素,如果有,就把這個元素取出來,繼續再判斷,如果還有就再取出出來。一直把集合中的所有元素全部取出。這種取出方式專業術語稱為迭代。
-
基本介紹:
- Iterator對象稱為迭代器,主要用於遍歷Collection集合中的元素。
- 所有實現了Collection介面的集合類都有一個iterator()方法,用以返回一個實現了Iterator介面的對象,即可以返回一個迭代器
- Iterator僅用於遍歷集合,Iterator本身並不存放對象
- Iterator介面的常用方法如下:
- public E next():返回迭代的下一個元素。
- public boolean hasNext():如果仍有元素可以迭代,則返回 true。
- default void remove():
- 迭代器的執行原理:
PS:在調用iterator.next()方法之前一定必須要調用iterator.hasNext()方法來進行檢測,若不調用且下一條記錄無效則會拋出 NoSuchElementException 異常。
例子:
package li.collections;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
public class CollectionIterator {
@SuppressWarnings({"all"})
public static void main(String[] args) {
Collection col = new ArrayList();
col.add(new Book("三國演義","羅貫中",10.1));
col.add(new Book("小李飛刀","古龍",5.1));
col.add(new Book("紅樓夢","曹雪芹",34.6));
System.out.println("col"+col);//col[Book{name='三國演義', author='羅貫中', price=10.1}, Book{name='小李飛刀', author='古龍', price=5.1}, Book{name='紅樓夢', author='曹雪芹', price=34.6}]
//現在想要遍歷這個col集合
//1.先得到col集合對應的迭代器
Iterator iterator = col.iterator();
//2.使用while迴圈遍歷
while (iterator.hasNext()) {
Object next = iterator.next();
System.out.println(next);
}
//3.當退出while迴圈之後,這使得iterator迭代器指向最後的元素,
// 這時如果再執行iterator.next()就會出現NoSuchElementException異常
//4.如果想要再次遍歷集合,則需要重置迭代器
//重置迭代器,這之後就可以再次遍歷,實質上是重新創建了一個迭代器對象
iterator = col.iterator();
}
}
class Book{
private String name;
private String author;
private double price;
public Book(String name, String author, double price) {
this.name = name;
this.author = author;
this.price = price;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
@Override
public String toString() {
return "Book{" +
"name='" + name + '\'' +
", author='" + author + '\'' +
", price=" + price +
'}';
}
}
快捷鍵:itit
快捷鍵:Ctrl+j 顯示所有快捷鍵
4.集合增強
-
Collection介面遍歷對象的方式1--迭代器遍歷 2--for迴圈增強
-
增強for迴圈,可以代替iterator迭代器,特點:增強for迴圈就是簡化版的iterator,本質一樣。只能用於遍歷集合或者數組。
-
基本語法:
for(元素類型 元素名:集合名或數組名){ 訪問元素 }
例子:
package li.collections; import java.util.ArrayList; import java.util.Collection; public class CollectionFor { @SuppressWarnings({"all"}) public static void main(String[] args) { Collection col = new ArrayList(); col.add(new Book("三國演義","羅貫中",10.1)); col.add(new Book("小李飛刀","古龍",5.1)); col.add(new Book("紅樓夢","曹雪芹",34.6)); //增強for,用於集合 //增強for底層仍然是迭代器 //因此增強for可以理解成簡化版的迭代器 for (Object book:col) {//元素類型 元素名:集合名或數組名 System.out.println("book="+book); } //使用增強for,不但可以適用於集合,還可以用於數組 int[] nums ={1,3,8,10}; for (int i:nums){ System.out.println("i="+i); } } }
快捷鍵:集合名.for
5.List介面
List介面是Collection介面的子介面
- List集合類中的元素有序(即添加順序和取出順序一致),且可重覆
- List集合中的每個元素都有其對應的順序索引,即支持索引
- List容器中的元素都對應一個整數型序號記載在其容器中的位置,可以根據序號存取容器中的元素
- JDK API中List介面的實現子類有很多,常用的有ArrayList、LinkedList和Vector
5.1List介面的常用方法
-
boolean add(int index, E element) 將指定的元素插入此列表中的指定位置(可選操作)
-
boolean addAll(int index, Collection<? extends E> c) 將指定集合中的所有元素插入到此列表中的指定位置(可選操作)
-
Obect get(int index) 返回此列表中指定位置的元素
-
int indexOf(Object o) 返回此列表中指定元素的第一次出現的索引,如果此列表不包含元素,則返回-1
-
int lastIndexOf(Object o) 返回此列表中指定元素的最後一次出現的索引,如果此列表不包含元素,則返回-1
-
Object remove(int index) 刪除該列表中指定位置的元素,並返回此元素(可選操作)
-
Object set(int index, E element) 用指定的元素(可選操作)替換此列表中指定位置的元素
-
List subList(int fromIndex, int toIndex) 返回從 fromIndex(不含)到 toIndex(不含)位置的子集合:[fromIndex,toIndex)
例子:
package li.collections.list;
import java.util.ArrayList;
import java.util.List;
public class ListMethod {
@SuppressWarnings({"all"})
public static void main(String[] args) {
List list = new ArrayList();
list.add("張三豐");
list.add("賈寶玉");
//boolean add(int index, E element)
//將指定的元素插入此列表中的指定位置(可選操作)
list.add(1,"楊過");//在index=1的位置插入一個對象
System.out.println(list);//[張三豐, 楊過, 賈寶玉]
//boolean addAll(int index, Collection<? extends E> c)
//將指定集合中的所有元素插入到此列表中的指定位置(可選操作)
List list2 = new ArrayList();
list2.add("jack");
list2.add("tom");
list.addAll(1,list2);//在索引1位置插入list2集合的元素
System.out.println(list);//[張三豐, jack, tom, 楊過, 賈寶玉]
//Obect get(int index)
// 返回此列表中指定位置的元素。
//int indexOf(Object o)
//返回此列表中指定元素的第一次出現的索引,如果此列表不包含元素,則返回-1
System.out.println(list.indexOf("tom"));//2
//int lastIndexOf(Object o)
//返回此列表中指定元素的最後一次出現的索引,如果此列表不包含元素,則返回-1
list.add("楊過");
System.out.println(list);//[張三豐, jack, tom, 楊過, 賈寶玉, 楊過]
System.out.println(list.lastIndexOf("楊過"));//5
//Object remove(int index)
//刪除該列表中指定位置的元素,並返回此元素(可選操作)
list.remove(3);
System.out.println(list);//[張三豐, jack, tom, 賈寶玉, 楊過]
//Object set(int index, E element)
//用指定的元素(可選操作)替換此列表中指定位置的元素
list.set(1,"馬麗");
System.out.println(list);//[張三豐, 馬麗, tom, 賈寶玉, 楊過]
//List subList(int fromIndex, int toIndex)
//返回從 fromIndex(不含)到 toIndex(不含)位置的子集合:[fromIndex,toIndex)
List returnList = list.subList(0,2);
System.out.println(returnList);//[張三豐, 馬麗]
}
}
5.2List的三種遍歷方式
List的三種遍歷方式:
- 使用iterator迭代器
- 使用增強for迴圈
- 使用for迴圈
例子:
package li.collections.list;
import java.util.*;
public class ListFor {
@SuppressWarnings({"all"})
public static void main(String[] args) {
//List介面的實現子類 Vector LinkedList同理
//List list = new ArrayList();
//List list = new Vector();
List list = new LinkedList();
list.add("jack");
list.add("tom");
list.add("魚香肉絲");
list.add("北京烤鴨");
//1.使用迭代器
Iterator iterator = list.iterator();
while (iterator.hasNext()) {
Object obj = iterator.next();
System.out.print(obj);
}
//2.增強for迴圈
for (Object obj:list) {
System.out.print(obj);
}
//使用普通for迴圈
for (int i = 0; i < list.size(); i++) {
System.out.print(list.get(i));
}
}
}
5.3List排序練習
使用List的實現類添加三本圖書,並遍歷,列印效果如下:
名稱:XX 價格:xx 作者:xx
名稱:XX 價格:xx 作者:xx
名稱:XX 價格:xx 作者:xx
要求:
-
按價格排序,從低到高(使用冒泡排序)
-
要求使用ArrayList、LinkedList、Vector三種集合實現
使用冒泡實現集合的排序
package li.collections.list;
import java.util.ArrayList;
import java.util.List;
@SuppressWarnings("all")
public class ListExercise {
public static void main(String[] args) {
//使用ArrayList,LinkedList、Vector同理
List list = new ArrayList();
list.add(new Book("紅樓夢", 65.5, "曹雪芹"));
list.add(new Book("西游記", 48.8, "吳承恩"));
list.add(new Book("三國演義", 55, "羅貫中"));
list.add(new Book("水滸傳", 36, "施耐庵"));
System.out.println("====未排序前遍歷====");
for (Object o : list) {
System.out.println(o);
}
sort(list);
System.out.println("====排序後遍歷====");
for (Object o : list) {
System.out.println(o);
}
}
//對集合進行排序
public static void sort(List list) {
int listSize = list.size();//獲取集合的長度
Book book1;
Book book2;
for (int i = 0; i < listSize - 1; i++) {//輪數
for (int j = 0; j < listSize - 1 - i; j++) {//每輪的索引
book1 = (Book) list.get(j);
book2 = (Book) list.get(j + 1);
if (book1.getPrice() > book2.getPrice()) {
list.set(j, book2);
list.set(j + 1, book1);
}
}
}
}
}
class Book {
private String name;
private double price;
private String author;
public Book() {
}
public Book(String name, double price, String author) {
this.name = name;
this.price = price;
this.author = author;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
@Override
public String toString() {//按格式重寫toString方法
return "名稱:" + name + "\t\t" + "價格:" + price + "\t\t" + "作者:" + author;
}
}