(二)Java Collection

概述
  • Collection接口:单列集合,用来存储一个一个的对象

  • List接口:存储有序的、可重复的数据。 -->“动态”数组,替换原有数组
  • LinkedList:对于频繁的插入、删除操作,使用此类效率比ArrayList高;底层使用双向链表存储
  • Vector:作为List接口的古老实现类;线程安全,效率低;底层使用Object[] elementData存储

  • Set接口:存储无序的、不可重复的数据 -->高中讲的“集合”
  • HashSet:作为Set的主要实现类,线程不安全,可以存储null值(底层是HashMap的key,原理参见HashMap)
  • LinkedHashSet:HashSet子类,可以按照添加顺序遍历
  • TreeSet:可以按照添加对象的指定属性,进行排序
ArrayList源码分析:
  1. jdk 1.7
ArrayList list = new ArrayList(); //底层创建长度是10的数组
list.add(13); //elementData[0] = new Integer(13);
//...
list.add(11); //如果此次添加导致数组容量不够则扩容,默认扩容为1.5倍,同时复制原数组数据到新数组
  • 结论:建议开发中使用带参构造器,确立数组容量
  1. jdk 1.8的变化
ArrayList list = new ArrayList(); //底层创建数组为{},没有创建长度是10的数组
list.add(13); //第一次调用add(),底层才创建长度是10的数组
//... 后续添加和扩容与jdk1.7一致
  • 小结:jdk7中的ArrayList类似于单例模式中的饿汉式,而jdk8中类似于懒汉式,延迟了数组创建,节省了内存空间
LinkedList源码分析:
LinkedList list = new LinkedList(); //内部声明了Node类型的first和last属性,默认值为null
list.add(13); //将13封装到Node中,创建了Node对象
  • 其中Node的定义也体现了LinkedList为双向链表的说法:
private static class Node<E> {    
    E item;    
    Node<E> next;    
    Node<E> prev;    
    Node(Node<E> prev, E element, Node<E> next) {        
        this.item = element;        
        this.next = next;        
        this.prev = prev;    
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。