跳转至

集合框架

第 06 章说过:Java 数组是定长的。实际开发 99% 用的是集合。三个主角:ListSetMap

三大集合

Java 对标 JS 特点
List (ArrayList) Array 有序、可重复、按下标访问
Set (HashSet) Set 不重复
Map (HashMap) Map / 对象 键值对,键不重复

List

List<String> list = new ArrayList<>();   // 接口 + 实现类
list.add("Tom");          // 末尾添加
list.get(0);              // 按下标取
list.remove("Tom");       // 删除
list.size();              // 长度(方法,不是属性)
list.contains("Tom");     // 是否包含

为什么写 List 不是 ArrayList

List接口ArrayList实现。变量声明用接口类型(List),new 用实现(ArrayList)。这样以后想换实现(如 LinkedList)只改一行。这是"面向接口编程",Spring 里到处都是。

Set

Set<String> set = new HashSet<>();
set.add("a"); set.add("a");   // 第二个被忽略
set.size();                   // 1

用途:去重、判断"是否属于某集合"。

Map

Map<String, Integer> map = new HashMap<>();
map.put("Tom", 18);          // 存
map.get("Tom");              // 取,返回 18
map.containsKey("Tom");      // 是否有这个 key
map.put("Tom", 19);          // 同 key 覆盖

// 遍历(JS 是 for (const [k,v] of map))
for (Map.Entry<String, Integer> e : map.entrySet()) {
    e.getKey(); e.getValue();
}

★ 前端人注意

  • 集合的 size()方法(带括号),不是属性。list.size() 不是 list.length
  • Map 不能用 [] 取值,必须 map.get(key)。它不是 JS 对象。
  • 遍历 MapentrySet(),没有直接 for...of

完整可运行示例

package com.javaglm.language.ch13;

import java.util.*;

/**
 * 第 13 章 · 集合框架。
 * 最重要的三个:List(有序可重复)、Set(不重复)、Map(键值对)。
 * 对标 JS:List≈Array、Set≈Set、Map≈Map。注意 Java 用接口 + 实现类两层。
 */
public class CollectionDemo {

    public static void main(String[] args) {
        // === List:有序、可重复 —— 对标 JS Array ===
        List<String> list = new ArrayList<>();   // 接口 List,实现 ArrayList(动态数组)
        list.add("Tom");
        list.add("Jerry");
        list.add("Tom");                // 允许重复
        System.out.println(list);       // [Tom, Jerry, Tom]
        System.out.println("get(0) = " + list.get(0));
        list.remove("Tom");             // 删第一个匹配
        System.out.println("size = " + list.size());

        // === Set:不重复 —— 对标 JS Set ===
        Set<String> set = new HashSet<>();
        set.add("a");
        set.add("b");
        set.add("a");                   // 重复被忽略
        System.out.println("set = " + set + " size = " + set.size());

        // === Map:键值对 —— 对标 JS Map / 对象 ===
        Map<String, Integer> map = new HashMap<>();
        map.put("Tom", 18);
        map.put("Jerry", 20);
        map.put("Tom", 19);             // 同 key 覆盖
        System.out.println("Tom 年龄 = " + map.get("Tom"));   // 19
        System.out.println("包含 Jerry? " + map.containsKey("Jerry"));

        // 遍历 Map:用 entrySet(JS 里是 map.entries())
        for (Map.Entry<String, Integer> e : map.entrySet()) {
            System.out.println(e.getKey() + " => " + e.getValue());
        }
    }
}

:octicons-arrow-left-16: 上一章:枚举与包装类 | 下一章:泛型