Java集合

为什么需要集合框架?

数组作为最基本的集合形式,存在以下局限性:

  • 固定大小:初始化后长度不可改变,无法动态调整
  • 操作繁琐:添加、删除元素需要手动移动其他元素
  • 功能单一:缺乏排序、查找等常用操作的内置支持

集合框架解决了这些问题,提供了:

  • 动态大小:自动调整容量以适应元素数量变化
  • 丰富操作:内置添加、删除、查找、排序等方法
  • 多种实现:针对不同场景提供多种数据结构选择
  • 类型安全:通过泛型支持编译时类型检查

Java集合框架的体系结构

Java集合框架主要包含三大类核心接口,它们分别对应不同的数据结构:

1. List:有序可重复的列表

List接口代表有序、可重复的集合,元素可以通过索引访问,类似于动态数组。常用实现类包括:

  • ArrayList:基于动态数组实现,随机访问效率高
  • LinkedList:基于双向链表实现,插入和删除效率高
import java.util.ArrayList;
import java.util.List; public class ListExample {
public static void main(String[] args) {
// 创建只能存储String类型的List
List<String> fruits = new ArrayList<>(); // 添加元素
fruits.add("苹果");
fruits.add("香蕉");
fruits.add("橙子");
fruits.add("苹果"); // 允许重复元素 // 按索引访问
System.out.println("第一个元素:" + fruits.get(0)); // 遍历元素
for (String fruit : fruits) {
System.out.println(fruit);
} // 修改元素
fruits.set(1, "葡萄"); // 删除元素
fruits.remove(2); System.out.println("修改后的数据:" + fruits);
}
}

2. Set:无序不可重复的集合

Set接口代表无序、不可重复的集合,适合存储需要去重的数据。常用实现类包括:

  • HashSet:基于哈希表实现,查找效率高
  • TreeSet:基于红黑树实现,元素自动排序
  • LinkedHashSet:继承自HashSet,保留插入顺序
import java.util.HashSet;
import java.util.Set; public class SetExample {
public static void main(String[] args) {
// 创建只能存储Integer类型的Set
Set<Integer> numbers = new HashSet<>(); // 添加元素
numbers.add(10);
numbers.add(20);
numbers.add(30);
numbers.add(20); // 重复元素,不会被添加 // 遍历元素(无序)
for (int num : numbers) {
System.out.println(num);
} // 检查元素是否存在
System.out.println("是否包含20:" + numbers.contains(20)); // 删除元素
numbers.remove(30); System.out.println("修改后的数据:" + numbers);
}
}

3. Map:键值对映射表

Map接口代表键值对(key-value)的集合,允许通过键快速查找值。常用实现类包括:

  • HashMap:基于哈希表实现,查找效率高
  • TreeMap:基于红黑树实现,键自动排序
  • LinkedHashMap:保留键的插入顺序
import java.util.HashMap;
import java.util.Map; public class MapExample {
public static void main(String[] args) {
// 创建键为String类型,值为Integer类型的Map
Map<String, Integer> scores = new HashMap<>(); // 添加键值对
scores.put("张三", 90);
scores.put("李四", 85);
scores.put("王五", 95);
scores.put("张三", 88); // 相同键会覆盖原有值 // 通过键获取值
System.out.println("李四的分数:" + scores.get("李四")); // 遍历键值对
for (Map.Entry<String, Integer> entry : scores.entrySet()) {
System.out.println(entry.getKey() + ":" + entry.getValue());
} // 检查键是否存在
System.out.println("是否包含王五:" + scores.containsKey("王五")); // 删除键值对
scores.remove("王五"); System.out.println("修改后的数据:" + scores);
}
}

Map的特点:

  • 元素以键值对形式存在
  • 键(key)不允许重复,值(value)可以重复
  • 支持通过键快速查找值(O(1)时间复杂度 for HashMap)

集合框架的设计特点

Java集合框架的设计体现了面向对象的优秀思想,主要有以下特点:

1. 接口与实现分离

集合框架采用"接口-实现"的分离设计:

  • 接口(如ListSetMap)定义了集合的行为规范
  • 实现类(如ArrayListHashSetHashMap)提供具体实现
