散列表、泛型

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  自定义泛型

 

 5、例题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值