Map,HashMap,Hashtable,TreeMap总结

package map;

import java.util.Collection;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;

import com.sun.org.apache.xalan.internal.xsltc.runtime.Hashtable;

public class MapDemo {

	public static void main(String[] args) {
		/*
		 * HashMap继承自Map接口,是基于哈希表的双列集合,是不同步的,键是唯一的,键和值可以为空,不保证顺序
		 */
		HashMap<String,Integer> hm = new HashMap<String,Integer>();
		/*
		 * put方法会键值对添加到HashMap中,并且返回此键的原值,如果没有原值,返回null
		 * 添加同一个键的对应关系时,新值会将原值覆盖,
		 */
		System.out.println(hm.put("a", 32));
		System.out.println(hm.put("a", 33));
		/*
		 * remove方法会删除指定的键的对应关系,并返回对应的值,如果没有该对应关系,返回null
		 */
		System.out.println(hm.remove("z"));
		hm.put("z", 100);
		System.out.println(hm.remove("z"));
		/*
		 * containsKey和containsValue分别用于判断HashMap中是否存在指定的键和值,
		 * 如果存在返回true,不存在返回false,反过来可以通过返回值来判断是否存在
		 * 键和值
		 */
		System.out.println(hm.containsKey("a"));
		System.out.println(hm.containsKey("b"));
		System.out.println(hm.containsValue(33));
		System.out.println(hm.containsValue(24));
		/*
		 * isEmpty用来判断HashMap是否为空,如果为空返回true,不为空返回false
		 */
		System.out.println(hm.isEmpty());
		/*
		 * get方法可以通过指定的键获取其对应的值,如果不存在返回null
		 */
		System.out.println(hm.get("a"));
		System.out.println(hm.get("x"));
		/*
		 * values方法可以获得HashMap中所有的值,因为Map不要求值是唯一的,所以返回Collection
		 * 对Collection进行遍历,可以获取每一个值
		 */
		hm.put("s", 22);
		hm.put("v", 23);
		hm.put("j", 24);
		Collection<Integer> values = hm.values();
		Iterator it = values.iterator();
		while(it.hasNext()){
			System.out.println(it.next());
		}
		/*
		 * keySet方法返回HashMap中所有的key,因为key是唯一的,所以以map的形式返回
		 * 然后使用迭代器遍历,可以获取到所有的key和value
		 */
		Set<String> keySet = hm.keySet();
		Iterator it1 = keySet.iterator();
		while(it1.hasNext()){
			String key = (String) it1.next();
			Integer value = hm.get(key);
			System.out.println(key+"::"+value);
		}
		/*
		 * entrySet方法返回HashMap中所有的键值对,同样以Set形式,遍历拿到每个
		 * 键值对Map.Entry<String, Integer>,然后通过Map.Entry的getKey和getValue
		 * 方法可以获取到所有的key和value
		 */
		Set<Map.Entry<String, Integer>> entrySet = hm.entrySet();
		Iterator it2 = entrySet.iterator();
		while(it2.hasNext()){
			Map.Entry<String, Integer> keyToValue = (Map.Entry<String, Integer>)it2.next();
			String key = keyToValue.getKey();
			Integer value = keyToValue.getValue();
			System.out.println(key+"::"+value);
		}
		
		/*
		 * Hashtable继承自Dictionary类,双列集合,同步的,键是唯一的,
		 * 键和值都不可以为null(与HashMap最重要的区别),不保证顺序,HashTable
		 * 保证键唯一的原理:先判断哈希值,如果相等,在判断equals如果为true则不存
		 * 如果哈希值不等,或者equals返回false则存入该键值对。
		 */
		Hashtable ht = new Hashtable();
		/*
		 * 如果以String为键,因为String已经重写了hashCode和equals方法,所以下面存入的
		 * 2会将1覆盖掉。但是自定义的Person类,如果不重写hashCode和equals方法,那么两个
		 * zhangsan都会被存入到HashTable中。
		 */
		ht.put(new Person("zhangsan",20),2);
		ht.put(new Person("zhangsan",20),3);
		ht.put("a", 1);
		ht.put("a", 2);
		System.out.println(ht);
		
		/*
		 * TreeMap是双列集合,是不同步的,键是唯一的,键值都不允许为null,是有序的,
		 * 与TreeSet类似,都是通过比较器或者元素自身的比较来决定元素的顺序。
		 */
		TreeMap tm = new TreeMap(new ComparatorImpl());
		tm.put(new Person("zhangsan",20), 1);
		tm.put(new Person("zhangsan",22), 2);
		tm.put(new Person("lisi",22), 1);
		tm.put(new Person("zhaowu",24), 1);
		tm.put(new Person("qianliu",26), 1);
		//tm.put(null, 3);
		//tm.put(new Person("wangcai",22), null);
		//tm.put(null, null);
		
		System.out.println(tm.size());
		
		Set<Person> keySet1 = tm.keySet();
		Iterator it3 = keySet1.iterator();
		while(it3.hasNext()){
			Person p = (Person) it3.next();
			Integer value = (Integer) tm.get(p);
			System.out.println(p.getName()+"::"+p.getAge()+"::"+value);
		}
		
		
		
	}

}

class ComparatorImpl implements Comparator{   
	//自定义比较器,实现Comparator借口,重写compare方法。
	public int compare(Object o1, Object o2) {
		Person p1 = (Person)o1;
		Person p2 = (Person)o2;
		int temp = p1.getName().compareTo(p2.getName());
		//按照名字排序,如果名字相同,就以年龄排序
		return (temp==0)?p1.getAge()-p2.getAge():temp;
	}
}

package map;

public class Person {
	
	private String name;
	private int age;
	
	
	public Person(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}
	
	public Person() {
		super();
	}

	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	/*
	@Override
	public boolean equals(Object obj) {
		Person p = (Person)obj;
		if(this.getName().equals(p.getName())&&this.getAge()==p.getAge()){
			return true;
		}
		return false;
	}

	@Override
	public int hashCode() {
		
		return this.getName().hashCode()+this.getAge()*3;
	}
	*/
	
	
}

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值