JavaEE_day_18_比较器、Map、散列

1.查漏补缺

  1. 排序
  • 如果 添加的元素的类 是我们写的

我们应该使用 Comparable , 因为对扩展开发,
其他人还可以使用 Comparator, 实现新的排序功能因为(Comparator优先级高)

  • 如果 添加的元素的类 不是我们写的
  1. 该类有排序(实现了Comparable) 比如Integer,但是 默认排序结果不是我们想要的,那么我们可以使用Comparator进行调整排序,因为优先级高
  2. 如果该类没有实现排序(没有实现Comparable), 这时候我们需要使用Comparator进行排序,因为我们不可能去改变人家类的源码
//匿名内部类
  TreeSet tr = new TreeSet(new Comparator(){
   @Override
   public int compare(Object o1, Object o2) {
    Integer i1 = (Integer)o1;
    Integer i2 = (Integer)o2;
    return i1-i2;
   }
  });

总结:
hashmap和hashset不能自定义排序

如果有排序需求则用treemap和treeset实现comparable排序或comparator排序
list集合用Collections.sort()排序,实现comparator匿名内部类即可

1.5散列表

3 添加过程

  • 1 使用添加的键值对中的key,调用key的hashCode方法,生成hash值,进行hash算法得到数组下标
    ,判断该下标上是否有元素,如果没有,把该键值对 保存到该数组中即可
  • 2 如果该数组中有对象,则调用key的equals方法和数组中的元素进行比较,如果相等则key不添加,value值覆盖
  • 3 如果不相等,就把该 对象的 添加到已有元素的next属性,形成链表
  • 4 如果添加的时候 就已经是链表了,则需要用key和链表中所有的元素key进行比较是否相等

因为散列表中 需要使用hashCode和equals来表示对象的唯一性
所以 在进行添加自定义类型的时候,需要考虑 按需求重新hashCode和equals方法

//重写的hashCode方法可以确定按照什么去hash去形成数组下标
//重写的equals方法可以判断哪个key属性重复,此方法中时按照no标准判断no是否重复,
//若换成name也可以判断name值是否重复

//重写的hashCode方法可以确定按照什么去hash去形成数组下标
 @Override
 public int hashCode() {
  System.out.println("hashCode执行了");
  return no.hashCode();
 }
 //重写的equals方法可以判断哪个key属性重复,此方法中时按照no标准判断no是否重复,
 //若换成name也可以判断name值是否重复
 @Override
 public boolean equals(Object obj) {
  System.out.println("equals执行了");
  if (this == obj) {
   return true;
  }
  if (obj instanceof Employee) {
   Employee e = (Employee) obj;
   if (no.equals(e.no)) {
    return true;
   }
  }
  return false;
 }

2.HashSet(无序不重复)

若有重复先入为主,后来的无视掉

因为散列表中 需要使用hashCode和equals来表示对象的唯一性

所以 在进行添加自定义类型的时候,需要考虑 按需求重新hashCode和equals方法

3.Map

无序可重复,value可重复, key不可重复
key的不重复遵循后来居上,后来的覆盖先前

//一些方法
put(key,value);
size();
clear();
isEmpty();
get(key);//根据key获取value
values();//获取所有的value值,返回集合collection
//遍历方法
set keySet();//获取map中的所有key,以set返回
Set entrySet();//返回键值对映射, 返回set
remove(key);//根据key返回value

在这里插入图片描述

4.HashMap

  • 底层实现 = 链表 + 数组 = (散列表)
  • 存入:先调用key的地址进行hashcode得到哈希值,通过哈希算法找到对应的数组下标, 存入对应链表中

支持key和vaule都为null,并且只能有一个key为null

5.Properties

  • 特殊的Map : 强制规定键和值都必须是字符串

6.SortedMap

  • SortedMap是接口,子实现了是TreeMap,元素必须有序,会按照某个规定进行排序

实现排序的原因 :

  • 1 被添加的元素,实现了Comparable接口

  • 2 按照需求,编写一个比较器类,该比较器类必须实现Comparator接口

7.泛型

  • 引入泛型之后,我们可以指定存储的类型,那么编译器在编译阶段,就会检查添加的数据的类型是否匹配,不匹配就报错

  • 泛型只能是引用数据局类型,不能是基本数据类型

泛型原理

  • 存入时为object类
  • 取出时强制类型转换map中只能让key进行排序,不能让value进行排序(因为get方法比较的是key的值)

8.自定义泛型

// T就相当于是个标签,占位符
// 就是这里需要客户端传递一个类型,用传递的类型替换这个T
// 如果你不传,默认是Object
class MyClass<T> {
 public void m1(T t) {
  System.out.println(t);
 }
}

MyClass<String> class1 = new MyClass<String>();
  // 只能传递String
  // class1.m1(213);
  class1.m1("asdasd");
  
// map需要指定两个 KV
  Map<String, Integer> xxx = new HashMap<String, Integer>();
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值