当前位置:首页 > 技术 > 正文内容

Java集合框架详解与应用实践

访客 技术 2026年7月26日 1

Java集合框架

一、集合概述

集合是Java中用于存储和管理对象的重要数据结构,可以看作是动态数组的增强版,提供了丰富的操作方法。

集合与数组的区别

  • 长度特性:数组长度固定,集合长度可动态变化
  • 数据类型:数组可以存储基本类型和引用类型,集合只能存储引用类型

集合位于java.util.*包中,构成了Java集合框架的核心部分。

二、集合体系结构

Java集合框架以Collection接口为根,主要分为两大分支:ListSet

Collection接口
List接口 Set接口
ArrayList类 LinkedList类 Vector类 HashSet类 SortedSet接口
TreeSet类

接口特点对比

  • List接口:有序集合,允许重复元素,支持下标访问
  • Set接口:无序集合,不允许重复元素,不支持下标访问

三、Collection接口详解

Collection是集合框架的根接口,代表一组对象,具有以下特点:无序、无下标、元素不能重复。

常用方法

// 添加元素
boolean add(Object obj)
boolean addAll(Collection c)

// 删除元素
void clear()
boolean remove(Object o)

// 查询操作
boolean contains(Object o)
boolean isEmpty()
int size()

// 转换操作
Object[] toArray()

使用示例

// 创建集合实例
Collection<String> fruitCollection = new ArrayList<>();

// 添加元素
fruitCollection.add("苹果");
fruitCollection.add("香蕉");
fruitCollection.add("橙子");

System.out.println("集合大小: " + fruitCollection.size());
System.out.println("集合内容: " + fruitCollection);

// 遍历集合方式1:增强for循环
for (String fruit : fruitCollection) {
    System.out.println("水果: " + fruit);
}

// 遍历集合方式2:迭代器
System.out.println("使用迭代器遍历:");
Iterator<String> iterator = fruitCollection.iterator();
while (iterator.hasNext()) {
    String fruit = iterator.next();
    System.out.println("获取的水果: " + fruit);
}

// 判断操作
System.out.println("是否包含苹果: " + fruitCollection.contains("苹果"));
System.out.println("集合是否为空: " + fruitCollection.isEmpty());

四、List接口及其实现类

List接口特点

有序集合,允许重复元素,支持下标访问,提供额外的基于索引的操作方法。

// 基于索引的操作
void add(int index, Object o)
Object get(int index)
List subList(int fromIndex, int toIndex)

ArrayList实现类

特点:基于数组实现,查询效率高,增删效率低,非线程安全。

内部结构

  • 默认容量:10
  • 扩容机制:每次扩容为原容量的1.5倍
  • 核心数组:elementData
  • 元素计数:size
// 使用示例
ArrayList<Product> productList = new ArrayList<>();

// 创建商品对象
Product p1 = new Product("笔记本电脑", 5999);
Product p2 = new Product("智能手机", 3999);
Product p3 = new Product("平板电脑", 2999);

// 添加商品
productList.add(p1);
productList.add(p2);
productList.add(0, p3); // 在指定位置插入

System.out.println("商品列表: " + productList);

// 基于索引遍历
for (int i = 0; i < productList.size(); i++) {
    Product product = productList.get(i);
    System.out.println("商品" + i + ": " + product);
}

// 使用列表迭代器
ListIterator<Product> listIterator = productList.listIterator();
while (listIterator.hasNext()) {
    System.out.println("下一个索引: " + listIterator.nextIndex() + 
                      ", 商品: " + listIterator.next());
}

Vector实现类

特点:基于数组实现,线程安全,但性能较低,属于早期JDK版本。

// 使用示例
Vector<String> vector = new Vector<>();
vector.add("元素1");
vector.add("元素2");

// 使用枚举遍历
Enumeration<String> enumeration = vector.elements();
while (enumeration.hasMoreElements()) {
    System.out.println(enumeration.nextElement());
}

LinkedList实现类

特点:基于链表实现,增删效率高,查询效率低,适合频繁插入删除的场景。

五、泛型与工具类

泛型概述

泛型是Java SE 5.0引入的特性,本质是参数化类型,提高了代码的类型安全性和复用性。

泛型类

public class Box<T> {
    private T content;
    
    public void setContent(T content) {
        this.content = content;
    }
    
    public T getContent() {
        return content;
    }
}

