盘点Java集合(容器)概览,Collection和Map在开发中谁用的最多?
写在开头
在Java的世界里万物皆对象。但我认为是万物皆数据,世界由各种各样数据构建起来,我们通过程序去实现数据的增删改查、转入转出、加减乘除等等,不同语言的实现方式殊途同归。由此可见,数据对于程序语言的重要性。
这段话是在写数据类型那篇博客时说的,当时是为了引入Java中数据类型的重要性,现在放在这里,同样是为了引出Java中的集合(容器),因为这是存储数据的媒介!在Java中有各种存储数据的集合类型,用来存储数据,做简单的逻辑处理,比如排序、取反、截取等等。
【注】
Java集合不能存放基本数据类型,只能存放对象的引用。每个集合元素都是一个引用变量,实际内容都存放在堆内或方法区里面,但是基本数据类型是在栈内存上分配空间的,栈上的数据随时会被收回。如何解决?可以通过包装类,把基本数据类型转化为对象类型,存放引用。
容器的分类
Java中的集合主要有大量派生接口:Collection、Map
- Collection: 英文释义收集,集合,用在储存单一元素的容器;
- Map: 英文释义地图,映射,非常贴切,所谓地图输入一个地点,定位对应的地址位置,所以Map存储的是键值对(Key-Value),输入唯一性的key值,可以找到对应的value。

【注】:本文中所涉及到继承派生关系都是部分的,只挑重点,没列举全部,毕竟搞完太多了(手动笑哭)
Collection
先看第一个派生接口Collection,它下面又继承了很多子接口,主要为Set、List、Queue 它们各有特点,是我们在开发中几乎都会用的集合接口,也是很多互联网公司面试必问的话题!

Set
Set 的特点是存取无序,不可以存放重复的元素,不可以用下标对元素进行操作,为了直观的感受它的特点,我们直接以其子类HashSet为例去做一些增删改查的操作。
【源码速看1】
public class HashSet<E>
extends AbstractSet<E>
implements Set<E>, Cloneable, java.io.Serializable
{
private transient HashMap<E,Object> map;
// Dummy value to associate with an Object in the backing Map
private static final Object PRESENT = new Object();
public HashSet() {
map = new HashMap<>();
}
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
public boolean remove(Object o) {
return map.remove(o)==PRESENT;
}
}
虽然HashSet实现了Set接口,但通过源码我们能够看到,它的底层逻辑实现其实依据的是HashMap,通过操作map的key值来实现元素的增删改查,下面来使用一下HashSet。
【代码示例1】
public class Test {
public static void main(String[] args) throws FileNotFoundException {
// 创建一个新的HashSet
HashSet<Integer> set = new HashSet<>();
// 添加元素
set.add(3);
set.add(4);
set.add(0);
set.add(1);
set.add(4);
// 输出HashSet的元素个数
System.out.println("HashSet size: " + set.size());
// 判断元素是否存在于HashSet中
boolean containsWanger = set.contains(2);
System.out.println(containsWanger);
// 删除元素
boolean removeWanger = set.remove(1);
System.out.println(set);
// 修改元素,需要先删除后添加
boolean removeChenmo = set.remove(3);
boolean addBuChenmo = set.add(4);
System.out.println(removeChenmo && addBuChenmo);
// 输出修改后的HashSet
System.out.println(set);
}
}
【输出】
HashSet size: 4
false
[0, 3, 4]
false
[0, 4]
由代码结果进一步证明了我们的结论,1、存储数据不重复,但add重复数据并不报错,原因是第一个数据会被第二次重复数据覆盖掉;2,无序,很多人发现输出了一个有序的数字集合,这个其实与我们所说的有序是有区别的,在Set中的有序无序是指输入的顺序与输出的顺序是否一致 当然,想要实现有序可以通过LinkedHashSet,底层通过链表记录元素插入顺序。
List
List 的特点是存取有序,可以存放重复的元素,可以用下标对元素进行操作,同样,我们还是选择其中一个子类ArrayList来验证一下。
【代码示例2】
public class Test {
public static void main(String[] args) throws FileNotFoundException {
// 创建一个集合
ArrayList<String> list = new ArrayList<String>();
// 添加元素
list.add("a");
list.add("b");
list.add("c");
list.add("c");
// 遍历集合 for each
for (String s : list) {
System.out.println(s);
}
System.out.println("--------------");
// 删除元素
list.remove(1);
// 遍历集合
for (String s : list) {
System.out.println(s);
}
System.out.println("--------------");
// 修改元素
list.set(1, "z");
// 遍历集合
for (String s : list) {
System.out.println(s);
}
}
}
【输出】
a
b
c
c
--------------
a
c
c
--------------
a
z
c
通过代码输出结果进一步论证结论,可通过下标操作元素(下标以0为开始);输入输出一致(有序);可存储重复数据。
Queue
Queue,也就是队列,通常遵循先进先出(FIFO)的原则,新元素插入到队列的尾部,访问元素返回队列的头部。其实在日常的开发中,我们队列的使用场景不是很多,但在很多算法题中,还是有他独特的优势的。
比如,对Queue进行扩展出Deque, 实现双端队列,在队列的两端均可以插入或删除元素。
【代码示例3】
// 创建一个ArrayDeque
ArrayDeque<String> deque = new ArrayDeque<>();
// 添加元素
deque.add("a");
deque.add("b");
deque.add("c");
// 删除元素
deque.remove("b");
// 修改元素
deque.remove("b");
deque.add("bb");
// 查找队首元素
System.out.println(deque.getFirst());
//查找队尾元素
System.out.println(deque.getLast());
//遍历队列
for (String s : deque) {
System.out.print(s);
}
【输出】
a
bb
acbb
List、Set、Queue三者的区别?
看望上面的几种集合类型,我们在这里进行一个区别总结
1、List(对付顺序的好帮手): 存储的元素是有序的、可重复的。
2、Set(注重独一无二的性质): 存储的元素不可重复的。
3、Queue(实现排队功能的叫号机): 按特定的排队规则来确定先后顺序,存储的元素是有序的、可重复的。
Map
键值对集合,存储键、值和之间的映射;Key无序,唯一;value 不要求有序,允许重复。

