Set的接口和实现类是最简单的,说它简单原因是由于它的实现都是基于实际的map实现的。

如 hashSet 基于hashMap,TreeSet 基于TreeMap,CopyOnWriteArraySet 基于 CopyOnWriteArrayList 。

故对事实上现简要分析。

首先看以下的类图:

Set

Set接口的意义是,含有相等的元素。相等由集合内元素的equals方法决定。Set接口继承Collection接口。可是事实上其所含的方法和Collection接口一样。

AbstractSet

从类图能够看出,AbstractSet接口继承于AbstractCollection。它是Set的抽象实现,可是其除了添加了equals和hashcode方法,其它方法均继承而来(removeall方法外)。

我们能够自己定义Set示意例如以下,加深对其理解:

Set<String> set = new /**
*
*实现演示样例
*/
AbstractSet<String>(){ /*
* 默认实现为抛出异常,可变集合须要实现此方法
*/
@Override
public boolean add(String e) { return false;
} /*
* 可变集合须要实现remove方法
*/
@Override
public Iterator<String> iterator() { return new Iterator<String>(){ public boolean hasNext() {
// TODO Auto-generated method stub
return false;
} public String next() {
// TODO Auto-generated method stub
return null;
} public void remove() {
// TODO Auto-generated method stub } };
} @Override
public int size() {
// TODO Auto-generated method stub
return 0;
} };

HashSet

其基于HashMap实现,内部有个字段为hashMap。例如以下所看到的:

// 基于map实现。键为元素,值为固定的PRESENT
private transient HashMap<E,Object> map; //map的键值
private static final Object PRESENT = new Object(); /**
* 构造函数
*/
public HashSet() {
map = new HashMap<>();
}
/**
清晰明了
*/
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
/**
迭代器为map的keySet
*/
public Iterator<E> iterator() {
return map.keySet().iterator();
}

TreeSet和CopyOnWriteArraySet

它们分别给予TreeMap和CopyOnWriteArrayList实现,这里不再赘述。

java之Set源代码浅析的更多相关文章

  1. java之Map源代码浅析

    Map是键值对.也是经常使用的数据结构. Map接口定义了map的基本行为.包含最核心的get和put操作,此接口的定义的方法见下图: JDK中有不同的的map实现,分别适用于不同的应用场景.如线程安 ...

  2. Gradle 庖丁解牛(构建生命周期核心托付对象创建源代码浅析)

    [工匠若水 http://blog.csdn.net/yanbober 未经同意严禁转载,请尊重作者劳动成果.私信联系我] 1 背景 上一篇<Gradle 庖丁解牛(构建源头源代码浅析)> ...

  3. 【Spark】Stage生成和Stage源代码浅析

    引入 上一篇文章<DAGScheduler源代码浅析>中,介绍了handleJobSubmitted函数,它作为生成finalStage的重要函数存在.这一篇文章中,我将就DAGSched ...

  4. [转载]Java 内存分配全面浅析

    Java 内存分配全面浅析 2013-02-20 17:54:45 袭烽 阅读数 91353更多 分类专栏: java基础   本文将由浅入深详细介绍Java内存分配的原理,以帮助新手更轻松的学习Ja ...

  5. 01 Java 内存分配全面浅析

    http://blog.csdn.net/shimiso/article/details/8595564 Java 内存分配全面浅析  本文将由浅入深详细介绍Java内存分配的原理,以帮助新手更轻松的 ...

  6. java 中 Stringbuff append源代码浅析

    public synchronized StringBuffer append(String str) {        super.append(str);        return this;  ...

  7. Android网络通信Volley框架源代码浅析(三)

    尊重原创 http://write.blog.csdn.net/postedit/26002961 通过前面浅析(一)和浅析(二)的分析.相信大家对于Volley有了初步的认识,可是假设想更深入的理解 ...

  8. Android网络通信Volley框架源代码浅析(二)

    尊重原创 http://write.blog.csdn.net/postedit/25921795 在前面的一片文章Volley框架浅析(一)中我们知道在RequestQueue这个类中,有两个队列: ...

  9. Android网络通信Volley框架源代码浅析(一)

    尊重原创http://blog.csdn.net/yuanzeyao/article/details/25837897 从今天開始,我打算为大家呈现关于Volley框架的源代码分析的文章,Volley ...

随机推荐

  1. winform跨线程

    在winform中经常用到多线程,那么用多线程对控件进行赋值和修改的时候呢会出现类似“该控件不是当前线程创建”的错误信息,在winform中两种办法: 1.在加载事件中写这句话,其作用呢就是线程的异步 ...

  2. Delphi 实现Ini文件参数与TEdit和TCheckBox绑定(TSimpleParam)

    在实际工作中,常遇到对Ini参数的修改,显示与保存问题. 如果手工写代码,会有很大的工作量. 本例把ini文件的参数与控件绑定起来,以达到方便使用的目的. 本例程共有2个单元 uSimpleParam ...

  3. 读配置文件 properties

    /** * */package com.sprucetec.tms.fee.utils;import java.io.IOException;import java.util.ArrayList;im ...

  4. rsyslog start with

    startswith Checks if the value is found exactly at the beginning of the property value. For example, ...

  5. java把函数作为参数传递

    public class Tool { public void a()// /方法a { System.out.print("tool.a()..."); } public voi ...

  6. Redis数据结构及相应的命令

    Redis可以存储键(key)与5种不同类型值(value)之间的映射,5中不同类型的值分别为字符串(string),列表(list),散列(hash),集合(set)和有序集合(sorted set ...

  7. Rikka with Chess(规律)

    Rikka with Chess Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) ...

  8. Python的中文编码转换问题

    与server进行数据交换时,尤其是数据中含有中文时,要注意中文的编码问题. 要选择server接受的编码方式,否则会造成显示乱码. 经验: 实验室server的数据库,中文用UTF-8编码,但我提交 ...

  9. 怎样通过css的media属性,适配不同分辨率的终端设备?

    怎样通过css的media属性,适配不同分辨率的终端设备,示比例如以下: <!DOCTYPE html> <html> <head> <title>首页 ...

  10. Request.ServerVariables完整参考

    Request.ServerVariables("Url") 返回服务器地址 Request.ServerVariables("Path_Info") 客户端提 ...