1.查漏补缺
- 排序
- 如果 添加的元素的类 是我们写的
我们应该使用 Comparable , 因为对扩展开发,
其他人还可以使用 Comparator, 实现新的排序功能因为(Comparator优先级高)
- 如果 添加的元素的类 不是我们写的
- 该类有排序(实现了Comparable) 比如Integer,但是 默认排序结果不是我们想要的,那么我们可以使用Comparator进行调整排序,因为优先级高
- 如果该类没有实现排序(没有实现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>();