集合
集合介绍
集合,集合是java中提供的一种容器,用来存储多个数据,之所以能存储基本类型,是自动装箱
Collection接口有两个子接口
List和Set
List
LIst接口有两个实现类
ArrayList
LInkedList
Set
Set接口有两个实现类
HashSet
LinkedHashSet
Collection
Collection接口概述
Collection的方法是集合中所有实现类必须拥有的方法,方法参数类型是Object是因为可以存储任何类型,不知道你存什么类型,所以就是Object。
方法
clear() 清空所有元素
contains() 判断参数是否存在
isEmpty() 判断是否包含
toArray() 集合转数组,返回存储对象的数组,数据类型是Object
Iterator
迭代器
常用方法()
hasNext() 判断是否元元素可以迭代
next() 返回迭代的下一个元素
remove() 删除某个元素
泛型
因为集合什么类型都可以存,取出时类型异常,所以使用泛型规定它的类型。
java泛型是伪泛型,编译后class文件没有泛型
带有泛型的接口
实现接口,指定类型
创建对象时,指定泛型类型
存储结构
数据的存储结构
栈结构,后进先出/先进后出/手枪弹夹
队列结构,先进先出/后进后出/银行排队
数组结构
查询快,根据索引 增删慢,需要开新数组
链表结构
查询慢,每次需要链头或者链尾找起
增删块,修改元素记录的下个元素的地址,不需要移动大量元素
LIst接口
ArrayList实现类
特点
底层可变数组,可重复,有序集合,有索引
方法
add() 添加
addAll() 添加全部
clear() 移除所有元素
clone() 返回此ArrayList实例的浅表副本
contains() 如果列表包含指定元素,返回true
get() 取值
indexOf() 返回元素索引
isEmpty() 判断是否存在
remove() 移除某个元素,参数可以为元素可以为下标
LinkedLIst实现类
特点
底层双向链表,查询慢,增删块
方法
removeFirst() 删除头
removeLast() 删除尾
getFirst() 获取头
getLast() 获取尾
isEmpty() 判断是否存在
Vector类
特点’
数组结构,线程安全
Vector已经被ArrayList取代,枚举迭代已经被Iterator取代
Set接口
特点
哈希表,不包含重复元素,无需,取值迭代器增强for
哈希表
单项链表数组结合体,桶结构
哈希值不确定,使用hashCode()方法取得,每个对象都有哈希值,哈希值是存储set的依据
String类
哈希存储String类,元素不能重复
String继承Object类,重写了hashCode()方法,计算方式31*0*字符串分解成char[]数组
存储对象
对象可以 重复,
如果哈希值一样,equals不一定是true,自己可以重写方法
如果equals是true,哈希值必须一样,jdk规定
哈希存储结构
先获取元素的哈希值hashCode(),集合会在容器内搜索是否有相同的哈希值,没有则存储
如果哈希值相同则调用equals()方法
HashSet实现类
特点
存储取出都比较快,线程不安全
哈希算法,初始容量16,无索引,无序,不允许重复,存取不一致
String不重复,对象可以重复
对象存储哈希表,去掉重复元素,依据对象自己的HashCode,equals
重写目标,让对象中属性值相同,如果相同的哈希值(hashCode获取hash值*31+age),则equals重写比较地址是否相同,在把对象强转成Object,然后调他的属性equals比较是否相同,hashset的add/contains等方法判断元素是否重复原理
LinkedHashSet
特点
继承HashSet,基于链表的哈希表实现,双向链表
存储有序,线程不安全,不允许重复
treeSet
特点
底层二叉树算法,保证元素为以,对元素进行排序,Integer类型自动排序
排序根据compareto方法的返回值,比较器是按照字母顺序排序
参数时对象就实现接口Comparable
重写方法Comparaeto()
0不存,1整数存右边,负数存左边,二叉树
Map
HashMap
特点
相同的键,值覆盖
方法
put() 添加
get() 根据键取值
entryset() 返回map集合中所有的键值对
keySet() 获取所有键的集合
entry是map的一个内部接口,里面封装了key和value,我们把一个个entry对象封装到Set中去遍历,这就是entrySet(),迭代Set集合的元素
遍历方式三种
LinkedHashMap
存储有序
treeMap
重写方法compareto,本身方法会去除同样的值
0不存,1正数存右边,负数存左边,二叉树
静态导入
import static java.lang.System.out;
import static java.util.Arrays.sort;
可变参数
前提,方法参数类型确定,个数可变,一个方法只有一个可变参
如果有多个参数,可变参必须在最后一位
嵌套集合遍历
keyset方式
enterySet方式
Collection类
sort()自动排序方法,重复保留,只能给ArrayList排序
BinarySearch(集合,“要寻找的字符”);二分查找法
max() 最大值
min() 最小值
reverse() 反转集合
shuffle() 随机置换,可以用来洗牌
匿名内部类
TreeSet的compareto()方法
Comparator内部类里重写compareto方法
Comparator实现接口
面试
list 有序有索引可以重复
Arraylist
查找快,增删慢,线程不安全,底层是数组
Linkedlist
增删快,查询慢,线程不安全,底层是双向链表
Vector
增删改查都慢,线程安全,底层数组实现
如果查找和修改多,用ArrayList
如果增删多,用LinkedList
如果都多,用Vector
set 无序没有索引不可重复
hashset
底层哈希算法,重写hascode和equals方法不重复
Linkedhashset
底层链表,不可重复,和Hashset一样,保持元素唯一
TreeSet
底层二叉树,
一般在开发的时候,不需要对元素排序,所以大多数用HashSet
HashSet效率高
TreeSet面试多,几种排序方式和他们的区别
map
hashMap 替代了hashtable
底层哈希算法,针对键
LikendHashMap
底层链表,针对键
TreeMap
底层二叉树,针对键
自动排序
LinekdhashMap
怎么存怎么取
喜欢的小伙伴点下关注=。=!