java学习--集合(第二天)

声明:由于学习所用环境为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多线程操作环境下效率低





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值