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. PHP调用语音合成接口

    百度TTS 语音合成 //百度文件转换成语音 private function toSpeech($text) { define('DEMO_CURL_VERBOSE', false); $obj=[ ...

  2. Python时间戳的一些使用

    Python时间戳的一些使用 为什么写下这篇文档? 由于我本身是做Python爬虫的,在爬取网站的过程当中,会遇到形形色色的验证码,目前对于自己而言,可能简单的验证码可以进行自己识别 发现大多数的网站 ...

  3. cookie 和 session 区别

    二者的定义: 当你在浏览网站的时候,WEB 服务器会先送一小小资料放在你的计算机上,Cookie 会帮你在网站上所打的文字或是一些选择, 都纪录下来.当下次你再光临同一个网站,WEB 服务器会先看看有 ...

  4. 【python3两小时快速入门】入门笔记01:基础

    又要我搞爬虫了,这次的源网站使用的ajax加载数据,我用java爬下来的页面内容部分全都是空,虽然java也有插件,但是使用起来感觉很麻烦,所以,python!老子来了.    1. 版本:pytho ...

  5. 使用redis PSUBSCRIBE实现实时任务

    PSUBSCRIBE可以监听键的过期事件 1.进行数据库的配置 notify-keyspace-events Ex 2.使用命令监听事件 psubscribe  __keyevnet@0__:expi ...

  6. MySQL优化(一)

    MySQL数据库优化一之引索详解 对于网站优化最注重的就是数据库的优化,而在数据库优化中首先考虑到的应该是数据库索引是否建立于是否建立的正确. 1.对于刚刚接触数据库的程序员,对于引索不是很理解.下面 ...

  7. BFS(二):数的变换

    [例1]整数变换(POJ 3278 “Catch That Cow”) 给定两个整数a和b(0 ≤a,b≤100,000),要求把a变换到b.变换规则为:(1)当前数加1:(2)当前数减1:(3)当前 ...

  8. python爬虫之快速对js内容进行破解

    python爬虫之快速对js内容进行破解 今天介绍下数据被js加密后的破解方法.距离上次发文已经过去半个多月了,我写文章的主要目的是把从其它地方学到的东西做个记录顺便分享给大家,我承认自己是个懒猪.不 ...

  9. Maxon Cinema 4D Studio R20.026 中文破解版下载

    Maxon Cinema 4D Studio,是 Maxon 公司开发的一款专业三维工具包,如果你需要一个得力助手,轻松快速创建令人称赞的 3D 图形作品,那么这是你的最佳选择. 为何使用Cinema ...

  10. 小白教程 Java web maven项目Windows下部署阿里云服务器全过程(买服务器,打包项目,连接服务器,配置服务器,部署项目)

    -------------首先:购买服务器---------------- Step1: 在https://www.aliyun.com/?utm_content=se_1043015注册登录阿里云 ...