一、集合是什么 ?

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。

二、用伪代码构建一个学校

伪代码展示


java 字典是什么类型 java中的字典是什么意思_java 字典类


1. 定义A班级学生


java 字典是什么类型 java中的字典是什么意思_java 字典_02


2. 定义A班级并添加学生


java 字典是什么类型 java中的字典是什么意思_java字典_03


3. 定义B班级学生


java 字典是什么类型 java中的字典是什么意思_List_04


4. 定义B班级并添加学生


java 字典是什么类型 java中的字典是什么意思_java 字典类_05


5. 定义学校并添加AB两个班级


java 字典是什么类型 java中的字典是什么意思_java 字典_06


三、集合实现类及常用API ?

Java 集合框架主要包括两种类型的容器,一种是集合(Collection),存储一个元素集合,另一种是Map,存储键/值对映射。


java 字典是什么类型 java中的字典是什么意思_java 字典_07


1. Collection

Collection 接口又有 3 种子类型,List、Set 和 Queue。其中List和Set是最长用的。Queue相对来说用的比较少,作为入门基本学习前两个已经够用了。

因为List和Set都是实现自Collection,所以List和Set的API是一样的,只要初学者记住Collection的常用方法和List和Set各个实现类的特点即可掌握。

List 和 Set 区别


java 字典是什么类型 java中的字典是什么意思_List_08


List实现类特点


java 字典是什么类型 java中的字典是什么意思_java 字典_09


Set实现类特点


java 字典是什么类型 java中的字典是什么意思_java 字典是什么类型_10


Collection常用API


java 字典是什么类型 java中的字典是什么意思_java 字典类_11


总结

  • 安全的不高效,高效的不安全。要根据使用环境确定使用哪一个。
  • 一般开发中List基本都是 ArrayList,而 Set 使用 HashSet。

2. Map


java 字典是什么类型 java中的字典是什么意思_java 字典_12


Map是一种特殊的集合容器,它的数据结构是key-value的形式,类似于字典。Map的主要作用就是作为字典使用,通过key来查询value比如上面的例子,就可以根据学生的名字,来找到学生具体所在的班级,我们对Map的学习主要学习其各个实现类的特点和常用API即可


java 字典是什么类型 java中的字典是什么意思_List_13


实现类特点


java 字典是什么类型 java中的字典是什么意思_java字典_14


Map集合常用API


java 字典是什么类型 java中的字典是什么意思_java 字典类_15


四、 Java集合进阶知识点

1.Map高级

这里所说的高级,基本就是面试时候,面试官会经常考的知识点。

  • ①线程安全
  • ②哈希碰撞
  • ③加载因子
  • ④为什么ConcurrentHashMap效率高并安全

① 线程安全

HashTable 是线程安全的,因为它的所有方法都被 synchronized修饰,所以安全,但是效率相对是低于 HashMap 的。 HashMap 虽然是线程不安全但是效率比较高。小编建议如果在不涉及多线程操作的情况下,建议使用HashMap。 那么什么情况是不涉及多线程呢? 最简单的场景就是在只需要在方法中使用的时候可以用HashMap。但是凡事要作为对象的实例变量的情况下,一定就不能使用HashMap。因为它线程不安全。建议使用ConcurrentHashMap

②哈希碰撞

什么是哈希碰撞,前面说了凡事Hash开头的Map实现类,底层都是使用Hash来实现的,即将Key通过hash算法得到一个位置,然后在该位置上存储value。但是假如key1和key2通过算法得到的位置是一样的,即说明出现了hash碰撞的场景。那么如何避免哈希膨胀呢? 答案就是扩容,默认当HashMap中的键值对达到数组大小的75%时,即会触发扩容。通过扩容的方式来避免哈希碰撞

③加载因子


java 字典是什么类型 java中的字典是什么意思_List_16


前面说哈希碰撞时候,解决方案就是扩容,那么如何知道要扩容呢? 默认当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


java 字典是什么类型 java中的字典是什么意思_java 字典是什么类型_17


2. Map作为字典使用

根据Map的key和value的数据结构,可以将key设置成查询条件,然后找到对应的value。


java 字典是什么类型 java中的字典是什么意思_java 字典_18