1.介绍
Java 集合框架 Java Collection Framework ,又被称为容器 container ,是定义在 java.util 包下的一组接口 interfaces 和其实现类 classes 。
其主要表现为将多个元素 element 置于一个单元中,用于对这些元素进行快速、便捷的存储 store 、检索retrieve 、管理manipulate ,即平时我们俗称的增删查改 CRUD 。
例如,一副扑克牌(一组牌的集合)、一个邮箱(一组邮件的集合)、一个通讯录(一组姓名和电话的映射关系)等等。
类和接口总览
这里简单介绍一下上图中的一些部分:(从左往右)(不需要着重记忆,了解单词的意思就行,只做初步了解),这篇后面博客开始会逐一介绍上图的每个部分
- stack:栈
- list:一般指代线性表
- ArrayList:就是我们常说的顺序表
- Queue:队列
- Deque:双端队列(可以从任意一端进出)
- LinkedList:可以当作链表来使用,底层是一个双向链表,由于它实现了Queue接口,也可以当作队列来使用(普通的队列:队尾进,队头出),因此就算是队列,也是通过链表来实现
- PriorityQueue:优先级队列,底层是一个堆
- Set:集合(数学意义上的那种集合),数据不可以重复
- TreeSet:二叉树,严格意义上来说是一个二叉搜索树
- HashSet:底层是一个哈希表
- Map:底层是一对键值对
- SortedMap:有序的键值对
- HashMap:底层也是一个哈希表
- TreeMap:底层也是一颗树
- lterator:迭代器,用来遍历集合
- Comparator:比较器
- Collections:操作集合的工具类
2.学习的意义
2.1 Java集合框架的优点及作用
- 使用成熟的集合框架,有助于我们便捷、快速的写出高效、稳定的代码
- 学习背后的数据结构知识,有助于我们理解各个集合的优缺点及使用场景
2.2 笔试及面试题
腾讯-Java后台开发面经
- HashMap 了解不,介绍一下,如果一个对象为 key 时,hashCode 和 equals 方法的用法要注意什么?
- HashSet 和 HashMap 的区别是什么?
- HashMap 是线程安全的么?那需要线程安全需要用到什么?
阿里巴巴-Java后台开发面经
- ArrayList 和 LinkedList 的区别是什么?
- 有了解过 HashMap 的具体实现么?
- HashMap 和 ConcurrentHashMap 哪个效率更高?
今日头条-Java后台开发面经
- 编程题:判断一个链表是否是一个回文链表。
- Redis 的 zset 类型对应到 java 语言中大致是什么类型?
- hashCode 主要是用来做什么用的?
3.接口 interfaces
3.1 基本关系说明
如第一张图下面的讲解
3.2 Collection 接口常用方法说明
方法名 | 说明 |
boolean add(E e) | 将元素e放入集合中 |
void clear() | 删除集合中所有元素 |
boolean isEmpty() | 判断集合中是否有元素,俗称空集合 |
boolean remove (object e) | 如果e在集合中出现,就删掉其中一个 |
int size() | 返回集合中的元素个数 |
object[] toArray() | 返回一个装有所有集合元素的数组 |
3.3 Collection 示例
import java.util.Collection;
import java.util.ArrayList;
import java.util.Arrays;
public class Demo {
public static void main(String[] args) {
Collection<String> list = new ArrayList<>();
System.out.println(list.size());
System.out.println(list.isEmpty());
list.add("我"); list.add("爱");
list.add("Java");
System.out.println(list.size());
System.out.println(list.isEmpty());
Object[] array = list.toArray();
System.out.println(Arrays.toString(array));
for (String s : list) {
System.out.println(s);
}
list.remove("爱");
for (String s : list) {
System.out.println(s);
}
list.clear();
System.out.println(list.size());
System.out.println(list.isEmpty());
}
}
运行结果:
0
true
3
false
[我, 爱, Java]
我
爱
Java
我
Java
0
true
3.4 Map 接口常用方法说明
方法名 | 说明 |
v get(object k) | 根据指定的k查找对应的v |
v getorDefault(object k,v defaultvalue) | 根据指定的k查找对应的v,没有找到用默认值代替 |
v put(k key,v value) | 将指定的 k-v 放入Map |
boolean containsValue(object value) | 判断是否包含value |
boolean containsKey(object key) | 判断是否包含k |
Set<Map.Entry<K, V>> entrySet() | 将所有键值对返回 |
boolean isEmpty() | 判断是否为空 |
int size() | 返回键值对数量 |
3.5 Map示例
public static void main(String[] args) {
Map<String,String> map = new HashMap<>();
map.put("悟能","猪八戒");
map.put("齐天大圣","孙悟空");
System.out.println(map);
map.put("齐天大圣","孙悟空2");
System.out.println(map);
System.out.println(map.get("悟能"));
System.out.println(map.getOrDefault("玄奘","唐僧"));
map.put("玄奘","唐三藏");
System.out.println(map.getOrDefault("玄奘","唐僧"));
Set<Map.Entry<String,String>> entrySet = map.entrySet();
for (Map.Entry<String,String> entry:entrySet) {
System.out.println(entry.getKey() + "=" + entry.getValue());
}
/*map.put(null,null);
System.out.println(map);*/
}
运行结果
{齐天大圣=孙悟空, 悟能=猪八戒}
{齐天大圣=孙悟空2, 悟能=猪八戒}
猪八戒
唐僧
唐三藏
齐天大圣=孙悟空2
悟能=猪八戒
玄奘=唐三藏
对于最后一个方法,这里给大家看一张图来帮助大家理解
我们可以看到:
- 首先我们通过map调用entrySet()方法的时候,就能把键值对提取出来(如图中键值对被红圈包裹起来)(蓝色的圈就相当于是Set集合)
- 其次我们将键值对返回给Map.Entry<String,String>,这个Set集合的类型就相当于是Map.Entry<String,String>类型
- 最后我们遍历Set的时候可以使用Map.Entry<String,String>类型来接受每个元素
注意:
- 往map当中存放元素的顺序,不一定是打印的顺序,原因是存放数据的方式不一样,根据某一个规则(后续会详细讲解)
- k值可以重复,但是重复之后他的v值是最后一次放进去的v值,语法允许这样写,但是我们一般不建议这样去做
- k和v都是可以为null的
4.重点总结
- Java 集合框架中接口、之间的关系及其含义
- Java 集合框架中接口和其各自对应的常见实现类之间的关系