0%

java集合容器

突然发现,每天深陷业务的纠缠中无法自拔,对于Java的基础部分知之甚少.所以开始看看一些java core基础的部分
今天来了解一下集合容器

Java集合框架

  • 用来表示和操作集合的统一的架构,它包含了实现集合的接口与类
  • 不同的集合类有不同的数据结构,在使用中要根据不同的性能要求,使用不同的集合类
  • 有哪些接口
    • Iterable 迭代器接口
    • Collection 类集合接口
    • List 列表接口
    • Set 数据集接口
    • Queue 对接裂口
    • Map 键值对映射表

Iterable 接口

  • 实现该接口允许对象成为”foreach”语句的目标,也就是该集合允许迭代
  • 迭代器是实现了Iterator/ListIterator 接口的类的对象,可以通过遍历类集,访问操作其中的每个元素
  • ListIterator 扩展了 Iterator, 允许双向遍历集合,并且可以删除和修改元素
  • ListIterator 根据方法发现可以去到上一个元素
    1
    2
    3
    4
    5
    6
    7
    8
    /**
    * 是否有上一个元素
    */
    boolean hasPrevious();
    /**
    * 取上一个元素
    */
    E previous();
    1
    for(String it:array) //循环方式

Collection 类集接口

  • 是Iterable接口的子接口,所有类集对象可以访问,但是Map不行.
  • 存放各种元素.有些是有序有些是无序
    1
    2
    3
    4
    5
    /**
    * 返回一个在一组T类型的元素上进行迭代的迭代器.
    */
    Iteator<T> iterator(){}

List/ Set /Map

  • List
    • 扩展了Collection
    • 是一个有序的容器
    • 存放的元素是可重复
      1
      ListIterator<E> listIterator();//成为一个可以双向遍历的迭代器对象
  • Set
    • 扩展了Collection
    • 是一个无序的容器
    • 存放的元素是不可重复
  • Map
    • 是一个存储关键字键/值对的对象,可以通过键查询到所对应的值,键和值都可以是对象
    • 并不是Collection的子接口,所以Map本身不能使用迭代器来进行遍历

ArrayList

  • 调用一个无参的构造方法的时候,会在内部调用一个初始大小为10的ArrayList对象
  • 可以添加null为容器中的一个元素
  • 当添加一个元素的时候
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    /** 
    * 产生一个新的数组,并且容量是原有数组大小的1.5倍
    */
    private void grow(int minCapacity) {
    // overflow-conscious code
    int oldCapacity = elementData.length;//当前容器内数组的大小
    int newCapacity = oldCapacity + (oldCapacity >> 1);//原有容器内数组大小+容器大小右移一位(右移一位可以视为计算除以2)
    if (newCapacity - minCapacity < 0)
    newCapacity = minCapacity;
    if (newCapacity - MAX_ARRAY_SIZE > 0)
    newCapacity = hugeCapacity(minCapacity);
    // minCapacity is usually close to size, so this is a win:
    elementData = Arrays.copyOf(elementData, newCapacity);//产生一个新的ArrayList对象,并将原来的元素拷贝到新的集合对象内,新的集合对象容量为原来的1.5倍
    }

LinkedList

  • 是一个双向链表结构 Node节点有一个对于前一个节点的引用,后一个节点的引用
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    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;
    }
    }
  • 实现了Deque(Double ended Queue 双端队列),继承自Queue队列,先进先出.