一、集合是什么 ?
1. 集合知识概念
前面我们学习过了,Java中的基本类型,任何单一的数据都可以用基本类型来表达,这些单一的基本类型被统一的组合或者管理起来的就是集合,或者叫容器也可以。
举例:
我们用数据来表示一个学校的存在。首先我们先来分析一波,学校的组成。
- 学校的组成 = 班级的集合
- 班级 = 学生的集合
前面我们说了,单一的数据类型都可以用基本类型来表示。那么我们用 String 类型来表示学生的名字。
A班一共有3个学生(小明,小红,小张)。那么小明等人就可以用基本类型来表示,而A班就可以用集合来表示。 S学校一共有2个班级(A,B)。 因为A和B都是学生的集合,所以A、B都是集合。而S学校同样是A、B的集合。
2. Java中的具体体现
集合类存放于 java.util 包中集合类型主要有3种:list (列表)、set (集)、和 map (映射)。
后面会详细讲解
list 集合允许出现重复的元素Set 集合中元素不能是重复的map 是一个特殊集合容器,是有key-value组成的,我们也可以叫字典。因为它跟字典一样,可以根据key,来找到对应的数据value。
二、用伪代码构建一个学校
伪代码展示
1. 定义A班级学生
2. 定义A班级并添加学生
3. 定义B班级学生
4. 定义B班级并添加学生
5. 定义学校并添加AB两个班级
三、集合实现类及常用API ?
Java 集合框架主要包括两种类型的容器,一种是集合(Collection),存储一个元素集合,另一种是Map,存储键/值对映射。
1. Collection
Collection 接口又有 3 种子类型,List、Set 和 Queue。其中List和Set是最长用的。Queue相对来说用的比较少,作为入门基本学习前两个已经够用了。
因为List和Set都是实现自Collection,所以List和Set的API是一样的,只要初学者记住Collection的常用方法和List和Set各个实现类的特点即可掌握。
List 和 Set 区别
List实现类特点
Set实现类特点
Collection常用API
总结
- 安全的不高效,高效的不安全。要根据使用环境确定使用哪一个。
- 一般开发中List基本都是 ArrayList,而 Set 使用 HashSet。
2. Map
Map是一种特殊的集合容器,它的数据结构是key-value的形式,类似于字典。Map的主要作用就是作为字典使用,通过key来查询value比如上面的例子,就可以根据学生的名字,来找到学生具体所在的班级,我们对Map的学习主要学习其各个实现类的特点和常用API即可
实现类特点
Map集合常用API
四、 Java集合进阶知识点
1.Map高级
这里所说的高级,基本就是面试时候,面试官会经常考的知识点。
- ①线程安全
- ②哈希碰撞
- ③加载因子
- ④为什么ConcurrentHashMap效率高并安全
① 线程安全
HashTable 是线程安全的,因为它的所有方法都被 synchronized修饰,所以安全,但是效率相对是低于 HashMap 的。 HashMap 虽然是线程不安全但是效率比较高。小编建议如果在不涉及多线程操作的情况下,建议使用HashMap。 那么什么情况是不涉及多线程呢? 最简单的场景就是在只需要在方法中使用的时候可以用HashMap。但是凡事要作为对象的实例变量的情况下,一定就不能使用HashMap。因为它线程不安全。建议使用ConcurrentHashMap
②哈希碰撞
什么是哈希碰撞,前面说了凡事Hash开头的Map实现类,底层都是使用Hash来实现的,即将Key通过hash算法得到一个位置,然后在该位置上存储value。但是假如key1和key2通过算法得到的位置是一样的,即说明出现了hash碰撞的场景。那么如何避免哈希膨胀呢? 答案就是扩容,默认当HashMap中的键值对达到数组大小的75%时,即会触发扩容。通过扩容的方式来避免哈希碰撞
③加载因子
前面说哈希碰撞时候,解决方案就是扩容,那么如何知道要扩容呢? 默认当Hash达到75%时候就扩容,这个75%就叫做加载因子。
④为什么ConcurrentHashMap效率高并安全
Hashtable的synchronized是针对整张Hash表的,即每次锁住整张表让线程独占,ConcurrentHashMap允许多个修改操作并发进行,其关键在于使用了锁分离技术。通过把整个Map分为N个Segment,可以提供相同的线程安全,但是效率提升N倍,默认提升16倍。(读操作不加锁,由于HashEntry的value变量是 volatile的,也能保证读取到最新的值。)
面试时候可以简单回答: 每一个Segment相当于HashTable,假如Map分成了N个分段,一般情况如果并发的数量小于N都不会出现锁阻断情况,但是当并发数大于N时候,同样会有性能为题,ConcurrentHashMap相当于HashTable和HashMap的一个这种方案。
五、哪些场景需要使用到集合 ?
作为初学者,往往不知道学习的这些东西,到底有什么用处。在此小编简单描述下。
1. 需要批量操作使用List
2. Map作为字典使用
根据Map的key和value的数据结构,可以将key设置成查询条件,然后找到对应的value。