美文网首页
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