泛型接口

public interface Service<T> {
    void process(T item);
}

// 实现方式1:指定具体类型
public class StringServiceImpl implements Service<String> {
    @Override
    public void process(String item) {
        System.out.println("处理字符串: " + item);
    }
}

// 实现方式2:保持泛型
public class GenericServiceImpl<T> implements Service<T> {
    @Override
    public void process(T item) {
        System.out.println("处理泛型对象: " + item);
    }
}

泛型方法

public class Util {
    // 泛型方法
    public <T> T identity(T obj) {
        return obj;
    }
    
    // 限制泛型类型
    public <T extends Comparable> T max(T a, T b) {
        return a.compareTo(b) > 0 ? a : b;
    }
}

六、Set接口及其实现类

Set接口特点

无序集合,不允许重复元素,不支持下标访问。

HashSet实现类

特点:基于哈希表实现,元素存储位置由哈希码决定,当哈希码相同时使用equals方法判断是否重复。

// 使用示例
HashSet<Student> studentSet = new HashSet<>();

// 创建学生对象
Student s1 = new Student("张三", 20);
Student s2 = new Student("李四", 21);
Student s3 = new Student("王五", 22);

// 添加学生
studentSet.add(s1);
studentSet.add(s2);
studentSet.add(s3);
studentSet.add(new Student("张三", 20)); // 不会添加,因为重写了equals和hashCode

System.out.println("学生数量: " + studentSet.size());

// 遍历学生集合
for (Student student : studentSet) {
    System.out.println(student);
}

// 重写equals和hashCode方法
@Override
public boolean equals(Object o) {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;
    Student student = (Student) o;
    return age == student.age && Objects.equals(name, student.name);
}

@Override
public int hashCode() {
    return Objects.hash(name, age);
}

TreeSet实现类

特点:基于树结构实现,自动排序,元素必须实现Comparable接口或提供自定义比较器。

// 使用示例
TreeSet<Book> bookSet = new TreeSet<>();

// 创建书籍对象
Book b1 = new Book("Java编程思想", 120);
Book b2 = new Book("Effective Java", 90);
Book b3 = new Book("设计模式", 80);

// 添加书籍
bookSet.add(b1);
bookSet.add(b2);
bookSet.add(b3);

System.out.println("书籍集合: " + bookSet);

// 自定义比较器
TreeSet<String> stringSet = new TreeSet<>((s1, s2) -> {
    int lengthCompare = Integer.compare(s1.length(), s2.length());
    return lengthCompare != 0 ? lengthCompare : s1.compareTo(s2);
});

stringSet.add("hello");
stringSet.add("hi");
stringSet.add("world");
stringSet.add("java");

System.out.println("按长度排序的字符串: " + stringSet);

七、Map接口及其实现类

Map接口特点

存储键值对(Key-Value)映射关系,键唯一且不允许重复,值可以重复。

Map接口
HashMap类 SortedMap接口
TreeMap类

常用方法

// 添加/更新元素
V put(K key, V value)

// 获取元素
V get(Object key)

// 删除元素
V remove(Object key)

// 查询操作
Set<K> keySet()
Collection<V> values()
Set<Map.Entry<K,V>> entrySet()

// 判断操作
boolean containsKey(Object key)
boolean containsValue(Object value)

HashMap实现类

特点:基于哈希表实现,键值存储无序,允许null键和null值,非线程安全。

内部结构

  • 初始容量:16
  • 加载因子:0.75
  • 扩容机制:容量翻倍
  • JDK 1.8优化:链表长度超过8且数组长度≥64时转换为红黑树
// 使用示例
HashMap<Integer, String> countryMap = new HashMap<>();

// 添加国家信息
countryMap.put(1, "中国");
countryMap.put(2, "美国");
countryMap.put(3, "日本");

System.out.println("国家数量: " + countryMap.size());

// 遍历方式1:遍历键
System.out.println("遍历键:");
for (Integer key : countryMap.keySet()) {
    System.out.println(key + " - " + countryMap.get(key));
}

// 遍历方式2:遍历键值对
System.out.println("遍历键值对:");
for (Map.Entry<Integer, String> entry : countryMap.entrySet()) {
    System.out.println(entry.getKey() + " - " + entry.getValue());
}

TreeMap实现类

特点:基于红黑树实现,按键排序,键必须实现Comparable接口或提供比较器。

