1 Set
1.1 HashSet使用
2、散列表
2.1 概述
*散列表结构 可以理解为 数组中保存的是联邦的首节点,用来保存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。所以在保存自定义类型的时候,需要注意方法覆写
* 再1.8中有个新改动,为了提高查询效率,引入了红黑树和扩容的优化
* 因为链表再查询效率性能上较差 所以每个数组中的链表个数如果大于等于7,则会把该链表转换为红黑树
* 数组默认初始化容量为16
*
在Java中没有散列表的概念,把散列表封装为了HashMap和HashTable
2.2 HsahSet
当我们使用HashSet的时候,其实就等于是再使用HashMap
添加数据的时候,虽然调用的是HashSet的add方法,但是本质还是调用map的put方法
Ps : 在map中,put是添加操作
而 map中 需要保存的是k和v映射关系,所以在set中有一个变量保存了value的值
所以我们再进行set添加的时候,只操作了map中的key,value值我们不再关心
3 Map
3.1 概述
map是无序的,并且保存到是k-v的键值对映射关系,其中K不能重复,V可重复
HsahMap:底层是散列表
TreeMap :底层是红黑树 必须按照一定的规则进行排序
映射关系:比如 商品 和购买数量 或者数据统计
3.2 继承体系
3.3 使用方法
3.4 HashMap
// 创建map
HashMap map = new HashMap();
// 添加 K-V
map.put("A", "one");
map.put("B", "two");
map.put("C", "three");
map.put(65,100);
map.put('A', "2222");
// key重复,不添加,value替换
map.put("A", "2222");
// 支持K和V都null,但是没有意义
map.put(null,null);
// 个数
System.out.println(map.size());
// get : 根据K 获取 V的值
System.out.println(map.get("A"));
// 判断是否包含某个key
System.out.println(map.containsKey(65));
// 判断是否包含某个value
System.out.println(map.containsValue("one"));
// 根据key删除 该映射关系,返回对应的value值
map.remove(65);
// 获取所有的value,并放到集合中返回
Collection values = map.values();
for (Object object : values) {
System.out.println(object);
}
System.out.println("======");
// keySet : 获取所有的key,封装到set对象中并返回
Set keys = map.keySet();
for (Object object : keys) {
System.out.println(object +":"+map.get(object));
}
// 把map转换为set
// Entry类中,保存了K和V两个变量,把map中的k和v转换为entry类的对象进行存储
// 所以我们只需要保存entry对象,就等于保存了k和v
Set set = map.entrySet();
for (Object object : set) {
// C=three
System.out.println(object);
// 转换为entry类型
Entry entry = (Entry) object;
// 获取k和v
System.out.println(entry.getKey()+" : "+entry.getValue());
}
3.5 TreeMap
4 泛型
4.1 概述
4.2 使用方式
4..3 注意
泛型不能写基本类型 只能写引用类型
如果想要保存基本类型,则需要编写对应的包装类类型
4.4 自定义泛型