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接口,存储数据的特点相同:存储有序的、可重复的数据
* 不同:如上
近期评论