声明:由于学习所用环境为JDk1.8,所有涉及java的代码均在JDK1.8环境中测试通过,如果环境不同,可能会有错误发生!
一、Comparator接口
使用Comparable接口定义排序顺序有局限性:实现此接口的类只能按compareTo()定义的这一种方式排序。
如果同一类对象要有多种排序方式,应该为该类定义不同的比较器(实现Comparator接口的类)TreeSet有一个构造方法允许给定比较器,它就会根据给定的比较器对元素进行排序.
public class RuleScore implements Comparator<Student> {
@Override
public int compare(Student s1, Student s2) {
if(s1.getScore()>s2.getScore()){
return -1;
}else if(s1.getScore()<s2.getScore()){
return 1;
}else{
if(s1.getAge()>s2.getAge()){
return -1;
}else if(s1.getAge()<s2.getAge()){
return 1;
}else{
return s1.getName().compareTo(s2.getName());
}
}
}
public class RuleAge implements Comparator<Student>{
@Override
public int compare(Student s1, Student s2) {
if(s1.getAge()>s2.getAge()){
return -1;
}else if(s1.getAge()<s2.getAge()){
return 1;
}else{
if(s1.getScore()>s2.getScore()){
return -1;
}else if(s1.getScore()<s2.getScore()){
return 1;
}else{
return s1.getName().compareTo(s2.getName());
}
}
}
如上所示,可以为Student类定义两个不同的比较器(两个实现Comparator接口的类)
二、Map集合
1、特点:
实现Map接口的集合类用来存储“键-值”映射对。
不能包含重复的键,每个键最多只能映射到一个值,值可以重复。
JDK API中Map接口的实现类常用的有:
HashMap
TreeMap
Hashtable (不常用)
Properties
2、Map接口中的常用方法
Object put(Object key, Object value); //将指定的“键-值”对存入Map中
Object get(Object key); //返回指定键所映射的值
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
package map;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class HashMapDemo {
public static void main(String[] args) {
HashMap<String, String> hm=new HashMap<>();
hm.put("number", "123");
hm.put("李敏", "13567");
hm.put("city", "厦门");
System.out.println("添加的键值对数目是:"+hm.size());
System.out.println("李敏的学号是:"+hm.get("李敏"));
hm.remove("city");
System.out.println("现在的键值对数目是:"+hm.size());
//遍历所有的key
Set<String> keys=hm.keySet();
for(String key:keys){
System.out.println("所有的key是:"+key);
}
//遍历所有的value
Collection<String> values=hm.values();
for(String value:values){
System.out.println("所有的value是:"+value);
}
//遍历map集合
Set<Map.Entry<String, String>> entrySet=hm.entrySet();
for(Map.Entry<String, String> mapentry:entrySet){
//System.out.println(mapentry.getKey()+mapentry.getValue());
System.out.println(mapentry);
}
}
}
3、Map.Entry接口
Map.Entry是Map中内部定义的一个接口,专门用来保存key—>value的内容。
由图可知,Map中存储的是Map.Entry,而Map.Entry中存储的是key—>value键值对
4、HashMap类与TreeMap类
(1) HashMap存储结构使用哈希表,使用“键”进行散列存放。所以根据“键”去取“值”的效率很高。
TreeMap中的“key-value”对的“key”必须是可“排序”的。
(2) HashTable类
旧版的Hashtable,操作大多跟HashMap相同,只是它保证线程的同步。
它有一个子类Properties(属性集)比较常用:
Properties 类表示了一个持久的属性集。Properties 可保存在流中或从流中加载。属性集中每个键及其对应值都是一个字符串。
不建议使用 put 和 putAll 这类存放元素方法,应该使用 setProperty(String key, String value)方法,因为存放的“键-值”对都是字符串。类似取值也应该使用getProperty(String key)。
package map;
import java.util.Properties;
public class PropertiesDemo {
public static void main(String[] args) {
Properties pro=new Properties();
pro.setProperty("country", "China");
pro.setProperty("city", "Xian");
pro.setProperty("province", "Shanxi");
System.out.println(pro.getProperty("country"));
System.out.println(pro.getProperty("abc", "这是默认值"));
}
}
(2)HashMap和Hashtable区别
a. HashMap不同步,Hashtable同步
b. HashMap可以存储null键null值,Hashtable不可以
c. HashMap多线程操作环境下效率高,Hashtable多线程操作环境下效率低