美文网首页
2019-04-21 笔记

2019-04-21 笔记

作者: 1620 | 来源:发表于2019-04-21 19:32 被阅读0次

    java jdk Collection and Map 关系图(实线是继承虚线是实现)

    JavaCollectionAndMap.png

    Collection

    • Iterable

      Iterable定义了foreEach功能,同时具备操作元素Iterator迭代器

           //hasNext,next,remove
           Iterator<T> iterator();
      
           default void forEach(Consumer<? super T> action) {
            Objects.requireNonNull(action);
            for (T t : this) {
                action.accept(t);
            }
        } 
      
    • Collection

      所有集合容器的顶级接口,它规范了集合的操作标准

       boolean add(E e); //添加元素
       boolean remove(Object o); //删除指定元素
       boolean containsAll(Collection<?> c);//返回 true如果这个集合包含指定集合的所有元素。
       boolean addAll(Collection<? extends E> c);
       boolean removeAll(Collection<?> c);
       void clear(); //删除集合中所有元素
       boolean equals(Object o);
       int size();//集合大小
       boolean isEmpty();//集合是否为NULL
       boolean contains(Object o);
       ....
      

      具体方法解释可以查看jdk1.8

    • List

      继承了 Collection interface 线性方式存储,集合元素可以重复,List 有三个实现分别为 ArrayList, LikedList,Vector

      • ArrayList 可变数组,随机访问速度快,插入删除速度慢这是数组数据结构特性
    //实现了List,并且实现了RandomAccess 实现了这个接口标准代表支持可随机访问,比如Vectory也实现了RandomAccess,
    //而LikedList却没有实现,这只是一种分类思想,因为处理事情不一样所以依赖的标准也不一样
      public class ArrayList<E> extends AbstractList<E>
            implements List<E>, RandomAccess, Cloneable, java.io.Serializable
    
       //注意看它定义了一个Object数组 这里和Vector中elementData不一样,多了transient 不支持序列化,
      //并在当前类重写了 readObject和writeObject方法,这样在传输中不占用空间,保证了效率
    
       transient Object[] elementData; // non-private to simplify nested class access
    
       //添加元素时实际是将元素值赋值给数组对应的下标     elementData[size++] = e;
       public boolean add(E e) {
            ensureCapacityInternal(size + 1);  // Increments modCount!!
            elementData[size++] = e;
            return true;
        }
    
    • LikedList 链表结构,新增删除速度快,访问较慢 这是链表数据结构特性
      //首先我们看下LinkedList实现了List,并且实现了Dque双向队列可 以支持LIFO形式也可以支持LIFO形式,详细情况可以单独去看Dque的实现
      public class LinkedList<E>
      extends AbstractSequentialList<E>
      implements List<E>, Deque<E>, Cloneable, java.io.Serializable
    
    
       // 添加元素
       public boolean add(E e) {
          linkLast(e);
          return true;
       }  
    
      //Node 是链表的实现方式,添加元素是向末尾添加
       void linkLast(E e) {
          final Node<E> l = last;
          final Node<E> newNode = new Node<>(l, e, null);
          last = newNode;
          if (l == null)
              first = newNode;
          else
              l.next = newNode;
          size++;
          modCount++;
      }
    
    • Vectory
    //与List 实现的内容一模一样
    public class Vector<E> extends AbstractList<E>
      implements List<E>, RandomAccess, Cloneable, java.io.Serializable
    
    //为什么和ArrayList 一模一样 还做一个Vector呢? 因为行为实现不一样
    //它是安全的,因为它里面的public 方法都用了synchronized 互斥锁保证了线程安全,
    //但这个锁不是一个优雅的锁实现,而是一个重量级锁,它的性能会比较差
    //另外扩容倍数不一样
    
     public synchronized boolean add(E e) {
            modCount++;
            ensureCapacityHelper(elementCount + 1);
            elementData[elementCount++] = e;
            return true;
        }
    

    Set

    继承了 Collection interface 线性方式存储,集合元素不可重复,Set 有三个实现分别为 HashSet, SortedSet

    • HashSet hash表实际就是通过HashMap来实现的
          //通过hashMap来实现, 注意此处的transient 之前ArrayList中也有说明
           private transient HashMap<E,Object> map;
      
           //就是这么简单的添加,且非线程安全
          public boolean add(E e) {
              return map.put(e, PRESENT)==null;
          }
       
         //存入的对象需要重写 eques 和 hashCode这样可保证值不重复
      
    • SortedSet

    相关文章

      网友评论

          本文标题:2019-04-21 笔记

          本文链接:https://www.haomeiwen.com/subject/rcgjgqtx.html