Java基礎(5):Java集合
阿新 • • 發佈:2018-12-25
文章目錄
1 集合概述
- 集合又稱容器,是為了儲存數量不確定或具有對映關係的資料而提供的類。
- Java的集合類主要由
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]
注意:
- 集合中的元素都是引用資料型別,不能是基本資料型別(會自動轉為相應物件包裝類Integer等)。
- 如果未使用泛型
<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介面常用方法:
- 方式1:Lambda表示式遍歷
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);
}
注意:
- Iterator必須依附於Collection物件。(集合的迭代器)
- Iterator迭代、方式3的foreach迴圈遍歷時,不要修改(add、remove…)集合,很可能會引發異常。
- 方式3:foreach迴圈遍歷
for (Integer integer : cIntegers) {
System.out.println("迭代集合元素:"+integer);
}
- Predicate操作集合
- Collection介面的
removeIf(Predicate<? super E> filter)
方法使用了Predicate函式式介面,可使用Lambda表示式:
cIntegers.removeIf(obj-> obj.intValue()==1);
System.out.println(cIntegers); //輸出[2, 3, 4]
- 自定義帶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()方法的原則與方法: