以前就知道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. 1653: [Usaco2006 Feb]Backward Digit Sums

    1653: [Usaco2006 Feb]Backward Digit Sums Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 285  Solved:  ...

  2. UI --UIView 及其子类

    一 > UIView  1> iOS 概述: iOS 是 Apple 公司的移动操作系统,主要用于iPhone, iPad, iPad Mini , iPod Touch 等移动产品. 借 ...

  3. 一个想法照进现实-《IT连》创业项目:三天的风投对接活动内幕分享

    前言: 话说出来创业的,都有一颗寻找风投的心,只因都有一个共同的特征:缺钱. 有的只是缺几十万,有的缺几百万,有的缺几千万,有的缺几个亿. 中国的市场,只要有需求,就有服务,只要有服务,就多了套路. ...

  4. python 的正则表达式 贪婪模式与懒惰模式

    正则表达式中用于表示匹配数量的元字符如下: ? 重复0次或1次,等同于{0,1} * 重复0次或更多次,等同于{0,} + 重复1次或更多次,等同于{1,} {n,} 重复n次及以上 上面的表示匹配次 ...

  5. Selenium2 WebDriver环境搭建

    1.下载Selenium Client Servers包 在Selenium官网上可以下载到最新的开源的包http://seleniumhq.org/download/,根据编写测试脚本所使用的语言下 ...

  6. JNDI常见配置方式

    JNDI(Java Naming and Directory Interface,Java命名和目录接口)是一组在Java应用中访问命名和目录服务的API.命名服务将名称和对象联系起来,使得我们可以用 ...

  7. 基于AGS JS开发自定义贴图图层

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.前言 假设一个景区有多张图片需要在地图上展示,并且随着地图的缩放而缩 ...

  8. 分享一些自己写的前端库,并骗骗 star(库都是在实际项目中大量运用过的)

    最近一两年在一些项目上,通过实际需求出发,编写了一些库在项目中使用,现在将这些项目都稍微整理了一下开源了出来,也许也有刚好能够你也用得上的,顺便也骗一下star.均在项目的README中加了相关的说明 ...

  9. iOS网络编程笔记——XML文档解析

    今天利用多余时间研究了一下XML文档解析,虽然现在移动端使用的数据格式基本为JSON格式,但是XML格式毕竟多年来一直在各种计算机语言之间使用,是一种老牌的经典的灵活的数据交换格式.所以我认为还是很有 ...

  10. vs打开项目出错:未找到导入的项目“C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\BuildCustomizations\CUDA 5.0.props”的解决办法

    有时候由于CUDA升级或者下载的源码原创建项目的CUDA版本与自己的不同,在打开项目的时候发现加载不上,提示:未找到导入的项目“C:\Program Files (x86)\MSBuild\Micro ...