1. 程式人生 > >Java基礎(5):Java集合

Java基礎(5):Java集合

文章目錄

1 集合概述

  • 集合又稱容器,是為了儲存數量不確定或具有對映關係的資料而提供的類。
  • Java的集合類主要由CollectionMap兩個介面派生而出。
Collection集合體系
Map集合體系

2 Collection介面

  • Collection介面是List、Set和Queue介面的父介面。
  • Collection介面常用方法
Modifier and Type Method Description
int size() 返回集合元素個數
boolean isEmpty() 返回集合是否為空
boolean add(Object o) 向集合新增一個元素
boolean remove(Object o) 刪除指定元素o
void clear() 清空集合
boolean contains(Object o) 返回集合是否含指定元素
Iterator iterator() 返回Iterator物件,即迭代器
Collection<Integer> cIntegers = new HashSet<>();
cIntegers.add(1);
cIntegers.add(2);
cIntegers.add(3);
cIntegers.add(4);
System.
out.println(cIntegers); //輸出 [1, 2, 3, 4]

注意

  1. 集合中的元素都是引用資料型別,不能是基本資料型別(會自動轉為相應物件包裝類Integer等)。
  2. 如果未使用泛型<Integer>之類,系統預設集合元素為Object型別。
  • 遍歷集合元素
    • 方式1:Lambda表示式遍歷
      Iterable介面是Collection介面的父介面,它的方法forEach(Consumer<? super T> action)遍歷集合時,元素會傳給Consumer介面的accept(T t)方法(該介面唯一抽象方法)。
    cIntegers.forEach(obj -> System.out.println("迭代集合元素:"+obj));//建立匿名物件,重寫accept方法
    
    • 方式2:Iterator遍歷
      Iterator介面常用方法:
Modifier and Type Method Description
boolean hasNext() 返回集合是否還有元素
E next() 返回集合下一個元素
void remove() 刪除集合上次next()方法返回的元素
default void forEachRemaining(Consumer<? super E> action) 可用Lambda表示式遍歷
Iterator<Integer> it = cIntegers.iterator();  //生成迭代器
while (it.hasNext()) {
	Integer integer = it.next();
	System.out.println("迭代集合元素:"+integer);	
}

注意

  1. Iterator必須依附於Collection物件。(集合的迭代器)
  2. Iterator迭代、方式3的foreach迴圈遍歷時,不要修改(add、remove…)集合,很可能會引發異常。
  • 方式3:foreach迴圈遍歷
for (Integer integer : cIntegers) {
	System.out.println("迭代集合元素:"+integer);
}
  • Predicate操作集合
  1. Collection介面的removeIf(Predicate<? super E> filter)方法使用了Predicate函式式介面,可使用Lambda表示式:
cIntegers.removeIf(obj-> obj.intValue()==1);
System.out.println(cIntegers); //輸出[2, 3, 4]
  1. 自定義帶Predicate介面引數的方法:
public class PredicateTest2
{
	public static void main(String[] args)
	{
		// 建立books集合
		Collection books = new HashSet();
		books.add(new String("輕量級Java EE企業應用實戰"));
		books.add(new String("瘋狂Java講義"));
		books.add(new String("瘋狂iOS講義"));
		books.add(new String("瘋狂Ajax講義"));
		books.add(new String("瘋狂Android講義"));
		// 統計書名包含“瘋狂”子串的圖書數量
		System.out.println(calAll(books , ele->((String)ele).contains("瘋狂")));
		// 統計書名包含“Java”子串的圖書數量
		System.out.println(calAll(books , ele->((String)ele).contains("Java")));
		// 統計書名字串長度大於10的圖書數量
		System.out.println(calAll(books , ele->((String)ele).length() > 10));
	}
	public static int calAll(Collection books , Predicate p)
	{
		int total = 0;
		for (Object obj : books)
		{
			// 使用Predicate的test()方法判斷該物件是否滿足Predicate指定的條件
			if (p.test(obj))
			{
				total ++;
			}
		}
		return total;
	}
}

注意:Consumer介面和Predicate介面都是函式式介面,詳情參見Java常見API第10節。

3 Set介面

  • 繼承Collection介面。
  • Set不允許包含相同的元素。
  • 新增常用方法
Modifier and Type Method Description
int hashCode() 返回物件的所有元素hashCode值的和

注意:元素的hashCode值決定元素的儲存位置。

3.1 HashSet類

  • Set介面的典型實現,Set集合中使用最多的類。
    注意:如果要把某個類(一般指使用者自己建立的類)的物件儲存到HashSet集合中,需要重寫該類的equals()方法和hashCode()方法。
  • 重寫hashCode()方法的原則與方法: