《Java 基础必学:ArrayList、HashMap 和泛型详解》
一、引言
1.为什么这些是 Java 基础的重点?
ArrayList、HashMap 和泛型是Java集合框架的核心组成部分,广泛应用于实际开发中。
- ArrayList:基于动态数组实现,支持快速随机访问,适合频繁查询和遍历的场景。
- HashMap:基于哈希表实现,提供高效的键值对存储和检索,适合快速查找和数据映射。
- 泛型:提供类型安全,避免运行时类型转换错误,增强代码的可读性和复用性。
2.它们在实际开发中的应用场景
- 动态数据存储:当数据量不确定且需要频繁增删时,ArrayList比数组更灵活。
- 快速访问:通过索引直接访问元素,适合需要高频读取的场景(如缓存)。
- 集合操作:与
Collections工具类配合,实现排序、查找等操作(如排行榜列表)。
二、ArrayList 详解
1. 什么是 ArrayList?
ArrayList 是 Java 集合框架中的一个动态数组实现,属于 java.util 包。它基于数组实现,支持动态扩容和随机访问,适合频繁查询和遍历的场景,但插入和删除操作效率较低。
2.核心特性
- 动态扩容:初始容量默认为 10,当元素数量超过当前容量时,自动扩容至原来的 1.5 倍(JDK 1.8+)。
- 有序性:保持元素的插入顺序。
- 允许重复元素和 null 值。
- 非线程安全:多线程环境下需手动同步或使用
Collections.synchronizedList包装。
// 创建 ArrayList
ArrayList<String> list = new ArrayList<>();
// 添加元素
list.add("A"); // 末尾添加
list.add(1, "B"); // 指定索引插入
// 访问元素
String element = list.get(0); // 获取索引 0 的元素
// 删除元素
list.remove(0); // 按索引删除
list.remove("B"); // 按值删除(首次出现)
// 其他操作
int size = list.size(); // 元素数量
boolean isEmpty = list.isEmpty(); // 是否为空
list.clear(); // 清空列表
3.与数组对比
| 特性 | ArrayList | 数组(Array) |
| 长度 | 动态可变 | 固定 |
| 内存管理 | 自动扩容/缩容 | 手动管理 |
三、HashMap详解
1.什么是HashMap?
HashMap 是 Java 中基于哈希表的 Map 接口实现,用于存储键值对(key-value pairs)。它允许使用 null 键和 null 值,并且是非线程安全的。
2.常用方法
put(K key, V value):插入键值对。get(Object key):根据键获取值。remove(Object key):删除指定键的映射。containsKey(Object key):检查是否包含指定键。
例子
HashMap<String, Integer> map = new HashMap<>();
map.put("apple", 10);
map.put("banana", 20);
System.out.println(map.get("apple")); // 输出 10
3.注意事项
- 键对象必须正确实现
hashCode()和equals()方法。 - 初始容量和负载因子需根据实际场景调整以减少扩容开销。
- Java 8 后引入红黑树优化,显著提升了哈希冲突时的性能。
四、泛型详解
1.什么是泛型?
泛型(Generics)是编程语言中用于增强代码复用性和类型安全的一种机制。允许在定义类、接口或方法时使用类型参数,实际使用时再指定具体类型。泛型的主要目的是在编译时检测类型错误,减少运行时类型转换的风险。
2.泛型的优势
- 类型安全:编译时检查类型匹配,避免运行时类型转换错误。
- 代码复用:同一套逻辑可适用于多种数据类型,减少重复代码。
- 可读性:明确代码中使用的数据类型,提高代码可维护性。
3.泛型的基本语法
泛型类
public class Box<T> {
private T content;
public void setContent(T content) {
this.content = content;
}
public T getContent() {
return content;
}
}
T是类型参数,使用时可以替换为具体类型(如Integer、String)。
泛型方法
public <T> void printArray(T[] array) {
for (T element : array) {
System.out.println(element);
}
}
- 方法声明中的
<T>表示泛型类型,可在方法参数和返回值中使用。
泛型接口
public interface List<T> {
void add(T item);
T get(int index);
}
泛型的通配符
?(无界通配符):表示未知类型,例如List<?>。? extends T(上界通配符):表示类型为T或其子类。? super T(下界通配符):表示类型为T或其父类。
4.泛型的限制
- 类型擦除:Java泛型在编译后会擦除类型信息,运行时无法获取泛型的具体类型。
- 不能实例化泛型类型:例如
new T()是非法的。 - 不能用于静态上下文:静态方法或变量不能使用类的泛型类型参数。
5.泛型的应用场景
- 集合框架:如
ArrayList<T>、HashMap<K,V>。 - 工具类:通用算法或数据处理逻辑。
- 回调接口:如
Comparator<T>。
五、例题与答案
1.## 练习题 1:ArrayList 去重
题目 :去除 ArrayList 中的重复元素
ArrayList<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(2);
list.add(3);
list.add(3);
list.add(3);
// 去除重复后应该变成: [1, 2, 3]
答案:
package test5_21;
import java.util.ArrayList;
import java.util.HashSet;
public class test2 {
//去除arraylist中重复的元素
//ArrayList<Integer> list = new ArrayList<>();
//list.add(1);
//list.add(2);
//list.add(2);
//list.add(3);
//list.add(3);
//list.add(3);
//
//// 去除重复后应该变成: [1, 2, 3]
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(2);
list.add(3);
list.add(3);
list.add(3);
// 去重核心代码
//List 元素存入 HashSet,依托集合特性自动剔除重复值
//清空原列表原有数据
//把去重后的元素回填回 List
HashSet<Integer> set = new HashSet<>(list);
list.clear();
list.addAll(set);
System.out.println(list);
}
}
2.//## 练习题 2:HashMap 统计单词出现次数
//题目 :统计一句话中每个单词出现的次数
//String str = "hello java hello world java java";
// 预期结果:
// hello 出现了 2 次
// java 出现了 3 次
// world 出现了 1 次
package test5_23;
import java.util.HashMap;
import java.util.Map;
public class test1 {
public static void main(String[] args) {
String str = "hello java hello world java java";
HashMap<String, Integer> map = new HashMap<>();
// 按空格拆分单词
String[] words = str.split(" ");
for (String word : words) {
// 单词不存在默认0,存在则取值,次数+1
int count = map.getOrDefault(word, 0);
map.put(word, count + 1);
}
// 遍历输出结果
for (Map.Entry<String,Integer> entry : map.entrySet()) {
System.out.println(entry.getKey() + ":" + entry.getValue() + "次");
}
}
}
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)