20170106:Comparator接口的使用、Map集合、异常

接着上次的总结的说:

一、Comparator接口的使用

1.使用Comparable接口定义的排序顺序有局限性:实现此接口的类只能按compareTo(xxx)方法定义的这一种排序。

2.如果同一类对象要有多种排序方式,应该为该类定义不同的比较器(实现Comparator接口的类),TreeSet有一个构造方法允许给定比较器,他就会根据给定的比较器对元素进行排序;即实现TreeSet的一个有参构造,参数即为一个实现了Comparable接口的类,这个类就是比较器。这个类要实现compare方法。

3.Comparator接口中的比较方法:

public int compare(Object o1,Object o2);

该方法如果:

返回0,表示o1 == o2;

返回正数,表示o1 > o2;

返回负数,表示o1 < o1;

4.举个例子,女孩比较的方法,比较颜值和金钱,颜值高的最好,相同的比较金钱,如果颜值跟金钱都一样,那么就交给object类中的compare方法直接比较他们的名字,如果名字一样那么就是一个人,会被TreeSet集合自动去重;

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
				+ "]";
	}
	
	
}
定义一个比较器类,实现Compartor类,重写compare方法

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类

HashMap存储结构使用哈希表,使用“键”进行散列存放,所以根据“键”去取“值”的效率很高。

TreeMap中的“key-value”对的“key”必须是“排序的”。


HashTable和HashMap区别:

1.HashMap不同步,Hashtable同步;

2.HashMap可以存储null键null值,Hashtable不可以;

3.HashMap多线程操作环境下效率高,Hashtable多线程操作效率低。


四、Java中的异常机制(有空补下)
















  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值