我们以Map下最经典的HasMap为例看一看Map的特点
【代码示例4】
// 创建一个 HashMap 对象
HashMap<String, String> hashMap = new HashMap<>();
// 添加键值对
hashMap.put("1", "aa");
hashMap.put("2", "bb");
hashMap.put("3", "cc");
// 获取指定键的值
String value1 = hashMap.get("1");
System.out.println("1对应的值:" + value1);
// 修改键对应的值
hashMap.put("1", "aaa");
String value2 = hashMap.get("1");
System.out.println("1对应的值:" + value2);
// 删除指定键的键值对
hashMap.remove("1");
// 遍历 HashMap
for (String key : hashMap.keySet()) {
String value = hashMap.get(key);
System.out.println(key + " 对应的值为:" + value);
}
HashMap 实现了 Map 接口,可以根据键快速地查找对应的值——通过哈希函数将键映射到哈希表中的一个索引位置,从而实现快速访问。
【输出】
1对应的值:aa
1对应的值:aaa
2 对应的值为:bb
3 对应的值为:cc
总结
本文的重心是Java集合的盘点,Collection和Map的引出,各子类的特点比较,针对很多常用的子类并没有展开过多的叙述,后面会按个的学习按个的梳理滴,毕竟这一块内容有非常多的考点,至少得更新个十几篇博文才能讲个大概,继续保持耐心,继续保持学习,一起冲!!!
结尾彩蛋
如果本篇博客对您有一定的帮助,大家记得留言+点赞+收藏呀。原创不易,转载请联系Build哥!

