以前就知道Set和Map是java中的两种集合,Set代表集合元素无序、不可重复的集合;Map是代表一种由多个key-value对组成的集合。然后两个集合分别有增删改查的方法。然后就迷迷糊糊地用着。突然在一个风雨交加的夜晚,感觉不能这样迷迷糊糊,得深入地去研究一下,于是去看了看源码(jdk1.8)。

1.Map源码。

/**
 * An object that maps keys to values.  A map cannot contain duplicate keys;
 * each key can map to at most one value.

*The Map interface provides three collection view, which
 * allow a map's contents to be viewed as a set of keys, collection of values,
 * or set of key-value mappings.

这是jdk源码中的对map这个接口的描述,大概意思是说这是一个键值对映射的对象,一个map中不能包含重复的键,每一个键最多映射一个值;map这个接口提供了三个集合视图,一个是关于key的set集合,一个是关于value的collection集合,还有一个是关于key-value映射关系的set集合。分别是以下几个集合对象。

Set<K> keySet();

Collection<V> values();

Set<Map.Entry<K, V>> entrySet();

可以很明显地看出,map就是set的扩展。看了这个有什么用呢?用途很多,更加深入理解集合,你会被这些设计者(Josh Bloch)的思想所折服—当然这都比较扯淡。来点实际的,以上三种集合的大小都是一样的,因为key-value是一一对应的,所以你有三种方式来遍历map。这位兄台已经进行实验。

http://www.2cto.com/kf/201212/179013.html

public interface Map<K,V> {
    // Query Operations

这是jdk1.8中的Map接口的定义,可以发现map并没有继承collection,但是我之前在网上看了好多都说map也继承的collection,让我百思不解。

2.Set源码。

public interface Set<E> extends Collection<E> {

set才是真正地继承了collection接口,map只是在set的基础上的一个扩展。继承collection的还有List;

/**
 * A collection that contains no duplicate elements.  More formally, sets
 * contain no pair of elements <code>e1</code> and <code>e2</code> such that
 * <code>e1.equals(e2)</code>, and at most one null element.  As implied by
 * its name, this interface models the mathematical <i>set</i> abstraction.
set是数学中的集合的概念,正如名字所暗示的一样,java中的Set是对数学中set的抽象,Set中的元素是不能重复的,Set最多可含一个null元素;对于任意的非null元素e1和e2,都满足e1.equals(e2)==false. 并且在Set接口中,还有一些交集和并集的方法,如 addAll(Collection<? extends E> c);  containsAll(Collection<?> c);

(虽然集合号称存储的是Java对象,但实际上并不会真正将Java对象放在集合中,而是在集合中保留对象的引用)

3.hashMap和hashSet

(1)hashMap

hashMap是Map的一个具体实现。

public HashMap() {
        this.loadFactor = DEFAULT_LOAD_FACTOR; // all other fields defaulted
    }

这是HashMap中的默认无参的构造方法,设置了DEFAULT_LOAD_FACTOR=0.75f, 还有带参数的构造方法,可以设置负载因子(一种时间和空间成本上的折衷),增大负载因子可以减少所占内存的开销,但是会增加查询数据的开销;get()和put()都会用到查询。

* Associates the specified value with the specified key in this map.
     * If the map previously contained a mapping for the key, the old
     * value is replaced.

   public V put(K key, V value) {
        return putVal(hash(key), key, value, false, true);
    }

这是hashMap中的对于put方法的描述,如果元素重复,则会保留key,替换value;刚刚在介绍Map时提到了Map.Entry这个东西,在hashMap中,Node<K,V>实现了这个接口(static class Node<K,V> implements Map.Entry<K,V> ); 每个key-value都放在了Node<K,V>这个对象中,采用 Node<K,V>[] tab 数组的方式来保存key-value对;HashMap使用一种传说中的“Hash算法”来确定每个元素的存储位置, 调用key的hashCode()方法,通过返回值来确定每个元素的存储位置。同理,get方法也是如此。

(2)hashSet

/**
     * Constructs a new, empty set; the backing <tt>HashMap</tt> instance has
     * default initial capacity (16) and load factor (0.75).
     */
    public HashSet() {
        map = new HashMap<>();
    }

一看到默认的构造方法就什么都明白了,HashSet是基于HashMap实现的,只是封装了HashMap,源码中也是这样描述的。

