1. Set
1.1 HashSet使用
add(); 添加
remove(); 删除
size(); 元素个数
isEmpty(); 判断是否为空
for(Object object:set){} 遍历
2.散列表
2.1概述
散列表(也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。
给定表M,存在函数f(key),对任意给定的关键字值key,代入函数后若能得到包含该关键字的记录在表中的地址,则称表M为哈希(Hash)表,函数f(key)为哈希(Hash) 函数。
散列表结构 可以理解为 数组中保存的是链表的首节点,用来保存k和v键值对操作
hash算法 : 是一种安全的加密机制,可以把不定长的数据转换为定长数据,并且不能保证其唯一性,又叫哈希冲突
在java中 指的就是hashCode方法
对一个对象生成多次hash值 , 值一定相同 , 多个对象也可能生成相同的hash值,叫哈希冲突
k不可重复 , v 可重复
添加过程 :
1 根据要添加的key,调用的它的hashCode方法,生成hash值
2 通过一定的算法,根据hash值生成数组的下标
3 判断该下标中,是否有数据,如果没有数据就把该键值对映射关系保存到数组中
4 如果该下标中,有数据,则调用key的equals方法,和对应的所有数据进行比较,如果不相等,则添加到链表的尾部即可
5 如果对应的链表中,通过equals方法比较的时候,发现了相同的数据,那么 key不再添加 ,但是value值会替换原来的value值
通过添加过程得知,会自动调用该对象的hashCode和equals,所以在保存自定义类型的时候,需要注意方法覆写
在java中 没有散列表的概念,把散列表封装为了HashMap和HashTable
2.2HashSet
使用HashSet的时候,其实就等于是再使用HashMap
添加数据的时候,虽然调用的是HashSet的add方法,但是本质还是调用map的put方法
而 map中 需要保存的是k和v映射关系,所以在set中有一个变量保存了value的值
所以再进行set添加的时候,只操作了map中的key,value值不用管
3. Map
Map是无序的,并且保存的是K-V键值对映射关系,其中K不能重复,V可重复
HashMap : 底层是散列表
TreeMap : 底层是红黑树,元素必须按照一定的规则进行排序
映射关系 : 比如 商品 和 购买数量 , 或者数据统计
3.2继承体系
3.3使用
map.put("A","one"); 添加
mao.put("B","two");
map.put("A","three"); key重复,不添加,value替换
map.put(null,nill); 支持V和K都是null,但是没意义
map.size(); 个数
map.get("B"); two 根据K获取V的值
map.containsKey(key); 判断是否包含key
map.containsValue(value); 判断是否包含value这个值
map.remove(key); 根据key删除对应的value
Collection values = map.values(); 获取所有的value,并放到集合中返回
Set keys = map.keySet();
for (Object object : keys){} 获取所有的key,封装到set对象中并返回
Set set = map.entrySet(); 把map转换为set,Entry类中,保存了K和V两个变量,把map中的k和v 转换为entry类的对象进行存储,保存entry对象,就等于保存了k和v
3.4TreeMap
TreeMap保存的元素会按照一定规则进行排序,底层是红黑树
4.泛型
4.1概述
在编译过程中检测数据类型是否匹配
泛型必须是引用类型,不能使用基本类型
优点:统一了数据类型,减少了类型转换
缺点:只能保存同一种类型
4.2使用方式
泛型不拿写基本类型,只能写引用类型,如果想要保存基本类型,则需要编写对应的包装类类型
List<A> list=new ArryList<A>(); 只能保存A类型
4.3自定义泛型
class MyClass<T>{} T是占位符
MyClss<String> x=new MyClss<String>(); 指定类型