Java集合案例怎么基础使用

wen java案例 26

Java集合基础使用全攻略:从入门到实战案例解析

目录导读

  1. 集合框架概述与核心接口
  2. List接口基础使用案例
  3. Set接口与去重场景实战
  4. Map接口键值对存储案例
  5. 集合遍历的四种方式对比
  6. 集合排序与自定义比较器
  7. 常见问答(FAQ)

集合框架概述与核心接口

Java集合框架(Collection Framework)是日常开发中最常用的数据结构库,它提供了List、Set、Map三大核心接口,以及ArrayList、LinkedList、HashSet、TreeSet、HashMap、TreeMap等实现类。

Java集合案例怎么基础使用

为什么需要集合? 数组长度固定、操作繁琐,而集合支持动态扩容、类型安全、丰富操作API。

核心接口关系:

  • Collection(单列集合):List(有序可重复)、Set(无序不可重复)
  • Map(双列集合):存储键值对,键唯一
// 基础引入
import java.util.*;

小问答:集合和数组的最大区别是什么?
答:数组长度固定,集合长度可变;数组可以存储基本类型和对象,集合只能存储对象(自动装箱机制可弥补)。


List接口基础使用案例

List是最常用的有序集合,允许重复元素,ArrayList基于数组实现,查询快;LinkedList基于链表,增删快。

案例1:学生成绩管理

import java.util.ArrayList;
import java.util.List;
public class ListDemo {
    public static void main(String[] args) {
        // 创建ArrayList集合,泛型指定元素类型为String
        List<String> scores = new ArrayList<>();
        // 增
        scores.add("张三:95分");
        scores.add("李四:88分");
        scores.add("王五:76分");
        scores.add(1, "赵六:92分");  // 指定位置插入
        // 删
        scores.remove("王五:76分");  // 按对象删除
        // scores.remove(2);         // 按索引删除
        // 改
        scores.set(1, "张三:满分100分");
        // 查
        String first = scores.get(0);  // 按索引获取
        // 遍历输出
        for (String s : scores) {
            System.out.println(s);
        }
    }
}

更新提示:Arrays.asList()返回的List长度固定,不能执行add/remove操作,需要转成ArrayList。


Set接口与去重场景实战

Set集合不允许重复元素,适合数据去重,HashSet无序但效率高,TreeSet自动排序。

案例2:用户ID去重

import java.util.HashSet;
import java.util.Set;
public class SetDemo {
    public static void main(String[] args) {
        Set<String> userIdSet = new HashSet<>();
        // 添加重复数据时,第二个会被忽略
        userIdSet.add("UID001");
        userIdSet.add("UID002");
        userIdSet.add("UID001");  // 不会重复存储
        userIdSet.add("UID003");
        System.out.println("用户总数(去重后):" + userIdSet.size());
        // 判断元素是否存在
        if (userIdSet.contains("UID002")) {
            System.out.println("UID002用户存在");
        }
        // 全部清除
        // userIdSet.clear();
    }
}

深度思考:HashSet如何判断元素重复?
答:通过hashCode()equals()方法,先计算hashCode,若相同再调equals,因此自定义对象去重需要重写这两个方法。


Map接口键值对存储案例

Map存储键值对,每个键唯一,HashMap性能最好,TreeMap支持排序。

案例3:商品库存管理

import java.util.HashMap;
import java.util.Map;
public class MapDemo {
    public static void main(String[] args) {
        // Map<商品编号, 库存量>
        Map<Integer, Integer> stock = new HashMap<>();
        // 添加商品
        stock.put(1001, 50);   // 新添加
        stock.put(1002, 30);
        stock.put(1001, 20);   // 键重复,覆盖旧值
        // 获取库存
        int quantity = stock.getOrDefault(1001, 0);  // 安全取值,避免null
        // 遍历方式
        for (Map.Entry<Integer, Integer> entry : stock.entrySet()) {
            System.out.println("商品" + entry.getKey() + "库存:" + entry.getValue());
        }
        // 判断键或值是否存在
        boolean hasKey = stock.containsKey(1003);
        boolean hasValue = stock.containsValue(30);
    }
}

注意:HashMap允许key和value为null,Hashtable不允许。


集合遍历的四种方式对比

不同遍历方式适用不同场景:

遍历方式 适用集合 特点
普通for循环 List 可修改元素,需索引
增强for循环 Collection 代码简洁,不能修改集合结构
Iterator迭代器 Collection 可在遍历时安全删除元素
forEach + Lambda 所有集合 Java 8+ 函数式风格

案例4:通用的高效遍历

// 方式1:Iterator删除元素
Iterator<String> it = list.iterator();
while (it.hasNext()) {
    String item = it.next();
    if (item.startsWith("李")) {
        it.remove();  // 安全删除
    }
}
// 方式2:Lambda遍历
list.forEach(item -> System.out.print(item + " "));
// 方式3:Stream流操作(推荐)
list.stream()
    .filter(s -> s.contains("优秀"))
    .forEach(System.out::println);

集合排序与自定义比较器

Collections工具类提供排序功能,自定义对象需实现Comparable或传入Comparator。

案例5:按学生成绩排序

class Student implements Comparable<Student> {
    String name;
    int score;
    // 构造函数、getter/setter省略
    @Override
    public int compareTo(Student o) {
        // 升序:this.score - o.score;降序反之
        return Integer.compare(this.score, o.score);
    }
}
// 使用
List<Student> students = new ArrayList<>();
students.add(new Student("小明", 85));
// ... 添加更多学生
// 法1:自然排序(需实现Comparable)
Collections.sort(students);
// 法2:使用匿名Comparator(临时排序规则)
Collections.sort(students, (s1, s2) -> 
    s2.score - s1.score);  // 按成绩降序

常见问答(FAQ)

Q1:ArrayList和Vector有什么区别?
A:Vector是线程安全的(方法加synchronized),但性能较差;ArrayList线程不安全,但性能更好,单线程环境推荐ArrayList。

Q2:如何让集合变为线程安全?
A:使用Collections.synchronizedXXX()包装,或使用CopyOnWriteArrayList、ConcurrentHashMap等并发集合类。

Q3:HashMap初始容量和加载因子是什么?
A:默认初始容量16,加载因子0.75,当元素数量超过容量*0.75时,扩容为原容量2倍。

Q4:TreeSet如何保证排序?
A:使用红黑树数据结构,元素必须实现Comparable,或在构造时传入Comparator。

Q5:List和Set如何互转?
A:List转为Set实现去重:new HashSet<>(list);Set转为List:new ArrayList<>(set)

Q6:如何选择集合类型?
A:需要有序可重复选ArrayList/ LinkedList;需要去重选HashSet/ TreeSet;需要键值对选HashMap/ TreeMap,优先考虑ArrayList和HashMap。


通过以上案例和实践,你已经掌握了Java集合的基础使用方法。“集合操作 = 增删改查 + 遍历排序”,在项目中灵活组合使用即可,建议在IDEA中动手运行每个案例,加深理解,实际开发中还可结合Stream API、Optional等现代Java特性,大幅提升集合处理效率。

抱歉,评论功能暂时关闭!