集合/容器的知识

集合
存储多个数据
存储任意引用类型数据
集合的长度可变,可以根据需求动态的增删数据,长度随之改变
数组
存储多个数据
一段连续的内存空间
特点
引用数据类型
定长,长度一旦确定不可改变
存储数据的类型相同
有序,有索引
简单封装容器类型(ArrayList)
MyContainer 只能存储字符串数据 String[] elementData;
容器中的接口层次结构
Collection
单个值的集合
Set 无序,不可重复,去重
无序
存放的顺序与内部真实存储的顺序不一致
去重
集合不包含元素对e1和e2 ,使得e1.equals(e2)和最多一个null元素
返回包含任意数量元素的不可修改集
遍历方式
foreach
iterator迭代器
List 有序可重复,有索引
有序集合(也称为序列 )
该接口的用户可以精确控制列表中每个元素的插入位置
新增
一些列根据索引操作的方法
遍历方式
for普通for循环
for(int i=0;i<list.size();i++){
System.out.println(list.get(i));
}
foreach 增强for循环
iterator迭代器
Collection 集合层次结构中的根接口
遍历方法
foreach
for(Object obj:collection){
System.out.println(obj);
}
iterator迭代器
1)获取迭代器实例,用来遍历指定的集合
Iterator iterator() 返回此集合中元素的迭代器。
Iterator it = collection.iterator();
2)判断是否存在下一个数据
while(it.hasNext()){
3)获取下一个数据
System.out.println(it.next());
}
TreeSet
底层结构
红黑树
底层是由TreeMap维护的
特点
查询效率较高,自动把数据做升序排序
遍历方式
foreach
iterator迭代器
TreeSet需要存储相同类型的数据,因为会默认存在比较排序
TreeSet存储javabean类型的数据
去重与排序
都是根据比较规则实现的,与equals没有关系
比较规则
内部比较器|内部比较规则|自然排序
比较规则定义在javabean类型的内部
javabean类型实现Comparable接口,重写compareTo(T o)方法,在方法中定义比较规则
类实现了Comparable接口,然后重写了compareTo方法
简单点说就是把比较器写在类的内部
public compareTo(T o); 
1)如果此对象(调用比较器方法的对象)大于指定对象(目标比较对象),返回正整数   
2)如果此对象小于指定对象,返回负整数   
3)如果此对象等于指定对象,返回零
外部比较器|外部比较规则|定制排序
简单点说就是把比较器写在类的外边
定义一个实现类,这个类必须实现Comparator接口,重写compare方法,,调用compare方法做两个数据的比较
调用compare方法做两个数据的比较
compare(t1,t2)
返回值:
=0 t1==t2
<0 t10 t1>t2
根据返回值的类型确实是升序还是降序
匿名内部类
简化没有类自己作用的实现类
Lambda
简化匿名内部类对象,要求必须为函数式接口才能简化
lambda表达式作为实参传递 -> 可以把行为作为参数传递
HashSet
底层结构
哈希表(数组+链表+红黑树)
特点
查询,增删效率高 ,去重,无序
底层是由HashMap维护的
遍历
foreach
iterator迭代器
去重
数据的类型要求重写hashCode与equals方法
Map
键值对的集合(KEY-VALUE)
无序的,去重的
键值对数据的集合
键值对->映射关系
价值对: K-V
K键
无序的,去重的|唯一的
Set
V值
无序的,可重复
Collection
K-V可以为任意引用数据类型
特点
一个key只能对应一个Value
key相同value覆盖
遍历方式
values 获取所有键值对的值
Collection values() 返回此映射中包含的值的Collection视图
keySet 获取所有键值对的key,根据key获取value
Set keySet() 返回此映射中包含的键的Set视图
entrySet 获取所有的键值对,每一个键值对都是一个Entry类型->表示一个键值对
Set<Map.Entry<K,V>> entrySet() 返回此映射中包含的映射的Set视图
TreeMap
底层
红黑树
存储键值对类型的数据,自动升序排序,去重的
去重,排序
根据键值对的key实现,与value本身无关
TreeSet底层是TreeMap
去重|排序
根据key的类型的比较规则
key的数据类型实现内部比较器,传递外部比较规则
HashMap
基于哈希表的Map接口的实现
HashSet 底层是由HashMap
底层结构
哈希表(数组+链表+红黑树)
哈希表
数组
节点数组Node[]
要求数组的长度为2的整数次幂
每个索引位置存储的为一个单向链表的首节点(尾插法)
当链表的长度>8,数组的长度>64,会把链表优化成为红黑树
当链表的长度>8,但是数组的长度不大于64,这时候会实现扩容(数组的扩容)
初始容量
哈希表中的数组默认的初始长度 16
加载因子
0.75 一般不建议改变
扩容阀值 threshold
扩容的临界值 数据的个数size>数组的长度*加载因子 就会扩容
扩容机制
原容量的2倍
HashMap的哈希表存储数据的过程
根据key计算哈希值
通过key的hashCode方法的返回值进一步进行hash算法的运算,得到的整数
调用putVal方法实现添加数据(hash,key,value)
1)判断是否是第一次调用put方法做添加 if ((tab = table) == null || (n = tab.length) == 0)
如果是第一次添加,直接调用resize()实现扩容
2)计算位桶的索引 int index = (n - 1) & hash
3)判断哈希表结构的数组table[index]是否存在数据,
如果不存在数据,证明没有头节点,创建新节点,放入当前数组的对应索引位置作为头节点
size数据的个数+1,判断是否>扩容的阀值,如果大于需要调用resize方法进行扩容,如果不大于,不需要扩容直接返回null
if (++size > threshold) resize();
return null;
如果存在数据,作为链表的头结点,遍历这个链表,拿到每一个节点的key与hash值判断是否与要添加的key和hash相同,如果相同,value覆盖
if (e.hash == hash && ((k = e.key) == key || (key != null && key.equals(k))))
value覆盖之后,返回被覆盖的value
V oldValue = e.value;
e.value = value;
return oldValue;
去重
根据key做去重,要求key的数据类型重写hashCode与equals方法
测试
定义HashMap存储数据,要求key为javabean,实现去重与测试
Hashtable 与 HashMap之间的区别
共同点
都是Map接口的实现类,底层结构都是哈希表
异同点
继承体系不同
线程是否安全不同
HashMap 线程不安全|不同步
Hashtable 线程安全的|同步的
扩容机制不同
HashMap扩容机制
每次扩容原容量的2倍
Hashtable扩容机制
原容量的2倍+1
键值对数据null值的要求不同
HashMap 可以存储null值的key与value
Hashtable key与value都不为null
计算hash值与位桶索引index的算法不同
如何处理HashMap线程不安全问题
使用Hashtable
使用Collections工具类中static <K,V> Map<K,V> synchronizedMap(Map<K,V> m) 返回由指定映射支持的同步(线程安全)映射。
juc高级并发编程包 ConcurrentHashMap<K,V>-> 线程安全的哈希表
泛型
作用
参数化类型
数据类型作为参数传递
只能配置引用数据类型
定义泛型
泛型的行为发生在编译期间,运行期间发型配置的所有内容无效,泛型擦除
要求先定义泛型,才能使用泛型
泛型类
类型的后面定义泛型,在使用类型的时候可以通过泛型传递具体的类型,类中可以进行使用
泛型方法
优点
代码简单简洁
增强程序健壮性,避免类型转换异常的出现
增强稳定性与可读性
ArrayList
有序,可重复的
实现所有可选列表操作,并允许所有元素,包括null
底层结构
数组
特点
根据索引查询遍历效率较高,增删效率低
应用场景
适合应用在大量做查询,少量做增删的位置
扩容问题
初始容量
默认初始容量为10
扩容机制
每次扩容原容量的1.5倍
遍历
普通for
增强for
iterator迭代器
listIterator迭代器
Vector
底层结构
数组
特点
根据索引查询遍历效率较高,增删效率低
区别
Vector是同步的,线程安全
ArrayList不同步,线程不安全,相对效率较高
Vector每次扩容原容量的2倍
ArrayList每次扩容原容量的1.5倍,相对ArrayList更有利于节省内存
总结
如果不需要线程安全实现,建议使用ArrayList代替Vector
LinkedList
实现所有可选列表操作,并允许所有元素(包括null )
底层结构
双向链表
特点
查询效率低,增删效率高
应用场景
单个数据值的集合中,允许数据有序,且可重复,在大量做增删,少量做查询的时候时候适合使用链表
存储javabean类型数据时候,要求javabean类型重写equals方法,否则使用一些判断比较的方法时候回默认调用equals方法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值