zoukankan      html  css  js  c++  java
  • Java集合之Map接口

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

    1)HashMap

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

      HashMap实现原理:

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

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

      示例代码:

      Java代码

    publicstaticvoidmain(String[] args){

    Map<Integer, String>maps=newHashMap<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属性进行排序

      Java代码

    publicclassPerson implementsComparable<Person>{

    publicString name;

    publicintage;

    publicPerson(String name,intage)

    {

    this.name=name;

    this.age=age;

    }

    publicintcompareTo(Person o) {

    if(o==null)

    thrownewNullPointerException();

    if(this.age>o.age)

    return1;

    if(this.age<o.age)

    return-1;

    return0;

    }

    @Override

    publicString toString() {

    return"Person [name="+ name + ", age="+ age + "]";

    }

    }

      调用代码:

      Java代码

    publicstaticvoidmain(String[] args){

    Map<Integer, String>maps=newTreeMap<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=newTreeMap<Person, String>();

    map.put(newPerson("xiaobai", 20), "xiaobai");

    map.put(newPerson("xiaohei", 18), "xiaohei");

    map.put(newPerson("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();

    }

      运行结果:

    技术分享:www.kaige123.com

  • 相关阅读:
    Building Forest CodeForces
    欢迎使用CSDN-markdown编辑器
    Travelling HDU
    Card Collector HDU
    Doing Homework HDU
    Mirror Number SPOJ
    Palindromic Numbers LightOJ
    Magic Numbers CodeForces
    Xor-sequences CodeForces
    Little Elephant and Elections CodeForces
  • 原文地址:https://www.cnblogs.com/kaige123/p/5962082.html
Copyright © 2011-2022 走看看