一、比较器
1.内部比较器|自然排序:
实现java.lang.Comparable,重写 compareTo方法,在方法中自定义比较规则,默认的类型的比较规则
每次修改需要修改源码,不符合设计原则开闭原则 对修改关闭,对扩展开放
2.外部比较器|自定义比较器
实现接口java.util.Comparator<T>的接口,重写compare()方法,方法中自定义比较规则
int compare(T o1, T o2) 比较用来排序的两个参数
3.内部比较器和外部比较器的比较
内部比较器: 类实现Comparable接口,重写comparaTo() 方法
外部比较器: 规则定义在一个接口的实现类中重写的方法里面 Compatator接口 compare()方法
//主要程序
//默认升序
//Arrays.sort(p);
//static <T> void sort(T[] a, Comparator<? super T> c) 第二个参数中定义当前排序的比较规则
//实现接口java.util.Comparator<T>的接口,重写compare()方法,方法中自定义比较规则
/*Arrays.soprt(p,new Comparator(){
@Override
public int compare(Object o1, Object o2) {
return ((p)o2).getAge() - ((p)o1).getpAge();
}
});*/
//Lambda表达式,简化匿名内部p类p
//Arrays.sort(p,(Object o1, Object o2) ->((p)o1).getpAge() - ((p)o2).getAge());
二、Collection 接口
1.List接口
List接口,接上一篇
链接:https://blog.csdn.net/zhiruochujian1/article/details/102845045
2.Set接口
Set接口 无序不可重复
List接口 有序可重复
(1)HashSet
底层都是有HashMap维护
底层: 哈希表(hashtable)实现的(数组+链表+红黑树)
特点: 查询,增删效率高,但是无序,不可重复
推荐使用: 推荐使用HashSet
如果两个对象的hashcode()值相同,不一定是一个对象,需要进一步比较equals()
如果两个对象的hashcode()值不相同,肯定不是一个对象
自定义引用数据类型去重问题: 重写hashcode()和equals()方法,计算桶的位置时根据对象的内容计算而非地址
import java.util.HashSet;
import java.util.Set;
public class Demo01 {
public static void main(String[] args) {
Set<String> set=new HashSet();
//boolean add(E e) 如果此 set 中尚未包含指定元素,则添加指定元素
set.add("呵呵");
set.add("不好");
set.add("啦啦");
set.add("你好");
set.add("哈哈");
set.add("呵呵");
//数据存放的的顺序和添加的不一定一致,但是一旦确定不会改变,无序不可重复
System.out.println(set);
//boolean remove(Object o) 如果指定元素存在于此 set 中,则将其移除
set.remove("不好");
System.out.println(set);
}
}
(2)TreeSet
TreeSet 底层是由TreeMap维护
底层: 红黑树,平衡二叉树的一种
优点:默认升序排序
场景: 去重,对多个数据存在自定排序的,没有索引
三、Map接口
存储键值对类型的数据 k-v ->映射关系
k的特点: 无序的,不可重复的 -->所有的key,就是一个set集合
v的特点: 无序的,可重复 --> Collection的特点
一个key对象一个value值,如果想要对应多个,多个value值可以存在在一个数组|容器中
key相同时候,value会覆盖
//导包
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
public class Map01 {
public static void main(String[] args) {
Map<String,Integer> map=new HashMap();
//put(key,value) 添加
map.put("java-33", 23);
map.put("java-32", 20);
map.put("java-32", 21);
map.put("java-31", 40);
map.put("java-30", 35);
map.put("java-29", 20);
System.out.println(map);
//remove(key) 返回被移出的value值
map.remove("java-32");
System.out.println(map);
//包含
System.out.println(map.containsKey("java33"));
System.out.println(map.containsValue(19));
//get(key)获取
System.out.println(map.get("java33"));
System.out.println(map);
//遍历方式
//1.keySet() 返回所有的key,组成一个set集合
Set<String> set=map.keySet();
//迭代器 iterator()
Iterator<String> it=set.iterator();
while(it.hasNext()){
String key=it.next();
System.out.println(key+","+map.get(key)); //key键
}
}
}
1.HashMap接口
HashMap接口
底层: 哈希表的结构
初始容量:16
加载因子: 0.75
扩容:原容量的2倍
如果HashMap的key是自定义的引用数据类型,需要对key的数据的类型重写hashCode()和equals()方法,实现去重,value会覆盖
如果key相同,value不覆盖-->先判断,如果key相同就不存储,key不相同,才存储
如果需求个根据value去重,需要自己手动定义判断 containsKey() containsValue()
- HashMap 推荐使用 ,线程不安全,增删,查询效率高
- TreeMap 中的数据有按照指定规则进行排序,推荐使用TreeMap
- Hashtable 线程安全的HashMap
2.TreeMap接口
TreeMap是一个基于红黑树结构的NavigableMap接口实现,因为key必须可比,所以key不能是null,value可以是null。同HashMap,非线程安全,遍历时修改元素会快读失败