接着上次的总结的说:
一、Comparator接口的使用
1.使用Comparable接口定义的排序顺序有局限性:实现此接口的类只能按compareTo(xxx)方法定义的这一种排序。
2.如果同一类对象要有多种排序方式,应该为该类定义不同的比较器(实现Comparator接口的类),TreeSet有一个构造方法允许给定比较器,他就会根据给定的比较器对元素进行排序;即实现TreeSet的一个有参构造,参数即为一个实现了Comparable接口的类,这个类就是比较器。这个类要实现compare方法。
3.Comparator接口中的比较方法:
4.举个例子,女孩比较的方法,比较颜值和金钱,颜值高的最好,相同的比较金钱,如果颜值跟金钱都一样,那么就交给object类中的compare方法直接比较他们的名字,如果名字一样那么就是一个人,会被TreeSet集合自动去重;public int compare(Object o1,Object o2);
该方法如果:
返回0,表示o1 == o2;
返回正数,表示o1 > o2;
返回负数,表示o1 < o1;
定义一个比较器类,实现Compartor类,重写compare方法package set.treeset; //向treeset中添加的对象 public class Girl { private int face; private String name; private double money; public Girl(){ } public Girl(int face, String name, double money) { super(); this.face = face; this.name = name; this.money = money; } public int getFace() { return face; } public void setFace(int face) { this.face = face; } public String getName() { return name; } public void setName(String name) { this.name = name; } public double getMoney() { return money; } public void setMoney(double money) { this.money = money; } @Override public String toString() { return "Girl [face=" + face + ", name=" + name + ", money=" + money + "]"; } }
写一个测试类package set.treeset; import java.util.Comparator; //指定的排序规则,按颜值进行升序排列 public class FaceRule implements Comparator<Girl>{ @Override public int compare(Girl g1, Girl g2) { if(g1.getFace()>g2.getFace()){ return 1; }else if(g1.getFace()<g2.getFace()){ return -1; }else{ if(g1.getMoney()>g2.getMoney()){ return 1; }else if(g1.getMoney()<g2.getMoney()){ return -1; }else{ return g1.getName().compareTo(g2.getName()); } } } }
测试结果为:package set.treeset; import java.util.TreeSet; public class Test { public static void main(String[] args) { //在构造方法里边指定排序规则 TreeSet<Girl> ts1 = new TreeSet<>(new FaceRule()); ts1.add(new Girl(7,"菲奥娜",10.9)); ts1.add(new Girl(8,"艾希",23)); ts1.add(new Girl(3,"卡利斯塔",2)); ts1.add(new Girl(8,"菲兹",24)); ts1.add(new Girl(8,"菲兹儿",24)); ts1.add(new Girl(8,"菲兹",24)); for(Girl g : ts1){ System.out.println(g+" "); } } }
二、Map集合
特点:
1.实现Map接口的集合类用来存储“键-值”映射对。
2.不能包含重复的键,每个键最多只能映射到一个值,值可以重复。
JDK API中Map接口的实现类常用的有:HashMap、TreeMap、HashTable(不常用,与HashMap类似,不过它是线程安全的)
2.1 Map接口中的常用方法
Object put(Object key,Object value): 将指定的“键-值”对存入Map中;
Object get(Object key): 通过key值获得value值;
Object remove(Object key): 根据指定的键将此“键-值”对从Map中移除;
boolean containsKey(Object key):判断此Map中是否包含指定键的“键-值”对;
boolean containsValue(Object value):判断此Map中是否包含指定值的“键-值”对;
boolean isEmpty():判断此Map中是否含有元素;
int size(): 获得Map集合中键值对的个数
void clear():清空Map中所有的“键值”对;
Set keySet():返回此Map中包含的键的Set集合
Collection values():返回此Map中包含的值的Collection集;
Set<Map.Entry<K,V>> entrySet():将所有包含键-值对的Map.Entry收集到Set集中(这个方法可以用来遍历HashMap集合);
***:解释一下Map.Entry接口:Map.Entry是Map中内部定义的一个接口,专门用来保存key-->value的内容,如下:
3.用一下HashMap
package map; import java.util.HashMap; import java.util.Map.Entry; import java.util.Set; public class HashMapDemo { public static void main(String[] args) { HashMap<String,String> map = new HashMap<>(); //向map集合中添加元素 map.put("1","菲兹"); map.put("2","大将军"); map.put("3","天帝"); map.put("4","炽天使"); map.put("5","破晓女神"); //hashmap中可以添加null键null值 System.out.println("当前map集合的大小为:" +map.size()); //根据键值获取value值 System.out.println("键值为3的元素的value值为:"+map.get("3")); //删除键值为1的元素 System.out.println("删除键值为1的元素:"+map.remove("1")); //遍历hashmap集合,有点难,调用entrySet方法,将键值对封装并返回一个set集合 Set<Entry<String,String>> s = map.entrySet(); for(Entry<String,String> e : s){ System.out.println(e.getKey()+"------>"+e.getValue()); } } }
三、HashMap类与TreeMap类
四、Java中的异常机制(有空补下)HashMap存储结构使用哈希表,使用“键”进行散列存放,所以根据“键”去取“值”的效率很高。
TreeMap中的“key-value”对的“key”必须是“排序的”。
HashTable和HashMap区别:
1.HashMap不同步,Hashtable同步;
2.HashMap可以存储null键null值,Hashtable不可以;
3.HashMap多线程操作环境下效率高,Hashtable多线程操作效率低。