【JAVA】零基础小白一篇看懂Java集合框架
Java 集合框架可以理解为:
Java 提供的一套“容器工具”,专门用来存放、管理和操作一组数据。
比如你要保存很多学生姓名:
String name1 = "张三";
String name2 = "李四";
String name3 = "王五";
这样写很麻烦。更好的方式是用集合:
ArrayList<String> names = new ArrayList<>();
names.add("张三");
names.add("李四");
names.add("王五");
这就是集合的作用。
1. Java 集合框架整体结构
初学阶段先重点掌握这三类:
List:有序,可重复
Set :无序,不重复
Map :键值对
可以这样理解:
| 类型 | 特点 | 例子 |
|---|---|---|
List |
按顺序存,可以重复 | 学生名单 |
Set |
不允许重复 | 身份证号集合 |
Map |
一个 key 对应一个 value | 学号对应学生姓名 |
2. List:有序、可重复
List 最常用的实现类是 ArrayList。
例子:保存学生姓名
import java.util.ArrayList;
public class Main {
public static void main(String[] args) {
ArrayList<String> students = new ArrayList<>();
students.add("张三");
students.add("李四");
students.add("王五");
students.add("张三");
System.out.println(students);
}
}
输出:
[张三, 李四, 王五, 张三]
可以看到,List 允许重复。
访问元素
System.out.println(students.get(0));
System.out.println(students.get(1));
输出:
张三
李四
注意:下标从 0 开始。
修改元素
students.set(1, "赵六");
System.out.println(students);
输出:
[张三, 赵六, 王五, 张三]
删除元素
students.remove("张三");
System.out.println(students);
这会删除第一个 "张三"。
如果原来是:
[张三, 赵六, 王五, 张三]
删除后是:
[赵六, 王五, 张三]
获取集合长度
System.out.println(students.size());
3. 遍历 List
遍历就是把集合中的元素一个个取出来。
方法一:普通 for 循环
for (int i = 0; i < students.size(); i++) {
System.out.println(students.get(i));
}
适合需要使用下标的情况。
方法二:增强 for 循环
for (String name : students) {
System.out.println(name);
}
更简洁,初学者推荐常用这个。
4. Set:无序、不重复
Set 最常用的实现类是 HashSet。
例子:保存不重复的姓名
import java.util.HashSet;
public class Main {
public static void main(String[] args) {
HashSet<String> names = new HashSet<>();
names.add("张三");
names.add("李四");
names.add("王五");
names.add("张三");
System.out.println(names);
}
}
输出可能是:
[李四, 张三, 王五]
注意:第二个 "张三" 没有被加入。
因为 Set 不允许重复。
Set 的特点
1. 不允许重复
2. 没有固定顺序
3. 不能通过下标访问
所以不能这样写:
names.get(0); // 错误,Set 没有 get(index)
遍历 Set
for (String name : names) {
System.out.println(name);
}
5. Map:键值对
Map 用来保存一一对应关系。
最常用的实现类是 HashMap。
比如:
学号 -> 姓名
1001 -> 张三
1002 -> 李四
1003 -> 王五
代码如下:
import java.util.HashMap;
public class Main {
public static void main(String[] args) {
HashMap<Integer, String> students = new HashMap<>();
students.put(1001, "张三");
students.put(1002, "李四");
students.put(1003, "王五");
System.out.println(students);
}
}
输出可能是:
{1001=张三, 1002=李四, 1003=王五}
6. Map 的基本操作
添加数据
students.put(1001, "张三");
这里:
1001
是 key。
"张三"
是 value。
根据 key 获取 value
String name = students.get(1001);
System.out.println(name);
输出:
张三
修改 value
如果 key 已经存在,再次 put 会覆盖原来的值。
students.put(1001, "赵六");
System.out.println(students.get(1001));
输出:
赵六
删除数据
students.remove(1001);
判断是否存在某个 key
System.out.println(students.containsKey(1002));
输出:
true
判断是否存在某个 value
System.out.println(students.containsValue("李四"));
7. 遍历 Map
Map 不是一个个单独的值,而是一组一组的键值对。
推荐使用这种方式:
for (Integer id : students.keySet()) {
String name = students.get(id);
System.out.println(id + " -> " + name);
}
输出:
1001 -> 张三
1002 -> 李四
1003 -> 王五
也可以用 entrySet():
for (Map.Entry<Integer, String> entry : students.entrySet()) {
System.out.println(entry.getKey() + " -> " + entry.getValue());
}
完整代码需要导入:
import java.util.HashMap;
import java.util.Map;
8. 集合中存放对象
前面的例子都是存字符串。实际开发中,经常存对象。
比如定义一个学生类:
class Student {
private String name;
private int age;
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public void showInfo() {
System.out.println(name + "," + age + "岁");
}
}
然后用 ArrayList 保存多个学生:
import java.util.ArrayList;
public class Main {
public static void main(String[] args) {
ArrayList<Student> students = new ArrayList<>();
students.add(new Student("张三", 18));
students.add(new Student("李四", 20));
students.add(new Student("王五", 19));
for (Student s : students) {
s.showInfo();
}
}
}
输出:
张三,18岁
李四,20岁
王五,19岁
这个例子非常重要,因为真实项目里集合经常这样用。
9. 泛型:<String>、<Integer> 是什么?
你会看到这种写法:
ArrayList<String> names = new ArrayList<>();
HashSet<Integer> numbers = new HashSet<>();
HashMap<Integer, String> students = new HashMap<>();
尖括号里的内容叫泛型。
它的作用是规定集合里能放什么类型的数据。
比如:
ArrayList<String> names = new ArrayList<>();
表示这个集合只能放字符串。
names.add("张三"); // 正确
names.add(100); // 错误
再比如:
HashMap<Integer, String> students = new HashMap<>();
表示:
key 是 Integer 类型
value 是 String 类型
也就是:
学号 -> 姓名
10. ArrayList 和 LinkedList 的区别
List 有两个常见实现类:
ArrayList
LinkedList
初学阶段先用 ArrayList 就够了。
简单区别:
| 类型 | 特点 | 适合场景 |
|---|---|---|
ArrayList |
查询快 | 经常根据下标查数据 |
LinkedList |
插入、删除较方便 | 经常在中间插入删除 |
例如:
ArrayList<String> list = new ArrayList<>();
这是最常用的。
11. HashSet 和 TreeSet 的区别
Set 也有多个实现类:
| 类型 | 特点 |
|---|---|
HashSet |
无序,不重复,速度快 |
TreeSet |
不重复,会自动排序 |
例子:
import java.util.TreeSet;
public class Main {
public static void main(String[] args) {
TreeSet<Integer> nums = new TreeSet<>();
nums.add(30);
nums.add(10);
nums.add(20);
nums.add(10);
System.out.println(nums);
}
}
输出:
[10, 20, 30]
可以看到:
1. 重复的 10 被去掉
2. 数字自动排序
12. HashMap 和 TreeMap 的区别
Map 也有多个实现类:
| 类型 | 特点 |
|---|---|
HashMap |
key 无序,速度快 |
TreeMap |
key 自动排序 |
例子:
import java.util.TreeMap;
public class Main {
public static void main(String[] args) {
TreeMap<Integer, String> students = new TreeMap<>();
students.put(1003, "王五");
students.put(1001, "张三");
students.put(1002, "李四");
System.out.println(students);
}
}
输出:
{1001=张三, 1002=李四, 1003=王五}
它会按照 key 排序。
13. 一个完整例子:学生管理
下面用集合做一个小型学生列表。
import java.util.ArrayList;
class Student {
private int id;
private String name;
private int age;
public Student(int id, String name, int age) {
this.id = id;
this.name = name;
this.age = age;
}
public int getId() {
return id;
}
public void showInfo() {
System.out.println("学号:" + id + ",姓名:" + name + ",年龄:" + age);
}
}
public class Main {
public static void main(String[] args) {
ArrayList<Student> students = new ArrayList<>();
students.add(new Student(1001, "张三", 18));
students.add(new Student(1002, "李四", 20));
students.add(new Student(1003, "王五", 19));
System.out.println("所有学生:");
for (Student s : students) {
s.showInfo();
}
System.out.println("查找学号为 1002 的学生:");
for (Student s : students) {
if (s.getId() == 1002) {
s.showInfo();
}
}
}
}
输出:
所有学生:
学号:1001,姓名:张三,年龄:18
学号:1002,姓名:李四,年龄:20
学号:1003,姓名:王五,年龄:19
查找学号为 1002 的学生:
学号:1002,姓名:李四,年龄:20
14. 如果用 HashMap 管理学生
如果经常根据学号查学生,用 HashMap 更合适。
import java.util.HashMap;
class Student {
private int id;
private String name;
private int age;
public Student(int id, String name, int age) {
this.id = id;
this.name = name;
this.age = age;
}
public void showInfo() {
System.out.println("学号:" + id + ",姓名:" + name + ",年龄:" + age);
}
}
public class Main {
public static void main(String[] args) {
HashMap<Integer, Student> studentMap = new HashMap<>();
studentMap.put(1001, new Student(1001, "张三", 18));
studentMap.put(1002, new Student(1002, "李四", 20));
studentMap.put(1003, new Student(1003, "王五", 19));
Student s = studentMap.get(1002);
if (s != null) {
s.showInfo();
} else {
System.out.println("没有找到该学生");
}
}
}
这样查找更直接:
studentMap.get(1002);
不用自己写循环遍历。
15. 什么时候用 List、Set、Map?
初学者可以这样选:
用 List
当你需要保存一组有顺序的数据时:
ArrayList<String> names = new ArrayList<>();
比如:
学生名单
商品列表
成绩列表
评论列表
用 Set
当你希望数据不能重复时:
HashSet<String> phoneNumbers = new HashSet<>();
比如:
手机号去重
用户名去重
身份证号去重
标签集合
用 Map
当你需要通过一个 key 快速找到一个 value 时:
HashMap<Integer, Student> students = new HashMap<>();
比如:
学号 -> 学生
用户名 -> 用户对象
商品编号 -> 商品信息
单词 -> 出现次数
16. 常用集合方法总结
List 常用方法
list.add(value); // 添加
list.get(index); // 获取
list.set(index, value);// 修改
list.remove(index); // 删除
list.size(); // 长度
list.contains(value); // 是否包含
Set 常用方法
set.add(value); // 添加
set.remove(value); // 删除
set.contains(value); // 是否包含
set.size(); // 长度
Map 常用方法
map.put(key, value); // 添加或修改
map.get(key); // 根据 key 获取 value
map.remove(key); // 删除
map.containsKey(key); // 是否包含 key
map.containsValue(value); // 是否包含 value
map.size(); // 长度
17. 最重要的一句话
Java 集合框架的核心可以先记成:
List:一列数据,可以重复,有顺序
Set :一组数据,不能重复
Map :一组键值对,通过 key 找 value
对于初学者,优先掌握这三个:
ArrayList
HashSet
HashMap
它们已经能覆盖大多数基础开发场景。
更多推荐
所有评论(0)