// 面向接口编程,可轻松替换为其他实现
List<String> list = new ArrayList<>();
// List<String> list = new LinkedList<>(); // 只需修改实现类

2. 泛型支持

集合框架全面支持泛型,允许指定集合中元素的类型:

  • 编译时检查元素类型,避免类型转换错误
  • 无需手动类型转换,代码更简洁安全
// 声明只能存储String类型的集合
List<String> strList = new ArrayList<>();
strList.add("hello"); // 正确
// strList.add(123); // 编译错误,不允许添加整数

3. 统一的遍历方式

所有集合都可以通过迭代器(Iterator)进行遍历,提供了统一的访问方式:

import java.util.Iterator;
import java.util.List;
import java.util.ArrayList; public class IteratorExample {
public static void main(String[] args) {
List<String> languages = new ArrayList<>();
languages.add("Java");
languages.add("Python");
languages.add("C++"); // 使用迭代器遍历
Iterator<String> iterator = languages.iterator();
while (iterator.hasNext()) {
String lang = iterator.next();
System.out.println(lang);
// 可以安全删除元素
if (lang.equals("C++")) {
iterator.remove();
}
} System.out.println("删除后:" + languages);
}
}

对于ListSet,还可以使用增强for循环(foreach)简化遍历:

for (String lang : languages) {
System.out.println(lang);
}

应避免使用的遗留集合类

Java集合框架经过多年发展,一些早期的集合类已被更优的实现取代,应避免在新代码中使用:

遗留类/接口 替代方案 说明
Hashtable HashMap 线程安全的Map,性能较差
Vector ArrayList 线程安全的List,性能较差
Stack Deque 基于Vector实现的栈,推荐使用ArrayDeque
Enumeration Iterator 迭代器接口,功能被Iterator替代

这些遗留类主要存在性能问题或设计缺陷,现代Java程序应优先使用新的集合实现。

集合框架的应用场景

选择合适的集合类型对程序性能至关重要,以下是常见场景的选择建议:

  • 需要按索引访问元素:选择List,随机访问频繁用ArrayList,插入删除频繁用LinkedList
  • 需要存储不重复的元素:选择Set,无序用HashSet,排序用TreeSet,需保留顺序用LinkedHashSet
  • 需要通过键查找值:选择Map,一般情况用HashMap,需要排序用TreeMap
  • 需要栈或队列操作:使用Deque(双端队列),推荐ArrayDeque

总结

Java集合框架是处理对象集合的强大工具,它提供了丰富的数据结构和操作方法,主要特点包括:

  • 三大核心接口:List(有序可重复)、Set(无序不可重复)、Map(键值对映射)
  • 接口与实现分离,便于灵活替换具体实现
  • 全面支持泛型,确保类型安全
  • 提供统一的遍历方式(迭代器)

Java集合——1.Java集合简介的更多相关文章

  1. java常用集合框架底层实现简介与注意点

    Collection: ArrayList:1:底层实现是数组,默认长度是10.2:add(),判断是否数组越界,是数组扩容为原来的两倍.3:remove(),copy数组,size-1,释放空虚的空 ...

  2. java集合系列——List集合之LinkedList介绍(三)

    1. LinkedList的简介 JDK 1.7 LinkedList是基于链表实现的,从源码可以看出是一个双向链表.除了当做链表使用外,它也可以被当作堆栈.队列或双端队列进行操作.不是线程安全的,继 ...

  3. java集合系列——List集合之ArrayList介绍(二)

    一:List概述 List是 java.util包下面的类,从<a href="http://blog.csdn.net/u010648555/article/details/5604 ...

  4. 【由浅入深理解java集合】(三)——集合 List

    第一篇文章中介绍了List集合的一些通用知识.本篇文章将集中介绍List集合相比Collection接口增加的一些重要功能以及List集合的两个重要子类ArrayList及LinkedList. 一. ...

  5. 【由浅入深理解java集合】(二)——集合 Set

    上一篇文章介绍了Set集合的通用知识.Set集合中包含了三个比较重要的实现类:HashSet.TreeSet和EnumSet.本篇文章将重点介绍这三个类. 一.HashSet类 HashSet简介 H ...

  6. 【由浅入深理解java集合】(一)——集合框架 Collction、Map

    本篇文章主要对java集合的框架进行介绍,使大家对java集合的整体框架有个了解.具体介绍了Collection接口,Map接口以及Collection接口的三个子接口Set,List,Queue. ...

  7. Java基础教程(24)--集合

    一.Java集合框架   集合,有时也称为容器,是一个用来存储和管理多个元素的对象.Java中的集合框架定义了一套规范,用来表示和操作集合,使具体操作与实现细节解耦.集合框架都包含下列内容: 接口:这 ...

  8. Java基础系列7——集合系列(1)框架概述

    该系列博文会告诉你如何从入门到进阶,一步步地学习Java基础知识,并上手进行实战,接着了解每个Java知识点背后的实现原理,更完整地了解整个Java技术体系,形成自己的知识框架. 集合框架概述 Jav ...

  9. Java(30)集合五Set

    作者:季沐测试笔记 原文地址:https://www.cnblogs.com/testero/p/15228440.html 博客主页:https://www.cnblogs.com/testero ...

  10. 一起学 Java(三) 集合框架、数据结构、泛型

    一.Java 集合框架 集合框架是一个用来代表和操纵集合的统一架构.所有的集合框架都包含如下内容: 接口:是代表集合的抽象数据类型.接口允许集合独立操纵其代表的细节.在面向对象的语言,接口通常形成一个 ...