Java集合之Map和Set的更多相关文章

  1. JAVA集合LIST MAP SET详解

    1. 集合框架介绍 我们知道,计算机的优势在于处理大量的数据,在编程开发中,为处理大量的数据,必须具备相应的存储结构,之前学习的数组可以用来存储并处理大量类型相同的数据,但是通过上面的课后练习,会发现 ...

  2. Java集合之Map和Set源码分析

    以前就知道Set和Map是java中的两种集合,Set代表集合元素无序.不可重复的集合:Map是代表一种由多个key-value对组成的集合.然后两个集合分别有增删改查的方法.然后就迷迷糊糊地用着.突 ...

  3. Java 集合之 Map

    Map 就是另一个顶级接口了,总感觉 Map 是 Collection 的子接口呢.Map 主要用于表示那些含有映射关系的数据,存储的是一组一组的键值对.Map 是允许你将某些对象与其它一些对象关联起 ...

  4. java集合框架——Map

    一.概述 1.Map是一种接口,在JAVA集合框架中是以一种非常重要的集合.2.Map一次添加一对元素,所以又称为“双列集合”(Collection一次添加一个元素,所以又称为“单列集合”)3.Map ...

  5. 《Java基础知识》Java集合(Map)

    Java集合主要由2大体系构成,分别是Collection体系和Map体系,其中Collection和Map分别是2大体系中的顶层接口. 今天主要讲:Map主要有二个子接口,分别为HashMap.Tr ...

  6. Java集合框架——Map接口

    第三阶段 JAVA常见对象的学习 集合框架--Map集合 在实际需求中,我们常常会遇到这样的问题,在诸多的数据中,通过其编号来寻找某一些信息,从而进行查看或者修改,例如通过学号查询学生信息.今天我们所 ...

  7. Java集合之Map

    Map架构: 如上图: (1)Map是映射接口,Map中存储的内容是键值对(key-value) (2)AbstractMap是继承于Map的抽象类,实现了Map中的大部分API. (3)Sorted ...

  8. Java集合框架Map接口

    集合框架Map接口 Map接口: 键值对存储一组对象 key不能重复(唯一),value可以重复 常用具体实现类:HashMap.LinkedHashMap.TreeMap.Hashtable Has ...

  9. Java集合中Map接口的使用方法

    Map接口 Map提供了一种映射关系,其中的元素是以键值对(key-value)的形式存储的,能够实现根据key快速查找value: Map中的键值对以Entry类型的对象实例形式存在: 建(key值 ...

随机推荐

  1. Objective-c日记-之属性列表

    属性列表 1,概述 在Cocoa中,有一类名为属性列表的对象(常简写为plist),Cocoa知道如何将它们保存到文件和从文件中加载.包括以下类NSArray,NSDictionary,NSStrin ...

  2. linux 私房菜 CH6 Linux 的档案权限与目录配置

    查看文件属性 ls -al 第一栏:类型与权限 d:目录: -:档案: l:链接档: b:可随机存取装置: c:一次性存取装置: 第二栏:有多少档名连结到此节点 第三栏:拥有者 第四栏:所属群组 第五 ...

  3. mybatis基础学习2---(resultType和resultMap的用法和区别)和setting的用法

    1:resultType和resultMap两者只能有一个成立 2:resultMap可以解决复杂查询时的映射问题 3:使用 resultType使用 ------------------------ ...

  4. JavaScript实现常见排序算法

    列表 冒泡排序 选择排序 插入排序 快速排序 希尔排序 归并排序 冒泡排序 // 输入:[5, 6, 3, 4, 8, 0, 1, 4, 7] // 输出:[0, 1, 3, 4, 4, 5, 6, ...

  5. iOS用户行为追踪——无侵入埋点

    本文章系作者原创文章,如需转载学习,请注明该文章的原始出处和网址链接.  在阅读的过程中,如若对该文章有不懂或值得优化的建议,欢迎大家加QQ:690091622 进行技术交流和探讨. 前言:  前几日 ...

  6. (转)KMP算法实现。超级赞!见过的最容易理解的

    网上有很多讲解KMP算法的博客,我就不浪费时间再写一份了.直接推荐一个当初我入门时看的博客吧:http://www.cnblogs.com/yjiyjige/p/3263858.html这位同学用详细 ...

  7. Recurrent Neural Network系列4--利用Python,Theano实现GRU或LSTM

    yi作者:zhbzz2007 出处:http://www.cnblogs.com/zhbzz2007 欢迎转载,也请保留这段声明.谢谢! 本文翻译自 RECURRENT NEURAL NETWORK ...

  8. css简单实现火焰效果

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...

  9. UNIX标准

    背景 人们在UNIX编程环境和C 程序设计语言的标准化方面已经做了很多工作.虽然UNIX应用 程序在不同的UNIX操作系统版本之间进行移植相当容易,但是2 0 世 纪 80年代UNIX版本种类的剧增以 ...

  10. GCM(Google Cloud Messaging)推送完全解析

    应该是目前为止全网最详细的GCM推送解析. GCM官方解释: https://developers.google.cn/cloud-messaging/?hl=zh-cn Send data from ...