java之Set源码浅析

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实现,这里不再赘述。

时间: 2024-10-11 18:19:50

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

java之Map源码浅析

Map是键值对,也是常用的数据结构.Map接口定义了map的基本行为,包括最核心的get和put操作,此接口的定义的方法见下图: JDK中有不同的的map实现,分别适用于不同的应用场景,如线程安全的hashTable和非线程安全的hashMap. 如下图是JDK中map接口的子类UML类图,其中有个特例Dictionary已经不建议使用: Map接口中的方法我们需要关注的就是get.put 和迭代器相关的方法如entrySet().keySet().values()方法. Entry 在开始分析

java.util.HashMap源码浅析之解决hash冲突

HashMap是java无论是企业管理系统还是web或者其他应用层的程序开发,都是应用比较多的一种数据结构,正好最近面试有问到与HashMap解决hash冲突的方式(本人菜比没答上来),现浅析源码以解惑 且记录,将来在项目上尽量避免此类问题的出现,大家都知道HashMap为key-value存储,在HashMap中,HashMap本身拥有一个Entry数组,Entry则存有key-value,且对于Hashmap来讲一个key只能对应一个value     首先是put方法          

java之list源码浅析

三大数据结构链表.树和图,顺序表作为其中的一种,可以说是平时编程中最长使用到的.List接口是顺序表在java中的实现,它有很多子接口和实现类,平时的编程中使用起来非常方便.但是更进一步,我们有必要对其实现和原理进行理解,并和数据结构中所学比较,并应用于平时的编程中,编写出高效率的代码. 首先看下list接口的层次关系,下图由本人根据jdk的类结构简单画的: 从上图可以看出,list接口有Collection接口衍生而出,那么首先了解下Collection接口. Collection colle

java的Iterator源码浅析

Iterator经常用来遍历List,如下所示: List<String> list=new ArrayList<String>(); list.add("apple"); list.add("banana"); list.add("watermelon"); for (Iterator<String> iterator=list.iterator();iterator.hasNext();) { System

我对java String的理解 及 源码浅析

每天起床告诉自己,自己的目标是 ”技术 + 英语 还有生活“! -泥沙砖瓦浆木匠 一.char说起到String 这也是自己第二次回过头来啃java基础书,小生自认为愚昧无知.如果大神有好的教育,可以评论私信.以下都是我的看法:为什么说char呢,我这里先卖个关子.在java中,char是用unicode编码的,占16位(2字节).从ansi编码(1字节)到unicode编码(2字节).Java中使用Unicode的原因是,Java的Applet(网页)运行,Unicode里面包含最多最广比如:

java并发:jdk1.8中ConcurrentHashMap源码浅析

ConcurrentHashMap是线程安全的.可以在多线程中对ConcurrentHashMap进行操作. 在jdk1.7中,使用的是锁分段技术Segment.数据结构是数组+链表. 对比jdk1.7,在jdk1.8中,ConcurrentHashMap主要使用了CAS(compareAndSwap).volatile.synchronized锁. 跟jdk1.8中的HashMap一样,数据结构是数组+链表+红黑树.当链表长度过长时,会转变为红黑树. jdk1.8的HashMap源码浅析,见

Volley框架源码浅析(一)

尊重原创http://blog.csdn.net/yuanzeyao/article/details/25837897 从今天开始,我打算为大家呈现关于Volley框架的源码分析的文章,Volley框架是Google在2013年发布的,主要用于实现频繁而且粒度比较细小的Http请求,在此之前Android中进行Http请求通常是使用HttpUrlConnection和HttpClient进行,但是使用起来非常麻烦,而且效率比较地下,我想谷歌正式基于此种原因发布了Volley框架,其实出了Voll

Volley框架源码浅析(二)

尊重原创 http://write.blog.csdn.net/postedit/25921795 在前面的一片文章Volley框架浅析(一)中我们知道在RequestQueue这个类中,有两个队列:本地队列和网络队列 /** The cache triage queue. */ private final PriorityBlockingQueue<Request<?>> mCacheQueue = new PriorityBlockingQueue<Request<

转:Spring FactoryBean源码浅析

http://blog.csdn.net/java2000_wl/article/details/7410714 在Spring BeanFactory容器中管理两种bean 1.标准Java Bean 2,另一种是工厂Bean,   即实现了FactoryBean接口的bean  它不是一个简单的Bean 而是一个生产或修饰对象生成的工厂Bean 在向Spring容器获得bean时  对于标准的java Bean  返回的是类自身的实例 而FactoryBean 其返回的对象不一定是自身类的一