随机推荐

  1. Mac 终端下svn常用命令的使用

    svn基本的操作流程 刚刚进入一个新的公司,让我接手一个正在进行的项目,我打开终端写下了:svn co svn://192.168.1.1/pro/domain 然后就可以在当前目录里面找到一个叫do ...

  2. IntelliJ IDEA 设置代码自动补全不区分大小写

    在使用IntelliJ IDEA进行开发时,输入一个关键字时会有提示相关的类和方法名,但是默认是区分大小写的,如何让IDEA不区分大小写呢? IntelliJ IDEA版本:IntelliJ IDEA ...

  3. Go中的map和指针

    本文参考:https://www.liwenzhou.com/posts/Go/08_map/ MAP(映射) Go语言中提供的映射关系容器为map,其内部使用散列表(hash)实现.(类似于Pyth ...

  4. AI智能体的技术架构与解决方案

    相比于传统软件,AI智能体是一个新兴事物,技术架构和解决方案仍处在高速迭代中.所以,本文章将重点放在理清AI智能体相关的技术脉络,而非具体技术实现.更多相关知识还需要读者通过第三方搜索等方式,保持与时 ...

  5. 一文读懂:开源大数据调度系统Taier1.2版本新增的「工作流」到底是什么?

    一.什么是工作流? 在阐述什么是工作流之前,先说一下工作流和普通任务的区别,在于依赖视图. 普通任务本身他只会有自己的dag图,依赖视图是无边界的,不可控的,而工作流则是把整个工作流都展示出来,是有边 ...

  6. 十二、buildroot系统 adb登录权限设置

    4.6.4.adb权限设置 ​ android-adbd 是 ADB(Android Debug Bridge)的守护进程,允许开发者远程访问和调试设备.它通常用于 Android 设备,但在嵌入式 ...

  7. Python全栈应用开发利器Dash 3.x新版本介绍(1)

    更多Dash应用开发干货知识.案例,欢迎关注"玩转Dash"微信公众号 大家好我是费老师,Dash作为Python生态中强大且灵活的全栈应用开发框架,早在几个月前就发布了其3.0新 ...

  8. 视频转换 rtsp 流 转rtmp流播放(待完善)

    前言:之前的博客找的rtsp流地址,和按照red5 都是为写这篇文章铺垫. 这篇文章,选择 ffmepg命令 把rtsp流转为rtmp, 接着vlc插件测试下生成的rtmp流. 最后 已经配置好了re ...

  9. CF2063D Game With Triangles 题解

    CF2063D Game With Triangles 小清新三分,有几个细节赛时没有调完,遗憾离场,破防了. 注意到如果我们可以求 \(f(k)\),那么 \(k_{\text{max}}\) 只需 ...

  10. 前端开发系列049-基础篇之VueRouter

    VueRouter 路由 MPA(多)页面应用 (Multiple Page Application) SPA(单)页面应用 (Single Page Application) 项目打包后最终只有in ...