Java集合系列(一):集合的定义及分类

本文深入探讨Java集合,从定义到与数组的区别,再到List、Set、Map三大集合分类及其特点。强调面试中常问的集合与数组的区别、集合长度的可变性、不同类型集合实现类的选择及其应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 集合的定义

什么是集合呢?

定义:集合是一个存放对象的引用的容器。

在Java中,集合位于java.util包下。

2. 集合和数组的区别(面试常问)

提到容器,就会想起数组,那么集合和数组的区别是什么呢?(这里是重点,面试可能问的比较多)

数组和集合都是Java中的容器
数组的长度是固定的,集合的长度是可变的
数组只能存储相同数据类型的数据,这里的数据类型可以是基本数据类型,也可以是引用类型
集合可以存储不同数据类型的对象的引用(但一般情况下,我们会使用泛型来约定只使用1种数据类型),但不能存储基本数据类型
空口无凭,我们来点代码配合理解,首先,我们看下如下的数组代码:

String[] platformArray = new String[3];
platformArray[0] = "博客园";
platformArray[1] = "掘金";
platformArray[2] = "微信公众号";
platformArray[3] = "个人博客";

运行代码就会发现,platformArray[3] = “个人博客”;会引发java.lang.ArrayIndexOutOfBoundsException异常。

而使用集合时就不存在这个问题,因为集合在声明时不需要指定长度并且长度会根据放入元素的多少而变化:

List<String> platformList = new ArrayList<>();
platformList.add("博客园");
platformList.add("掘金");
platformList.add("微信公众号");
platformList.add("个人博客");

观察上面声明数组的代码,我们可以推断出下面的代码肯定是编译不通过的:

String[] platformArray = new String[3];
platformArray[0] = "博客园";
platformArray[1] = "掘金";
platformArray[2] = 1;

因为数组声明时用的是String类型,而platformArray[2] = 1;赋值时却使用了int类型。

再来看下下面的集合代码:

List<int> intList = new ArrayList<int>();
intList.add(1);
intList.add(2);
intList.add(3);

这段代码也是编译不通过的,在IDEA中,鼠标悬停时会提示如下的错误信息:


意思是类型参数不能是原始类型(基本数据类型),那怎么使用呢?总不能不让我使用int型的集合吧?

当然不会,Java为每种基本数据类型都提供了对应的包装类,这里修改为int类型对应的包装类Integer即可:

List<Integer> intList = new ArrayList<Integer>();
intList.add(1);
intList.add(2);
intList.add(3);

以下为Java的原始类型(基本数据类型)与其对应的包装类:

Java集合系列(一):集合的定义及分类

3. 集合的分类

在Java中,集合主要分为以下3种:

List集合
Set集合
Map集合
它们之间的继承关系可以参考下图。

Java集合系列(一):集合的定义及分类
从上图可以总结出如下几点:

Java集合的根接口是Collection,它又继承了迭代接口Iterable
List接口和Set接口继承了Collection接口
Map接口是独立的接口,并没有继承Collection接口 (这里是重点,面试可能问的比较多)
List接口常用的实现类有:ArrayList、LinkedList、Vector
Set接口常用的实现类有:HashSet、LinkedHashSet、TreeSet
Map接口常用的实现类有:HashMap、HashTable、TreeMap

4. List集合

List集合包括List接口以及List接口的所有实现类。List集合具有以下特点:

集合中的元素允许重复
集合中的元素是有顺序的,各元素插入的顺序就是各元素的顺序
集合中的元素可以通过索引来访问或者设置
List接口常用的实现类有:ArrayList、LinkedList、Vector。

我们先看下如下示例了解下List集合的用法:

package collection;
import java.util.*;
public class Muster {
 public static void main(String[] args) {
 List<String> strList = new ArrayList<>();
 strList.add("a");
 strList.add("b");
 strList.add("c");
 int i = (int) (Math.random() * strList.size());
 System.out.println("随机获取数组中的元素:" + strList.get(i));
 strList.remove(2);
 System.out.println("将索引为2的元素从列表移除后,数组中的元素是:");
 for (int j = 0; j < strList.size(); j++) {
 System.out.println(strList.get(j));
 }
 }
}

以上代码的输出结果为:

随机获取数组中的元素:a

将索引为2的元素从列表移除后,数组中的元素是:

a

b

关于List集合的详细用法,ArrayList、LinkedList、Vector的区别(这里是重点,面试可能问的比较多),后续会单独写文总结,敬请期待。

5. Set集合

Set集合包括Set接口以及Set接口的所有实现类。Set集合具有以下特点:

集合中不包含重复元素(你可以重复添加,但只会保留第1个)
集合中的元素不一定保证有序
Set接口常用的实现类有:HashSet、LinkedHashSet、TreeSet。

我们先看下如下示例了解下Set集合的用法:

package collection;
import java.util.*;
public class Muster {
 public static void main(String[] args) {
 Set<String> platformList = new HashSet<>();
 platformList.add("博客园");
 platformList.add("掘金");
 platformList.add("微信公众号");
 platformList.add("个人博客");
 // 尝试添加重复元素
 platformList.add("博客园");
 platformList.add("掘金");
 for (String platform : platformList) {
 System.out.println(platform);
 }
 }
}

以上代码的输出结果为:

博客园

个人博客

掘金

微信公众号

可以看出,虽然我们尝试添加了重复元素,但并没有添加成功并且输出的元素没有顺序。

因此当你的集合中不允许有重复元素并且对排序也没有要求的话,可以使用Set集合。

关于Set集合的详细用法,HashSet、LinkedHashSet、TreeSet的区别(这里是重点,面试可能问的比较多),后续会单独写文总结,敬请期待。

6. Map集合

Map集合包括Map接口以及Map接口的所有实现类。Map集合具有以下特点:

Map接口并没有继承Collection接口,提供的是key到value的映射
Map中不能包含相同的key
Map接口常用的实现类有:HashMap、HashTable、TreeMap。

我们先看下如下示例了解下Map集合的用法:

package collection;
import java.util.*;
public class Muster {
 public static void main(String[] args) {
 Map<Integer, String> platformMap = new HashMap<>();
 platformMap.put(1, "博客园");
 platformMap.put(2, "掘金");
 platformMap.put(3, "微信公众号");
 platformMap.put(4, "个人博客");
 // 尝试添加重复Map
 platformMap.put(4, "个人博客");
 // 获取所有的key
 Set<Integer> keys = platformMap.keySet();
 for (Integer integer : keys) {
 System.out.println("Key:" + integer + ",Value:" + platformMap.get(integer));
 }
 }
}

以上代码的输出结果为:

Key:1,Value:博客园

Key:2,Value:掘金

Key:3,Value:微信公众号

Key:4,Value:个人博客

从日志可以看出,当我们尝试重加重复Map时,并没有添加成功。

关于Map集合的详细用法,HashMap、HashTable、TreeMap的区别(这里是重点,面试可能问的比较多),后续会单独写文总结,敬请期待。

7. 最后

记得点个赞再走哦~

为了感谢支持我的朋友!整理了一份Java高级架构资料、Spring源码分析、Dubbo、Redis、Netty、zookeeper、Spring cloud、分布式等资料

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值