盘点Java集合(容器)概览,Collection和Map在开发中谁用的最多?的更多相关文章
- java之集合容器(Collection,Map)
首先我们要了解什么是集合? 正所谓容器,比如说杯子是装水的容器,衣柜是装衣服的容器,那么集合就是装数据的容器. 集合有什么特点呢? 1.集合长度是可变的 2.集合用来存储对象 集合和数组有什么区别呢? ...
- JAVA集合详解(Collection和Map接口)
原文地址http://blog.csdn.net/lioncode/article/details/8673391 在JAVA的util包中有两个所有集合的父接口Collection和Map,它们的父 ...
- Java集合容器简介
Java集合容器主要有以下几类: 1,内置容器:数组 2,list容器:Vetor,Stack,ArrayList,LinkedList, CopyOnWriteArrayList(1.5),Attr ...
- [转载]Java集合容器简介
Java集合容器主要有以下几类: 1,内置容器:数组 2,list容器:Vetor,Stack,ArrayList,LinkedList, CopyOnWriteArrayList(1.5),Attr ...
- 面霸篇:Java 集合容器大满贯(卷二)
面霸篇,从面试角度作为切入点提升大家的 Java 内功,所谓根基不牢,地动山摇. 码哥在 <Redis 系列>的开篇 Redis 为什么这么快中说过:学习一个技术,通常只接触了零散的技术点 ...
- Java 集合系列 02 Collection架构
java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java ...
- Java集合(十)实现Map接口的HashMap
Java集合(十)继承Map接口的HashMap 一.HashMap简介(基于JDK1.8) HashMap是基于哈希表(散列表),实现Map接口的双列集合,数据结构是“链表散列”,也就是数组+链表 ...
- Java生鲜电商平台-SpringCloud微服务开发中的数据架构设计实战精讲
Java生鲜电商平台-SpringCloud微服务开发中的数据架构设计实战精讲 Java生鲜电商平台: 微服务是当前非常流行的技术框架,通过服务的小型化.原子化以及分布式架构的弹性伸缩和高可用性, ...
- Java集合框架(Collection Framework)学习之 Collection与Map概貌
写过Java的人都知道Java集合类,也用过Java集合类.Java集合类位于 java.util 这个包下,就像它的包名暗示的那样,Java集合类就是一套工具.它就像工匠的工具箱一样,它能给使用它的 ...
- Java Collections Framework Java集合框架概览
Java SE documents -- The Collections Framework http://docs.oracle.com/javase/8/docs/technotes/guides ...
随机推荐
- P2196-DP【黄】
清醒了一点后我又写了一道黄色DP题,做出来了,还行,开心不少了... 中途暴露出一些问题 1.深搜过程中既然用了二维数组,那么深搜时就应该用二维循环取最优解,而不是只从最后一行中进行一维循环取最优解. ...
- freeswitch服务器的时间同步设置
概述 在生产环境中,一般会有N台freeswitch 服务器,不同服务器之间的信令和话单的时间不能相差太多,否则对查找和定位问题会造成一定的困扰. 同时,freeswitch的默认运行设置并未直接使用 ...
- Liunx常用操作(三)-如何忽略大小写查找
1.vim 中的查找 搜索文件内容时加上 /c 参数可以忽略搜索字符的大小写 正常搜索:/helloworld 忽略操作:/helloworld/c 2.find 查找 使用find命令搜索文件时如果 ...
- The requested URL could not be retrieved
在开发过程中,调用对外接口,返回了一长串的标签提示,如下 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "ht ...
- 无法访问Github仓库的极简治标法
技术背景 由于IP原因,国内的IP访问Github仓库的时候会经常遇到一些困难,甚至存在无法Ping通的情况.尝试过FastGithub等方案,但还是会遇到各种各样的问题,导致情况越来越复杂. 但是转 ...
- MoeCTF 2023(西电CTF新生赛)WP
个人排名 签到 hello CTFer 1.题目描述: [非西电] 同学注意: 欢迎你来到MoeCTF 2023,祝你玩的开心! 请收下我们送给你的第一份礼物: https://cyberchef.o ...
- Android——共享参数SharedPreferences
4数据存储 共享参数SharedPreferences.数据库SQLite.SD卡文件.App的全局内存 4.1共享参数SharedPreferences SharedPreferences是一个轻量 ...
- SpringBoot01:HelloWorld!
回顾Spring Spring是一个开源框架,2003年兴起的一个轻量级的Java开发框架. Spring是为了解决企业级应用开发的复杂性而创建的,简化开发. Spring是怎样简化Java开发的呢? ...
- [转帖]nginx 剖析 request_time和upstream_response_time的误区、区别
https://cloud.tencent.com/developer/article/1767981 首先,澄清一个误区 upstream_response_time必须在upstream配置时才能 ...
- [转帖]VMware-ovftool命令行部署与导出镜像
ESXI6.0之后管理为WEB,OVF导出/部署是个渣渣,如果虚拟机文件过大,一般会报网络异常中断而失败,可使用官方ovftool工具解决,快而方便,支持linux和Mac OSX,可脚本操作,批量处 ...