Java集合之Map接口

时间:2021-05-07 17:52:30

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

  1)HashMap

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

  HashMap实现原理:

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

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

  Java集合之Map接口

  示例代码:

  Java代码

  1. publicstaticvoidmain(String[] args){
  2. Map<Integer, String>maps=newHashMap<Integer, String>();
  3. maps.put(1,"小黑");
  4. maps.put(2,"小白");
  5. maps.put(null,null);
  6. maps.put(10"老王");
  7. System.out.println("size: "+maps.size());
  8. //根据key获取对象值
  9. System.out.println(maps.get(10));
  10. //是否存在此键
  11. System.out.println(maps.containsKey(2));
  12. //是否存在此值
  13. System.out.println(maps.containsValue(null));
  14. //遍历
  15. Set<Entry<Integer,String>>entry=maps.entrySet();
  16. Iterator<Entry<Integer,String>>iter=entry.iterator();
  17. while(iter.hasNext())
  18. {
  19. System.out.println(iter.next());
  20. }
  21. //清除map
  22. maps.clear();
  23. }

  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属性进行排序

  Java代码

  1. publicclassPerson implementsComparable<Person>{
  2. publicString name;
  3. publicintage;
  4. publicPerson(String name,intage)
  5. {
  6. this.name=name;
  7. this.age=age;
  8. }
  9. publicintcompareTo(Person o) {
  10. if(o==null)
  11. thrownewNullPointerException();
  12. if(this.age>o.age)
  13. return1;
  14. if(this.age<o.age)
  15. return-1;
  16. return0;
  17. }
  18. @Override
  19. publicString toString() {
  20. return"Person [name="+ name + ", age="+ age + "]";
  21. }
  22. }

  调用代码:

  Java代码

  1. publicstaticvoidmain(String[] args){
  2. Map<Integer, String>maps=newTreeMap<Integer, String>();
  3. maps.put(1,"小黑");
  4. maps.put(2,"小白");
  5. maps.put(10"老王");
  6. //遍历
  7. Set<Entry<Integer,String>>entry=maps.entrySet();
  8. Iterator<Entry<Integer,String>>iter=entry.iterator();
  9. while(iter.hasNext())
  10. {
  11. System.out.println(iter.next());
  12. }
  13. //清除map
  14. maps.clear();
  15. //-----------------------------使用自定义Person做key
  16. Map<Person, String>map=newTreeMap<Person, String>();
  17. map.put(newPerson("xiaobai"20), "xiaobai");
  18. map.put(newPerson("xiaohei"18), "xiaohei");
  19. map.put(newPerson("xiaohong"30), "xiaohong");
  20. //遍历
  21. Set<Entry<Person,String>>entry1=map.entrySet();
  22. Iterator<Entry<Person,String>>iter1=entry1.iterator();
  23. while(iter1.hasNext())
  24. {
  25. System.out.println(iter1.next());
  26. }
  27. //清除map
  28. map.clear();
  29. }

  运行结果:

  Java集合之Map接口

技术分享:凯哥学堂