Day-18 散列表、泛型

1.Set

1.1 HashSet使用
常用的方法操作

        set.add(1);
    	 set.add("asdha");
    	 set.remove("asdha");
    	 System.out.println(set.size());
    	 set.isEmpty();
    	 for(Object object:set){
    		 
    	 }这里插入代码片

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中 没有散列表的概念,把散链表封装为了HashMao和HashTable

2.2HashSet
当我们使用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可重复
HashMap:底层是散列表
TreeMap:底层是红黑树,元素必须按照一定的规则进行排序
映射关系:比如商品和购买数量,或者数据统计
“ajdajsodadkada;dlka’”统计每个字符出现的个数,使用HashMap进行存储,字符做K,次数做V

3.2HashMap

常用操作

//创建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","222");
    	//支持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.3 TreeMap
特性:TreeMap 保存的元素会按照一定规则进行排序,底层是红黑树

4.泛型
4.1概述
泛型:在编译过程中,检测数据类型是否匹配
泛型:必须是引用类型,不能使用基本类型
优点:统一了数据类型,减少了类型转换
缺点:只能保存同一种类型
4.2使用方式

// 没有使用泛型
    		List list = new ArrayList();
    		// 什么也能放
    		list.add(new A());
    		list.add(1);
    		// 取的时候,拿到的是Object
    		for (Object object : list) {
    			// 使用需要进行判断和向下转型才行
    			if (object instanceof A) {
    				A a = (A) object;
    				a.m1();
    			}
    		}
    		
    		// 使用泛型 规定 该集合中 只能保存A类型
    		List<A> list2 = new ArrayList<A>();
    		list2.add(new A());
    		// 添加其他的 报错,而且是编译报错
    		// list2.add(2);
    		
    		// 使用的时候,拿到的就直接是A类型,不会出现类型转换异常
    		// 因为只要能运行,里面一定是A
    		for (A a : list2) {
    			a.m1();
    		}
    		
    		// 泛型 不能写基本类型,只能写引用类型
    		// 如果想要保存基本类型,则需要编写对应的包装类类型
    		// List<int> list3 = new ArrayList<int>();
    		List<Integer> list4 = new ArrayList<Integer>();
    		
    		// 如果 需要保存多种数据,则不需要使用泛型
    		// 但是如果需要保存同一种类型的数据,则一定要使用泛型,这样方便操作
    		
    		// set和map使用泛型
    		Set<String> set = new HashSet<String>();
    		Map<String, Integer> map = new HashMap<String, Integer>();
    	}
    }
    class A {
    	public void m1(){
    		System.out.println("m1执行了");
    	}

4.3自定义泛型
定义泛型,使用大写字母A-Z表示,些什么都一样,都只是占位符而已,只不过某些字符也有一些特殊的含义
E:element 一般代表元素,而集合中的数据 我们叫元素,所以在集合中出现的泛型一般使用E表示
K:key表示键
V:value表示值 K和V一般在散列表中出现(Map)
T:Type表示一个java类型
N:表示Number
?:表示不确定的类型
*如果规定了泛型,但是使用的地方没有指定泛型,则默认为Object类型
5.面试题
题目
在这里插入图片描述
答案
在这里插入图片描述

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值