java 集合之Map

原创 2016年08月30日 09:54:55

Map接口与Collection接口不同,这个接口的元素是“键值对”,键不可以重复,值可以重复。它的实现类,  HashMap HashTable LinkedHashMap

hashMap的特点是在判断键是否重复的时候采用哈希算法,因此要求作为HashMap键的对象,必须重写equals和hashCode方法,我们来看一下源码

public static void main(String[] args) {
	Map<String, String> map = new HashMap<String,String>();
	map.put("1992", "荷兰");
}
当我们new 一个HashMap的时候
/**
     * Constructs an empty <tt>HashMap</tt> with the default initial capacity
     * (16) and the default load factor (0.75).
     */
    public HashMap() {
        this(DEFAULT_INITIAL_CAPACITY, DEFAULT_LOAD_FACTOR);
    }
/**
     * Constructs an empty <tt>HashMap</tt> with the specified initial
     * capacity and load factor.
     *
     * @param  initialCapacity the initial capacity
     * @param  loadFactor      the load factor
     * @throws IllegalArgumentException if the initial capacity is negative
     *         or the load factor is nonpositive
     */
    public HashMap(int initialCapacity, float loadFactor) {
        if (initialCapacity < 0)
            throw new IllegalArgumentException("Illegal initial capacity: " +
                                               initialCapacity);
        if (initialCapacity > MAXIMUM_CAPACITY)
            initialCapacity = MAXIMUM_CAPACITY;
        if (loadFactor <= 0 || Float.isNaN(loadFactor))
            throw new IllegalArgumentException("Illegal load factor: " +
                                               loadFactor);

        this.loadFactor = loadFactor;
        threshold = initialCapacity;
        init();
    }
这两个参数为

/**
     * The default initial capacity - MUST be a power of two.
     */
    static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16
/**
     * The load factor used when none specified in constructor.
     */
    static final float DEFAULT_LOAD_FACTOR = 0.75f;
原来new 一个HashMap的时候,会创建一个长度为Capacity的数组,默认长度为
1 << 4
左移4位,即2的4次幂,初始长度为16,初始负载因子为 0.75f ,这个数组可以存储元素的位置称为“bucket”,每个bucket都有下标,所以当我们要往进put的时候,它的顺序应该是这样的。

1.先求出键对象的hashCode

2.求出下标,用hashCode跟Capacity长度求模,算出来的就是坐标

3.如果坐标没有元素,直接插入,如果坐标有元素,这个时候才触发equals方法

4.如果相等,进行替换,如果不相等,往下一坐标插入元素。


那负载因子有什么用呢,我们都知道数组长度是固定的,刚开始默认设置长度为16,如果不够的话就要进行扩容,扩容为200,这里设定的是,当元素个数超过 长度*负载因子的时候就要扩容,例如 默认长度为16,负载因子为0.75,即元素个数>12的时候就要扩容,

Entry[] newTable = new Entry[newCapacity];


LinkedHashMap和Map的区别有点类似于LinkedHashSet和HashSet,区别,LinkedHashMap能保留键值对put Map的顺序。

HashTable也是Map的一个实现,它跟HashMap的区别有点类似 ArrayList 和 vector的区别

HashTable:

1.重量级,线程安全,效率低

2.null作为键或者值会抛异常

HashMap:
1.轻量级,线程不安全,效率高

2.允许null作为键或者值







版权声明:本文为博主原创文章,未经博主允许不得转载。

Java基础<十二>--->集合之map

--------- ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------- Map集合 一、概述: -------...
  • yangxin_540
  • yangxin_540
  • 2013年08月26日 22:25
  • 5042

java中map集合的原理与应用

Map集合:该集合存储键值对。一对一对往里存。而且要保证键的唯一性。 Map有三种类型: 1.Hashtable:底层是哈希表数据结构,不可以存入null键null值。该集合是线程同步的...
  • zqr772791008
  • zqr772791008
  • 2016年04月07日 14:26
  • 1284

Java集合框架之Map实例解析

1、Map概述1.1 什么是Map Map是将键映射到值的对象。一个映射不能包含重复的键;每个键最多只能映射到一个值。Map 接口提供三种collection 视图,允许以键集(keySet())...
  • qq_28261343
  • qq_28261343
  • 2016年09月22日 23:42
  • 2326

Java集合Collection、List、Set、Map使用详解

  • 2013年08月06日 19:09
  • 324KB
  • 下载

Map集合 java

  • 2012年04月16日 00:13
  • 5KB
  • 下载

java中Map集合的常用遍历方法及HashMap的应用实例

  • 2016年06月15日 13:41
  • 2KB
  • 下载

java集合知识-map、set等

  • 2012年12月13日 20:41
  • 7KB
  • 下载

java中Map集合的排序方法

  • 2016年06月15日 13:45
  • 747B
  • 下载

js模仿java的Map集合,实现功能

  • 2014年03月21日 12:51
  • 5KB
  • 下载

java中map集合的用法

  • 2013年01月07日 22:57
  • 235KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:java 集合之Map
举报原因:
原因补充:

(最多只允许输入30个字)