10-7 程宗武

10-7 集合

/**
 * 一、集合框架的概述
 *
 * 1.集合、数组都是对多个数据进行存储操作的结构,简称JAVA容器
 *  说明:此时的存储,主要指的时内存层面的存储,不涉及到持久化的存储(.txt,.jpg,数据库中的存储等)
 *
 * 2.1 数组在存储多个数据方面的特点:
 *      > 一旦初始化以后,长度就不可修改。
 *      > 数组一旦定义好,其元素类型也就确定了。我们就只能操作指定类型的数据。
 *       如:String[] arr ,int[] arr1;
 * 2.2 数组在存储多个数据方面的缺点:
 *      >一旦初始化以后,其长度就不可修改
 *      >数组中提供的方法非常有限,对于添加、删除等操作,非常不便,同时效率也不高
 *      >获取数组中实际的元素的个数的需求,数组中没有现成的属性或方法可用
 *      >数组存储数据的特点:有序、可重复,对于无序、不可重复的需求,不能满足
 */
* 二、集合框架
*     |---Collection接口:单例集合,用来存储一个个的对象
*          |---list接口:存储有序的,可重复的数据。 
*              |---ArrayList、LinkedList、Vector
*          |---set接口:存储无序的,不可重复的数据。
*              |---HashSet、LinkedHashSet、TreeSet
*     |---Map接口:双列集合,用来存储一对(key- value)一对的数据  
*              |---HashMap、LinkedHashMap、TreeMap、Hashtable、Properties
*  1.ArrayList的源码分析:
*   1.1 jdk 7情况下
*      ArrayList list = new ArrayList();//底层创建了长度是10的Object[] 数组elementDate
*      list.add(123);//elementData[0] = new Integer(123);
*      ...
*      list.add(11);//如果此次的添加导致底层elementData数组容量不够,则会扩容
*      默认情况下,扩容为原来的容量的1.5倍,同时需要将原有的数组中的数据复制到新的数组中
*      结论:建议开发中使用带参的构造器:ArrayList list = new ArrayList(int capacity)
*   1.2 jdk 8中ArrayList的变化:
*      ArrayList list = new ArrayList();//底层Object[] elementData初始化为{},并没有创建长度为*          10的数组
*      list.add(123);//第一次调用add()时,底层才创建了长度为10的数组,并将数据123添加到elementData         中
*      ...
*      后续的添加和扩容操作于 jdk 7 无异
*   1.3 小结:jdk7 中的ArrayList的对象的创建类似于单例的饿汉式,jdk8 中的ArrayList的对象的创建类似于        单例的懒汉式
*   2. LinkedList的源码分析:
*      LinkedList list = new LinkedList();内部声明了Node类型的first和last属性,默认值为null
*      list.add(123);//将123封装到Node中,创建了Node对象。
*
*      其中,Node定义为:体现了LinkedList双向链表的说法
*      private static class Node<E>{
*          E item;
*          Node<E> next;
*          Node</E> prev;
*
*          Node(<E> prev, E element ,Node<E> next){
*              this.item = element;
*              this.next = next;
*              this.prev = prev;
*          }
*      }
*  3.Vector的源码分析:jdk7 和 jdk8 中通过Vector()构造器创建对象时
*     底层都创建了长度为10的数组,在扩容方面默认扩容为原来的数组长度的2倍。
*
*  面试题:ArrayList、LinkedList、Vector三者的异同?
*   同:三个类都是实现了List接口,存储数据的特点相同:存储有序的、可重复的数据
*   不同:如上

标签

评论

this is is footer