Java集合系列(一):集合的定义及分类
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的原始类型(基本数据类型)与其对应的包装类:
| 原始类型(基本数据类型) | 包装类 |
|---|---|
| byte | Byte |
| short | Short |
| int | Integer |
| long | Long |
| float | Float |
| double | Double |
| char | Character |
| boolean | Boolean |
3. 集合的分类
在Java中,集合主要分为以下3种:
- List集合
- Set集合
- Map集合
它们之间的继承关系可以参考下图。

从上图可以总结出如下几点:
- 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集合中List,Set以及Map等集合体系详解(史上最全)
Java集合系列(一):集合的定义及分类的更多相关文章
- Java多线程系列--“JUC集合”02之 CopyOnWriteArrayList
概要 本章是"JUC系列"的CopyOnWriteArrayList篇.接下来,会先对CopyOnWriteArrayList进行基本介绍,然后再说明它的原理,接着通过代码去分析, ...
- Java多线程系列--“JUC集合”04之 ConcurrentHashMap
概要 本章是JUC系列的ConcurrentHashMap篇.内容包括:ConcurrentHashMap介绍ConcurrentHashMap原理和数据结构ConcurrentHashMap函数列表 ...
- Java多线程系列--“JUC集合”07之 ArrayBlockingQueue
概要 本章对Java.util.concurrent包中的ArrayBlockingQueue类进行详细的介绍.内容包括:ArrayBlockingQueue介绍ArrayBlockingQueue原 ...
- Java多线程系列--“JUC集合”08之 LinkedBlockingQueue
概要 本章介绍JUC包中的LinkedBlockingQueue.内容包括:LinkedBlockingQueue介绍LinkedBlockingQueue原理和数据结构LinkedBlockingQ ...
- Java多线程系列--“JUC集合”09之 LinkedBlockingDeque
概要 本章介绍JUC包中的LinkedBlockingDeque.内容包括:LinkedBlockingDeque介绍LinkedBlockingDeque原理和数据结构LinkedBlockingD ...
- Java多线程系列--“JUC集合”10之 ConcurrentLinkedQueue
概要 本章对Java.util.concurrent包中的ConcurrentHashMap类进行详细的介绍.内容包括:ConcurrentLinkedQueue介绍ConcurrentLinkedQ ...
- Java多线程系列--“JUC集合”03之 CopyOnWriteArraySet
概要 本章是JUC系列中的CopyOnWriteArraySet篇.接下来,会先对CopyOnWriteArraySet进行基本介绍,然后再说明它的原理,接着通过代码去分析,最后通过示例更进一步的了解 ...
- Java多线程系列--“JUC集合”05之 ConcurrentSkipListMap
概要 本章对Java.util.concurrent包中的ConcurrentSkipListMap类进行详细的介绍.内容包括:ConcurrentSkipListMap介绍ConcurrentSki ...
- Java多线程系列--“JUC集合”06之 ConcurrentSkipListSet
概要 本章对Java.util.concurrent包中的ConcurrentSkipListSet类进行详细的介绍.内容包括:ConcurrentSkipListSet介绍ConcurrentSki ...
- java集合系列——List集合之ArrayList介绍(二)
一:List概述 List是 java.util包下面的类,从<a href="http://blog.csdn.net/u010648555/article/details/5604 ...
随机推荐
- 对新数据库使用 Code First
如果使用的是 Visual Studio 2010,还需要安装 Nuget 1.创建应用程序 简单起见,我们将构建一个使用 Code First 执行数据访问的基本控制台应用程序. 打开 Visual ...
- 2019年5月23日 AY 程序员调侃语录
我是AY,杨洋,做wpf开发的,最近得了一种病,程序员患得患失综合征.同事说,我年纪在变大,技术跟不上.业余之间,我原创了写了一些语录,给大家中午休息,累疲惫的时候,开心放松下. 1.有很多公司找我谈 ...
- Python 爬虫从入门到进阶之路(九)
之前的文章我们介绍了一下 Python 中的正则表达式和与爬虫正则相关的 re 模块,本章我们就利用正则表达式和 re 模块来做一个案例,爬取<糗事百科>的糗事并存储到本地. 我们要爬取的 ...
- pycharm同步代码到linux(转)
pycharm是一个非常强大的python开发工具,现在很多代码最终在线上跑的环境都是linux,而开发环境可能还是windows下开发,这就需要经常在linux上进行调试,或者在linux对代码进行 ...
- 【运维实战】利用tar -g 实现简单全量备份和增量备份(带演示)
备份产生 全量备份指完全备份,增量备份指针对上次至今的修改进行备份.linux提供tar -g可实现备份功能. 第一次运行 tar -g 备份存放目录/snapshot -czvf 备份存放目录/备 ...
- 仿写一个简陋的 IOC/AOP 框架 mini-spring
讲道理,感觉自己有点菜.Spring 源码看不懂,不想强行解释,等多积累些项目经验之后再看吧,但是 Spring 中的控制反转(IOC)和面向切面编程(AOP)思想很重要,为了更好的使用 Spring ...
- java虚拟机-JDK8-废弃永久代(PermGen)迎来元空间(Metaspace)
一.背景 1.1 永久代(PermGen)在哪里? 根据,hotspot jvm结构如下(虚拟机栈和本地方法栈合一起了): 上图引自网络,但有个问题:方法区和heap堆都是线程共享的内存区域. 关于方 ...
- POJ 3318:Matrix Multiplication(随机算法)
http://poj.org/problem?id=3318 题意:问A和B两个矩阵相乘能否等于C. 思路:题目明确说出(n^3)的算法不能过,但是通过各种常数优化还是能过的. 这里的随机算法指的是随 ...
- ZigBee按键查询实践
按键查询 即硬件上电后,程序开始运行,当检测到按键按下,触发按键语句,执行按键触发的事件: 玩单片机需要清楚两件东西,第一个是单片机的电路图,另一个则是单片机的寄存器: CC2530是51的升级版,我 ...
- 关于Keepalive的那些事
服务端很多同学包括自己对keepalive理解不清晰,经常搞不清楚,TCP也有keepalive,HTTP也有keepalive,高可用也叫keepalive,经常混淆这几个概念.做下这几个概念的简述 ...