java集合---Map接口_JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > java集合---Map接口

java集合---Map接口

 2015/4/22 0:30:13  hm4123660  程序员俱乐部  我要评论(0)
  • 摘要:Map使用键值对来存储数据,将键映射到值对象,一个映射不能包含重复的键,每一个键最多只能映射到一个值。Map接口的具体实现类:HashMap,Hashtable,TreeMap,LinkedHashMap1)HashMap基于哈希表(哈希表学习地址)的Map接口实现。允许使用null值和null键,不保证映射的顺序,特别是不保证顺序恒久不变。它除了非同步和允许使用null外,与Hashtable大致相同。HashMap实现原理:1.HashMap默认数组大小为16,加载因子为0.75
  • 标签:Map Java 接口

?????? Map使用键值对来存储数据,将键映射到值对象,一个映射不能包含重复的键,每一个键最多只能映射到一个值。Map接口的具体实现类:HashMap,Hashtable,TreeMap,LinkedHashMap

?

1)HashMap

??? 基于哈希表(哈希表学习地址)的Map接口实现。允许使用null值和null键,不保证映射的顺序,特别是不保证顺序恒久不变。它除了非同步和允许使用null外,与Hashtable大致相同。

?

HashMap实现原理:

?

1.HashMap默认数组大小为16,加载因子为0.75,当数组使用量达到数组长度*加载因子时,需要进行扩充。

?

?

2.HashMap是以数组为头,连接链表形成的(要计算key的hashcode值),根据散列值求出对象在哈希表的存储位置,相同位置上的多个数据以链表方式连接,每次先加入的对象放进链表头。

?

?

?

?

示例代码:

class="java">public static void main(String[] args){

	     Map<Integer, String>maps=new HashMap<Integer, String>();
	     maps.put(1,"小黑");
	     maps.put(2,"小白");
	     maps.put(null,null);
	     maps.put(10, "老王"); 
	     System.out.println("size: "+maps.size());
	     //根据key获取对象值
	     System.out.println(maps.get(10));
	     //是否存在此键
	     System.out.println(maps.containsKey(2));
	     //是否存在此值
	     System.out.println(maps.containsValue(null));
	     //遍历
	     Set<Entry<Integer,String>>entry=maps.entrySet();
	     Iterator<Entry<Integer,String>>iter=entry.iterator();
	     while(iter.hasNext())
	     {
	    	 System.out.println(iter.next());
	     }
	     //清除map
	     maps.clear();
	
	}

?

HashMap是线程不安全的,非同步的,当需要重新散列时,数组扩大为原来的两倍,将会把所有数据重新进行插入,此时可能会破换原来的顺序,所有HashMap不能保证映射顺序。HaspMap的重新散列会影响性能。

?

2)Hashtable

?????? 此类实现了哈希表,该哈希表将键映射到相对应的值。任何非null都可以用作键或值,为了成功的在哈希表中存储和获取对象,用作键的对象必须实现hashCode方法和equals方法。

?

用法基本和HashMap相同,不过多介绍

?

HashMap和Hashtable的区别

1.HashMap可以使用null作为键或值,Hashtable不可以

2.HashMap是非同步的,线程不安全,而Hashtable是同步的,线程安全

3.Hashtable的默认容量为11,而HashM的默认容量为16。

?

?

3)TreeMap

????? 基于红黑树显示的,该映射根据其键的自然排序进行排序,或者根据创建映射时提供的Comparator进行排序。所以,TreeMap使用自定义类作为key时要实现Comparable接口。

?

如:

自定义Person类,实现Comparable接口。使用age属性进行排序

public class Person implements Comparable<Person>{

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

	public int compareTo(Person o) {
		if(o==null)
			throw new NullPointerException();
		if(this.age>o.age)
			return 1;
		if(this.age<o.age)
			return -1;
		return 0;
	}


	@Override
	public String toString() {
		return "Person [name=" + name + ", age=" + age + "]";
	}


	
	
}

?

调用代码:

public static void main(String[] args){

	     Map<Integer, String>maps=new TreeMap<Integer, String>();
	     maps.put(1,"小黑");
	     maps.put(2,"小白");
	     maps.put(10, "老王"); 	    
	     //遍历
	     Set<Entry<Integer,String>>entry=maps.entrySet();
	     Iterator<Entry<Integer,String>>iter=entry.iterator();
	     while(iter.hasNext())
	     {
	    	 System.out.println(iter.next());
	     }
	     //清除map
	     maps.clear();
	     
	     //-----------------------------使用自定义Person做key
	     Map<Person, String>map=new TreeMap<Person, String>();
	     map.put(new Person("xiaobai", 20), "xiaobai");
	     map.put(new Person("xiaohei", 18), "xiaohei");
	     map.put(new Person("xiaohong", 30), "xiaohong");
	
	     //遍历
	     Set<Entry<Person,String>>entry1=map.entrySet();
	     Iterator<Entry<Person,String>>iter1=entry1.iterator();
	     while(iter1.hasNext())
	     {
	    	 System.out.println(iter1.next());
	     }
	     //清除map
	     map.clear();
	}

?

运行结果:




?
?

?

  • 大小: 19.5 KB
  • 大小: 5.6 KB
  • 查看图片附件
发表评论
用户名: 匿名