Java集合

集合

  1. 集合的概念 对象的容器,定义了对多个对象进行操作的常用方法,类似数组的功能

  2. 集合和数组的区别

  • 数组长度固定,集合长度不固定

  • 数组可以存储基本类型和引用类型,集合只能存储引用类型

  1. 位置:java.util.*

迭代器

专门用来遍历集合的一种方式

  • hasNext():有下一个元素则返回true,否则返回false;

  • next():获取下一个元素;

  • remove()删除元素;

List集合

  1. 特点:有序有下标,可重复

  2. List实现类:

  • ArrayList:

    • 数组结构实现,必须开辟连续空间,查询快、增删慢;

    • JDK1.2版本,运行效率快、线程不安全。 源码分析

    • DEFAULT_CAPACITY = 10 默认容量; 注意:如果没有向集合中添加任何元素时,容量0;添加一个元素之后容量为10,超出再按1.5倍扩容。

    • elementData 存放元素的数组;

    • size 实际元素个数;

    • add() 添加元素

public boolean add(E e) {
    ensureCapacityInternal(size + 1);  // Increments modCount!!
    elementData[size++] = e;
    return true;
}
private static int calculateCapacity(Object[] elementData, int minCapacity) {
    if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
        return Math.max(DEFAULT_CAPACITY, minCapacity);
    }
    return minCapacity;
}
private void ensureCapacityInternal(int minCapacity) {
    ensureExplicitCapacity(calculateCapacity(elementData, minCapacity));
}
private void ensureExplicitCapacity(int minCapacity) {
    modCount++;
​
    // overflow-conscious code
    if (minCapacity - elementData.length > 0)
        grow(minCapacity);
}
private void grow(int minCapacity) {
    // overflow-conscious code
    int oldCapacity = elementData.length;
    int newCapacity = oldCapacity + (oldCapacity >> 1);
    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);
}
  • Vector:

    • 数组结构实现,查询快、增删慢;

    • JDK1.0版本,运行效率慢、线程安全。

  • LinkedList:

    • 链表结构实现,无需开辟连续空间,增删快,查询慢。 源码分析

    • int size:集合的大小

    • Node first:链表的头节点

    • Node last:链表的尾节点

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++;
}
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;
    }
}

Set集合

1.特点:无序、无下标,不可重复 2.Set实现类:

  • HashSet:

    • 基于HashCode计算元素存放位置。

    • 当存入元素的哈希码相同时,会调用equals进行确认,如结果为true,则拒绝后者存入。

  • TreeSet:

    • 基于排列顺序实现元素不重复。

    • 实现了SortedSet接口,对集合元素自动排序。

    • 元素对象的类型必须实现Comparable接口,指定排序规则。

    • 通过CompareTo方法确定是否为重复元素。

Map集合

1.特点:

  • 用于存储任意键值对(key-value)

  • 键:无序、无下标、不允许重复(唯一)

  • 值:无序、无下标、允许重复 2.Map实现类:

  • HashMap:

    • JDK1.2版本,线程不安全,运行效率快;允许用null作为key或是value 源码分析 DEFAULT_INITIAL_CAPACITY=1 << 4 默认初始容量大小 16 MAXIMUM_CAPACITY=1 << 30 最大容量大小 DEFAULT_LOAD_FACTOR = 0.75f 默认加载因子 0.75 TREEIFY_THRESHOLD = 8 jdk1.8当链表长度大于8时,调整成红黑树 UNTREEIFY_THRESHOLD = 6 jdk1.8当链表长度小于6时,调整成链表 MIN_TREEIFY_CAPACITY = 64 jdk1.8当链表长度大于8时,并且集合元素个数大于等于64时,调整成红黑树 transient Node<K,V>[] table;哈希表中的数组 size 元素个数 1) HashMap刚创建时,table是null,为了节省空间,当添加第一个元素时,table容量调整为16 2)当元素个数大于阈值(16*0.75=12)时,会进行扩容,扩容后大小为原来的2倍,目的是减少调整元素的个数 3)jdk1.8当每个链表长度大于8,并且元素个数大于等于64时,会调整为红黑树,目的提高执行效率 4)jdk1.8当链表长度小于6时,调整成链表 5)jdk1.8以前,链表是头插入,jdk1.8以后是尾插入

  • Hashtable:

    • JDK1.0版本,线程安全,运行效率慢;不允许null作为key或是value

  • Properties:

    • Hashtable的子类,要求key和value都是String。通常用于配置文件的读取。

  • TreeMap:

    • 实现了SortedMap接口(是Map的子接口),可以对key自动排序

Collections:

  • 集合工具类,定义了除了存取以外的集合常用方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值