Map容器

映射(Map) 是一个存储键/值对的对象

键是唯一的,值可以重复

方法

  size()

  isEmpty()

  containsKey()      判断容器里是否包含指定的键

  containsValue()  判断容器里是否包含指定的值

  get()   根据键来获取对应的值

  put()   把键值对数据添加到数组中

  remove()    删除对应的key

  values()  获取所有的值

  keySet( )   获取map中所有的键

  entrySet()   返回包含的映射关系的Set视图

HashMap类是基于哈希表的map接口的实现,并允许使用null键和null值

实现Map并扩展AbstractMap,本身并没有增加任何新的方法

Hashtable   线程安全的  单线程使用会低

package com.day1;

import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

public class HashMapDemo {
  public static void main(String[] args) {
     Map<String, String> hMap=new HashMap<String, String>();
     hMap.put("A", "张三");
     hMap.put("B", "李四");
     hMap.put("C", "王五");
     hMap.put("D", "周六");
     System.out.println(hMap);
    // 获取map中所有的键
     Set<String>  hsSet=hMap.keySet( );
     System.out.println(hsSet);
     for (String string : hsSet) {
        System.out.println(string);
     }
    // 获取map中所有的值
     Collection<String> strings=hMap.values();
     System.out.println(strings);
     for (String string : strings) {
        System.out.println(string);
    }
     //得到key,并得到key所对应的值
     Set<String>  k=hMap.keySet( );
     for (String string : k) {
        System.out.println(string+hMap.get(string));
    }
     //当我们调用put(key,value)方法的时候,首先会把key和value封装到Entry这个静态内部类对象中
     //把Entry对象添加到数组中,所以我们想获取map中的所有键值对 ,我们只要获取数组中所有的Entry对象.接下来调用
     //Entry对象中的getkey和getvalue方法,获取键值对
    Set<Entry<String, String>> eSet= hMap.entrySet();
    for (Entry<String, String> entry : eSet) {
        System.out.println(entry.getValue());
    }
}
}

/*
* hashmap调用默认构造方法会产生一个底层是16的Entry的数组
* int hash=hash(key.hashcode())
* 首先调用key的hashcode方法来得到一个整数--哈希码
* 把哈希码作为参数传到hash函数中来进行运算--散列运算-得到了一个整型--散列值
* int i=indexFor(hash,table.length);
* 把散列值和数组的长度来进行运算 ,最终得到Entry对象存放到数组的位置,下标
*
* hashmap内部结构是数组链表结构
* 因为不同的key有可能算出来是相同的散列值,根据散列值计算出存放到数组的下标会冲突
*
*/

 

哈希码的产生和使用

当调用对象的hashcode()方法时就会返回当前对象的哈希码值,支持此方法时为了提高哈希表的性能

package com.day1;

import java.util.HashMap;
import java.util.Map;

public class HashMapDemo2 {
  public static void main(String[] args) {
     Map<person, String> map=new HashMap<person, String>();
     map.put(new person("A", 20),"张三");
     map.put(new person("B", 30),"李四");
     map.put(new person("C", 60),"王五");
     map.put(new person("B", 30),"玫瑰");
     System.out.println(map.size());
     
}
}

class person{
    private String name;
    private int age;
    public person(String name, int age) {
        
        this.name = name;
        this.age = age;
    }
    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 int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + age;
        result = prime * result + ((name == null) ? 0 : name.hashCode());
        return result;
    }
    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        person other = (person) obj;
        if (age != other.age)
            return false;
        if (name == null) {
            if (other.name != null)
                return false;
        } else if (!name.equals(other.name))
            return false;
        return true;
    }
    
    
    
}

posted @ 2018-11-18 22:57  言西早石头侠  阅读(159)  评论(0编辑  收藏  举报