Java集合——1.Java集合简介
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. 接口与实现分离
集合框架采用"接口-实现"的分离设计:
- 接口(如
List、Set、Map)定义了集合的行为规范 - 实现类(如
ArrayList、HashSet、HashMap)提供具体实现
// 面向接口编程,可轻松替换为其他实现
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);
}
}
对于List和Set,还可以使用增强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集合简介的更多相关文章
- java常用集合框架底层实现简介与注意点
Collection: ArrayList:1:底层实现是数组,默认长度是10.2:add(),判断是否数组越界,是数组扩容为原来的两倍.3:remove(),copy数组,size-1,释放空虚的空 ...
- java集合系列——List集合之LinkedList介绍(三)
1. LinkedList的简介 JDK 1.7 LinkedList是基于链表实现的,从源码可以看出是一个双向链表.除了当做链表使用外,它也可以被当作堆栈.队列或双端队列进行操作.不是线程安全的,继 ...
- java集合系列——List集合之ArrayList介绍(二)
一:List概述 List是 java.util包下面的类,从<a href="http://blog.csdn.net/u010648555/article/details/5604 ...
- 【由浅入深理解java集合】(三)——集合 List
第一篇文章中介绍了List集合的一些通用知识.本篇文章将集中介绍List集合相比Collection接口增加的一些重要功能以及List集合的两个重要子类ArrayList及LinkedList. 一. ...
- 【由浅入深理解java集合】(二)——集合 Set
上一篇文章介绍了Set集合的通用知识.Set集合中包含了三个比较重要的实现类:HashSet.TreeSet和EnumSet.本篇文章将重点介绍这三个类. 一.HashSet类 HashSet简介 H ...
- 【由浅入深理解java集合】(一)——集合框架 Collction、Map
本篇文章主要对java集合的框架进行介绍,使大家对java集合的整体框架有个了解.具体介绍了Collection接口,Map接口以及Collection接口的三个子接口Set,List,Queue. ...
- Java基础教程(24)--集合
一.Java集合框架 集合,有时也称为容器,是一个用来存储和管理多个元素的对象.Java中的集合框架定义了一套规范,用来表示和操作集合,使具体操作与实现细节解耦.集合框架都包含下列内容: 接口:这 ...
- Java基础系列7——集合系列(1)框架概述
该系列博文会告诉你如何从入门到进阶,一步步地学习Java基础知识,并上手进行实战,接着了解每个Java知识点背后的实现原理,更完整地了解整个Java技术体系,形成自己的知识框架. 集合框架概述 Jav ...
- Java(30)集合五Set
作者:季沐测试笔记 原文地址:https://www.cnblogs.com/testero/p/15228440.html 博客主页:https://www.cnblogs.com/testero ...
- 一起学 Java(三) 集合框架、数据结构、泛型
一.Java 集合框架 集合框架是一个用来代表和操纵集合的统一架构.所有的集合框架都包含如下内容: 接口:是代表集合的抽象数据类型.接口允许集合独立操纵其代表的细节.在面向对象的语言,接口通常形成一个 ...
随机推荐
- Mac 终端下svn常用命令的使用
svn基本的操作流程 刚刚进入一个新的公司,让我接手一个正在进行的项目,我打开终端写下了:svn co svn://192.168.1.1/pro/domain 然后就可以在当前目录里面找到一个叫do ...
- IntelliJ IDEA 设置代码自动补全不区分大小写
在使用IntelliJ IDEA进行开发时,输入一个关键字时会有提示相关的类和方法名,但是默认是区分大小写的,如何让IDEA不区分大小写呢? IntelliJ IDEA版本:IntelliJ IDEA ...
- Go中的map和指针
本文参考:https://www.liwenzhou.com/posts/Go/08_map/ MAP(映射) Go语言中提供的映射关系容器为map,其内部使用散列表(hash)实现.(类似于Pyth ...
- AI智能体的技术架构与解决方案
相比于传统软件,AI智能体是一个新兴事物,技术架构和解决方案仍处在高速迭代中.所以,本文章将重点放在理清AI智能体相关的技术脉络,而非具体技术实现.更多相关知识还需要读者通过第三方搜索等方式,保持与时 ...
- 一文读懂:开源大数据调度系统Taier1.2版本新增的「工作流」到底是什么?
一.什么是工作流? 在阐述什么是工作流之前,先说一下工作流和普通任务的区别,在于依赖视图. 普通任务本身他只会有自己的dag图,依赖视图是无边界的,不可控的,而工作流则是把整个工作流都展示出来,是有边 ...
- 十二、buildroot系统 adb登录权限设置
4.6.4.adb权限设置 android-adbd 是 ADB(Android Debug Bridge)的守护进程,允许开发者远程访问和调试设备.它通常用于 Android 设备,但在嵌入式 ...
- Python全栈应用开发利器Dash 3.x新版本介绍(1)
更多Dash应用开发干货知识.案例,欢迎关注"玩转Dash"微信公众号 大家好我是费老师,Dash作为Python生态中强大且灵活的全栈应用开发框架,早在几个月前就发布了其3.0新 ...
- 视频转换 rtsp 流 转rtmp流播放(待完善)
前言:之前的博客找的rtsp流地址,和按照red5 都是为写这篇文章铺垫. 这篇文章,选择 ffmepg命令 把rtsp流转为rtmp, 接着vlc插件测试下生成的rtmp流. 最后 已经配置好了re ...
- CF2063D Game With Triangles 题解
CF2063D Game With Triangles 小清新三分,有几个细节赛时没有调完,遗憾离场,破防了. 注意到如果我们可以求 \(f(k)\),那么 \(k_{\text{max}}\) 只需 ...
- 前端开发系列049-基础篇之VueRouter
VueRouter 路由 MPA(多)页面应用 (Multiple Page Application) SPA(单)页面应用 (Single Page Application) 项目打包后最终只有in ...