// 使用示例
TreeMap<Integer, String> sortedMap = new TreeMap<>();

// 添加数据
sortedMap.put(3, "C");
sortedMap.put(1, "A");
sortedMap.put(2, "B");

System.out.println("排序后的映射: " + sortedMap);

// 使用自定义比较器
TreeMap<Employee, Integer> salaryMap = new TreeMap<>((e1, e2) -> {
    int salaryCompare = Integer.compare(e1.getSalary(), e2.getSalary());
    return salaryCompare != 0 ? salaryCompare : e1.getName().compareTo(e2.getName());
});

// 添加员工数据
salaryMap.put(new Employee("张三", 8000), 8000);
salaryMap.put(new Employee("李四", 10000), 10000);
salaryMap.put(new Employee("王五", 6000), 6000);

System.out.println("按薪资排序的员工: " + salaryMap);

Hashtable实现类

特点:古老的Map实现,线程安全,不允许null键和null值,性能较低。

Properties实现类

特点:Hashtable的子类,专门用于处理配置文件,键和值都是String类型。

八、Collections工具类

Collections是集合工具类,提供了大量静态方法用于操作集合。

常用方法

// 排序
static <T extends Comparable<? super T>> void sort(List<T> list)

// 反转
static void reverse(List<?> list)

// 随机排序
static void shuffle(List<?> list)

// 二分查找
static <T> int binarySearch(List<? extends Comparable<? super T>> list, T key)

// 复制
static void copy(List<? super T> dest, List<? extends T> src)

// 填充
static void fill(List<?> list, Object obj)

使用示例

// 创建列表
List<Integer> numbers = new ArrayList<>();
numbers.add(30);
numbers.add(10);
numbers.add(20);

// 排序
Collections.sort(numbers);
System.out.println("排序后: " + numbers); // [10, 20, 30]

// 反转
Collections.reverse(numbers);
System.out.println("反转后: " + numbers); // [30, 20, 10]

// 随机排序
Collections.shuffle(numbers);
System.out.println("随机排序后: " + numbers);

// 二分查找
int index = Collections.binarySearch(numbers, 20);
System.out.println("20的索引: " + index);

// 列表复制
List<Integer> destList = new ArrayList<>();
for (int i = 0; i < numbers.size(); i++) {
    destList.add(0);
}
Collections.copy(destList, numbers);
System.out.println("复制后的列表: " + destList);

// 数组与集合转换
String[] array = {"A", "B", "C"};
List<String> list = Arrays.asList(array); // 注意:此列表大小固定

// 基本类型数组转集合
int[] intArray = {1, 2, 3};
List<Integer> intList = Arrays.stream(intArray).boxed().collect(Collectors.toList());

九、集合框架总结

Java集合框架是Java语言的重要组成部分,提供了丰富的数据结构实现,适用于不同场景:

  • List集合:有序、可重复、支持下标访问,实现类包括ArrayList、LinkedList和Vector
  • Set集合:无序、不可重复、不支持下标访问,实现类包括HashSet和TreeSet
  • Map集合:存储键值对映射,键唯一、值可重复,实现类包括HashMap、TreeMap和Hashtable
  • 工具类:Collections提供集合操作工具方法,Arrays提供数组操作工具方法

正确选择集合实现类,能够有效提高程序的性能和可维护性。

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

linux screen 用法详情 (nohup 的替代方案)

一、screen 是什么?能干嘛?screen 是一个终端复用器,可以:在一个 SSH 会话中开多个“虚拟终端”SSH 断线后,程序仍然在后台运行随时重新连接到原来的会话特别适合:nohup 的替代方案跑脚本 / 爬虫 / 训练模型运维、远程开发二、安装 screen# CentOS / Rocky / Almayum install -y screen# Debian / Ubuntuapt i...

PHPStan 有什么用?怎么用?

PHPStan 是一个 PHP 的静态分析工具,在不运行代码的情况下就能帮你发现潜在问题,比如:传错类型(把 string 传给接受 int 的函数)访问不存在的属性 / 方法null 没处理好永远不会执行到的代码数组 key/值类型不一致返回值不符合声明注释和真实类型不匹配它非常适合:想提升代码质量、减少线上 bug、统一团队风格的人(尤其是中大型项目)。一、PHPStan 有什么用(通俗点说)...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。