什么是集合框架
数据结构,我们知道数据结构就是组织数据的一种方式,比如所链表,就是将数据存储在链表的value域中,next域就是存储下一个节点的地址,通过这样的方式将数据组织起来。
在我们学习中,所知道 的 二叉树,栈,队列等这些,在Java中都被封装起来了。
也就是说以后用的时候,在Java中不用我们自己去实现栈,列表,顺序表等操作,直接使用Java中写好的。直接拿过来用就对了。
那么集合框架的集合其实就是Java写好的一些数据结构,所以我们就需要去了解一下每一个集合,它背后的数据结构是么。
最后框架又是什么:顾名思义,就像是有一个大架子,东西分开摆放,具有层次感。
结合来说:集合框架 就是 每一种集合,它都是一定关系和关联的。
一、介绍
官方文档
Java 集合框架 Java Collection Framework ,又被称为容器 container ,是定义在 java.util包下的一组 接口 interfaces 和其实现类 classes 。 其主要表现为将多个元素 element 置于一个单元中,用于对这些元素进行快速、便捷的存储 store 、检索retrieve 、管理 manipulate,即平时我们俗称的增删查改 CRUD 。
例如,一副扑克牌(一组牌的集合)、一个邮箱(一组邮件的集合)、一个通讯录(一组姓名和电话的映射关系)等等
所以我们要使用这些集合框架的时候就要导入这个包 java.util
1.1、类和接口总览
下面这张图并不是将所有的接口,抽象类,具体的实现类都列举出来,只是将部分重要的列举出来
interface:接口,图中和这个颜色一样的都代表是接口
abstract class :抽象类,图中和这个颜色一样的都代表是抽象类
class:具体的实现类,图中和这个颜色一样的都代表是具体的实现类
下面我们要了解几个问题:
1、了解清楚,接口和接口之间的关系
2、了解清楚,接口和类之间的关系
3、了解清楚,每个类背后的数据结构大概是个啥?
三个工具
二、学习的意义
2.1 Java 集合框架的优点及作用
- 使用成熟的集合框架,有助于我们便捷、快速的写出高效、稳定的代码
- 学习背后的数据结构知识,有助于我们理解各个集合的优缺点及使用场景
2.2 笔试及面试题
腾讯-Java后台开发面经
- HashMap 了解不,介绍一下,如果一个对象为 key 时,hashCode 和 equals 方法的用法要注意什么?
- HashSet 和 HashMap 的区别是什么?
- HashMap 是线程安全的么?那需要线程安全需要用到什么?
阿里巴巴-Java后台开发面经
- ArrayList 和 LinkedList 的区别是什么?
- 有了解过 HashMap 的具体实现么?
- HashMap 和 ConcurrentHashMap 哪个效率更高?
今日头条-Java后台开发面经
- 编程题:判断一个链表是否是一个回文链表。
- Redis 的 zset 类型对应到 java 语言中大致是什么类型?
- hashCode 主要是用来做什么用的?
三、接口 interfaces
3.1、基本关系说明
-
Collection :用来存储管理一组对象 objects ,这些对象一般被成为元素 elements
-
Set : 元素不能重复,背后隐含着查找/搜索的语义
-
SortedSet : 一组有序的不能重复的元素
-
List : 线性结构
-
Queue : 队列
-
Deque : 双端队列
-
Map : 键值对 Key-Value-Pair ,背后隐含着查找/搜索的语义
-
SortedMap : 一组有序的键值对
3.2、Collection 接口说明
Collection 官方文档
3.3、Collection 常用方法说明
注意:
Collection是一个接口,不是一个类,所以不能的直接就去new。只能去new一个实现collection接口的类
接口是不能实例化的。
3.4、Collection代码示例
代码示例1:在集合里面添加元素
public static void main(String[] args) {
Collection<Integer> collection = new ArrayList<Integer>();
collection.add(123);
collection.add(100);
collection.add(200);
System.out.println(collection);
}
代码示例2:将集合中所有元素删除
public static void main(String[] args) {
Collection<Integer> collection = new ArrayList<Integer>();
collection.add(123);
collection.add(100);
collection.add(200);
System.out.println(collection);
collection.clear();
System.out.println(collection);
}
代码示例3:判断集合中是否有元素,有返回false,没有返回true
public static void main(String[] args) {
Collection<Integer> collection = new ArrayList<Integer>();
collection.add(123);
collection.add(100);
collection.add(200);
System.out.println(collection);
boolean bool = collection.isEmpty();
System.out.println(bool);
}
代码示例4:如果元素 e 出现在集合中,删除其中一个
public static void main(String[] args) {
Collection<Integer> collection = new ArrayList<Integer>();
collection.add(123);
collection.add(100);
collection.add(200);
System.out.println(collection);
collection.remove(100);
System.out.println(collection);
}
代码示例5:返回集合中的元素个数
public static void main(String[] args) {
Collection<Integer> collection = new ArrayList<Integer>();
collection.add(123);
collection.add(100);
collection.add(200);
System.out.println(collection);
int ret = collection.size();
System.out.println(ret);
}
代码示例6:返回一个装有所有集合中元素的数组
public static void main(String[] args) {
Collection<Integer> collection = new ArrayList<Integer>();
collection.add(123);
collection.add(100);
collection.add(200);
System.out.println(collection);
Object[] str = collection.toArray();
System.out.println(str);
System.out.println(Arrays.toString(str));
}
不建议将数组整体进行强制类型转换
如果我们将Object类型的数组强制转换成Sting类型的数组就会报错
但是如果我们将Sting类型的数组强制转换成Object类型的数组就不会报错
可以去看看在 Java 中创建泛型数组,这上面有详细的的说明
3.5、Map,接口说明
Map官方文档
3.6、Map 常用方法说明
代码示例7:将指定的k-v放入Map中
public static void main(String[] args) {
Map<Integer,String> map = new HashMap<>();
map.put(1,"aaa");
map.put(2,"bbb");
map.put(3,"ccc");
System.out.println(map);
}
代码示例8:根据指定的 k 查找对应的 v
public static void main(String[] args) {
Map<Integer,String> map = new HashMap<>();
map.put(1,"aaa");
map.put(2,"bbb");
map.put(3,"ccc");
System.out.println(map);
System.out.println("----------");
System.out.println(map.get(2));
}
代码示例9:根据指定的 k 查找对应的 v,没有找到用默认值代替
public static void main(String[] args) {
Map<Integer,String> map = new HashMap<>();
map.put(1,"aaa");
map.put(2,"bbb");
map.put(3,"ccc");
System.out.println(map);
System.out.println("----------");
System.out.println(map.getOrDefault(5,"默认值"));
}
代码示例10:将指定的 k-v 放入 Map
public static void main(String[] args) {
Map<Integer,String> map = new HashMap<>();
map.put(1,"aaa");
map.put(2,"bbb");
map.put(3,"ccc");
System.out.println(map);
System.out.println("----------");
map.put(8,"eeee");
map.put(4,"asddf");
System.out.println(map);
}
代码示例11:判断是否包含 key
public static void main(String[] args) {
Map<Integer,String> map = new HashMap<>();
map.put(1,"aaa");
map.put(2,"bbb");
map.put(3,"ccc");
System.out.println(map);
System.out.println("----------");
System.out.println(map.containsKey(4));
}
代码示例12:判断是否包含 value
public static void main(String[] args) {
Map<Integer,String> map = new HashMap<>();
map.put(1,"aaa");
map.put(2,"bbb");
map.put(3,"ccc");
System.out.println(map);
System.out.println("----------");
System.out.println(map.containsValue("hello"));
}
代码示例13:判断是否为空
public static void main(String[] args) {
Map<Integer,String> map = new HashMap<>();
map.put(1,"aaa");
map.put(2,"bbb");
map.put(3,"ccc");
System.out.println(map);
System.out.println("----------");
System.out.println(map.isEmpty());
}
代码示例14:返回键值对的数量
public static void main(String[] args) {
Map<Integer,String> map = new HashMap<>();
map.put(1,"aaa");
map.put(2,"bbb");
map.put(3,"ccc");
System.out.println(map);
System.out.println("----------");
System.out.println(map.size());
}
代码示例15:将所有键值对返回
public static void main(String[] args) {
Map<Integer,String> map = new HashMap<>();
map.put(1,"aaa");
map.put(2,"bbb");
map.put(3,"ccc");
System.out.println(map);
System.out.println("----------");
Set<Map.Entry<Integer, String>> entrySet = map.entrySet();
for (Map.Entry<Integer, String> entry: entrySet) {
System.out.println(entry);
}
}