1. 集合的定义

什么是集合呢?

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

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

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

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

  1. 数组和集合都是Java中的容器
  2. 数组的长度是固定的,集合的长度是可变的
  3. 数组只能存储相同数据类型的数据,这里的数据类型可以是基本数据类型,也可以是引用类型
  4. 集合可以存储不同数据类型的对象的引用(但一般情况下,我们会使用泛型来约定只使用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种:

  1. List集合
  2. Set集合
  3. Map集合

它们之间的继承关系可以参考下图。

从上图可以总结出如下几点:

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

4. List集合

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

  1. 集合中的元素允许重复
  2. 集合中的元素是有顺序的,各元素插入的顺序就是各元素的顺序
  3. 集合中的元素可以通过索引来访问或者设置

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. 集合中不包含重复元素(你可以重复添加,但只会保留第1个)
  2. 集合中的元素不一定保证有序

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集合具有以下特点:

  1. Map接口并没有继承Collection接口,提供的是key到value的映射
  2. 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集合系列(一):集合的定义及分类的更多相关文章

  1. Java多线程系列--“JUC集合”02之 CopyOnWriteArrayList

    概要 本章是"JUC系列"的CopyOnWriteArrayList篇.接下来,会先对CopyOnWriteArrayList进行基本介绍,然后再说明它的原理,接着通过代码去分析, ...

  2. Java多线程系列--“JUC集合”04之 ConcurrentHashMap

    概要 本章是JUC系列的ConcurrentHashMap篇.内容包括:ConcurrentHashMap介绍ConcurrentHashMap原理和数据结构ConcurrentHashMap函数列表 ...

  3. Java多线程系列--“JUC集合”07之 ArrayBlockingQueue

    概要 本章对Java.util.concurrent包中的ArrayBlockingQueue类进行详细的介绍.内容包括:ArrayBlockingQueue介绍ArrayBlockingQueue原 ...

  4. Java多线程系列--“JUC集合”08之 LinkedBlockingQueue

    概要 本章介绍JUC包中的LinkedBlockingQueue.内容包括:LinkedBlockingQueue介绍LinkedBlockingQueue原理和数据结构LinkedBlockingQ ...

  5. Java多线程系列--“JUC集合”09之 LinkedBlockingDeque

    概要 本章介绍JUC包中的LinkedBlockingDeque.内容包括:LinkedBlockingDeque介绍LinkedBlockingDeque原理和数据结构LinkedBlockingD ...

  6. Java多线程系列--“JUC集合”10之 ConcurrentLinkedQueue

    概要 本章对Java.util.concurrent包中的ConcurrentHashMap类进行详细的介绍.内容包括:ConcurrentLinkedQueue介绍ConcurrentLinkedQ ...

  7. Java多线程系列--“JUC集合”03之 CopyOnWriteArraySet

    概要 本章是JUC系列中的CopyOnWriteArraySet篇.接下来,会先对CopyOnWriteArraySet进行基本介绍,然后再说明它的原理,接着通过代码去分析,最后通过示例更进一步的了解 ...

  8. Java多线程系列--“JUC集合”05之 ConcurrentSkipListMap

    概要 本章对Java.util.concurrent包中的ConcurrentSkipListMap类进行详细的介绍.内容包括:ConcurrentSkipListMap介绍ConcurrentSki ...

  9. Java多线程系列--“JUC集合”06之 ConcurrentSkipListSet

    概要 本章对Java.util.concurrent包中的ConcurrentSkipListSet类进行详细的介绍.内容包括:ConcurrentSkipListSet介绍ConcurrentSki ...

  10. java集合系列——List集合之ArrayList介绍(二)

    一:List概述 List是 java.util包下面的类,从<a href="http://blog.csdn.net/u010648555/article/details/5604 ...

随机推荐

  1. linux 磁盘控件找到大文件

    df -lh Used:已经使用的空间 Avail:可以使用的空间 Mounted on:挂载的目录 然后找到大文件 du是linux下用看查看磁盘的命令 下面我们先一个目录的来查看空间占用情况 du ...

  2. 29 z-index

    这个东西非常简单,它有四大特性,每个特性你记住了,页面布局就不会出现找不到盒子的情况. z-index 值表示谁压着谁,数值大的压盖住数值小的, 只有定位了的元素,才能有z-index,也就是说,不管 ...

  3. 戴尔R720安装ESXI系统

    1.U盘安装系统,使用UltraISO制作启动盘 参考地址:https://jingyan.baidu.com/article/5225f26b0bb45fe6fa0908bc.html 2.插上U盘 ...

  4. Spring Boot 打包成的可执行 jar ,为什么不能被其他项目依赖?

    前两天被人问到这样一个问题: "松哥,为什么我的 Spring Boot 项目打包成的 jar ,被其他项目依赖之后,总是报找不到类的错误?" 大伙有这样的疑问,就是因为还没搞清楚 ...

  5. leadcode的Hot100系列--226. 翻转二叉树

    这玩意儿基本上还是遍历的那一套, 这里使用先序遍历的方式,直接对左右子树进行对调即可. (虽然看题目的时候,感觉都一样,但真正写出来之后,印象还是深刻了很多) struct TreeNode* inv ...

  6. 设计模式-模块方法模式(TemplateMethod)

    模块方法模式是行为模式之一,它把具有特定步骤算法中的某些必要的处理委让给抽象方法,通过子类继承对抽象方法的不同实现改变整个算法的行为. UML图: 具体代码: /** * 抽象-模块方法模式核心 */ ...

  7. (ps2019)Photoshop 2019 最新破解版下载

    Photoshop CC 2019新增功能: 下载地址 点我 新功能介绍:https://helpx.adobe.com/cn/photoshop/using/whats-new.html 经过改良设 ...

  8. MYSQL Got error 28 from storage engine

    网络查找该异常信息,发现 Got error 28 from storage engine 查了一下,数据库文件所在的盘应该没事,应该是数据库用的临时目录空间不够 引用 磁盘临时空间不够导致. 解决办 ...

  9. jekyll搭建个人博客1

    目录 配置环境 使用模板 配置环境 简介 jekyll是一个简单的免费的,生成静态网页的工具,不需要数据库支持.但是可以配合第三方服务,例如Disqus.最关键的是jekyll可以免费部署在Githu ...

  10. 基础篇-1.2Java世界的规章制度(上)

    1 Java标识符 在Java语言中,有类.对象.方法.变量.接口和自定义数据类型等等,他们的名字并不是确定的,需要我们自己命名.而Java标识符就是用来给类.对象.方法.变量.接口和自定义数据类型命 ...