集合分为单列集合(Collection)和双列集合(Map),先说单列集合Collection
Collection单列集合顶层接口
------List子接口(下面有3个实现类)有序,元素可重复
-----------ArrayList:底层是数组结构,线程不安全,效率高,查询快,增删慢
根据下标查询不需要比较,查询方式为,首地址+(元素长度*下标),基于这个位置读取相应的字节数就可以了,所以非常快;增删会带来元素的移动,增加数据会向后移动,删除数据会向前移动,所以影响效率。
-----------Vector:底层是数组结构,线程安全,效率低,查询快,增删慢(被ArrayList替代)
-----------LinkedList:底层是链表结构,线程不安全,效率高,查询慢,增删快
linkedlist是链表结构,增删就直接在对应位置断开链表,然后在对应链表设置新元素的前后节点即可----------Set子接口(有3个实现类)无序,元素不可重复
-----------HashSet:底层数据结构是哈希表,线程不安全,哈希表依赖两个方法hashCode()和equals()
执行顺序:
首先判断HashCode()值是否相同
是:继续执行equals()看其返回值
是true:说明元素重复,不添加
是false:就直接添加到集合
否:就直接添加到集合
最终:自动生成hashCode()和equals()方法
----------LinkHashSet
底层数据结构由链表和哈希表组成
由链表保证元素有序
由哈希表保证元素唯一
-----------TreeSet
底层数据结构是红黑树(是一种自平衡的二叉树)
如何保证元素唯一性?
根据比较的返回值是否是0来决定
如何保证元素的排序?
两种方式
自然排序(元素具备比较性)让元素所属的类实现Comparable接口
比较器排序(集合具备比较性)让集合接收一个Comparator的实现类对象
步骤:
首先比较哈希值
如果相同,继续走,比较地址值或者走equals()
如果不同,就直接添加到集合中
常用方法:
add 增加
contains 判断是否存在
get 获取指定位置的对象
indexOf 获取对象所处的位置
remove 删除
set 替换
size 获取大小
toArray 转换为数组
addAll 把另一个容器所有对象都加进来
clear 清空
泛型:
不指定泛型的集合,可以存放任何类型的元素
指定了泛型的集合,只能存放指定类型的元素以及其子类
单列集合的遍历:
1、迭代器遍历
2、普通for循环
3、增强for循环
双列集合:
Map:双列集合的顶层接口
将键映射到值的对象,一个映射不能包含重复的键;每个键最多只能映射到一个值
Map集合和Collection集合的区别:
Map集合存储元素是成对出现的,Map集合的键是唯一的,值是可重复的。
Collection集合存储元素是单独出现的,Collection的子接口Set是唯一的,List是可重复的
注意:
Map集合的数据结构值针对键有效,跟值无关
Collection集合的数据结构是针对元素有效
集合和数组的区别?
数组的长度是固定不变的,集合的长度是可变的
数组可以存放任意类型,集合不能存放基本数据类型
HashMap:线程不安全,效率高
底层数据结构是哈希表
哈希表依赖两个方法hashCode()和equals()
执行顺序:
首先判断HashCode()值是否相同
是:继续执行equals()看其返回值
是true:说明元素重复,不添加
是false:就直接添加到集合
否:就直接添加到集合
最终:自动生成hashCode()和equals()方法
Hashtable:线程安全,效率低
底层数据结构是哈希表
哈希表依赖两个方法hashCode()和equals()
执行顺序:
首先判断HashCode()值是否相同
是:继续执行equals()看其返回值
是true:说明元素重复,不添加
是false:就直接添加到集合
否:就直接添加到集合
最终:自动生成hashCode()和equals()方法
TreeMap
底层数据结构是红黑树(是一种自平衡的二叉树)
如何保证元素唯一性?
根据比较的返回值是否是0来决定
如何保证元素的排序?
两种方式
自然排序(元素具备比较性)
让元素所属的类实现Comparable接口
比较器排序(集合具备比较性)
让集合接收一个Comparator的实现类对象
双列集合遍历方式:
1、根据键找值keySet
2、根据键值对entrySet
3、values()方法
经典面试题
1、HashMap和Hashtable的区别
HashMap:线程不安全,效率高,允许null键和null值
Hashtable:线程安全,效率低,不允许null键和null值
2、List,Set,Map等接口是否都继承自Map接口?
List,Set不是继承自Map接口,继承自Collection接口
Map接口本身就是一个顶层接口
3、Collection和Collections的区别?
Collection:是单列集合的顶层接口,有子接口List和Set
Collections:是针对集合操作的工具类,有对集合进行排序和二分查找的方法