Java中的容器(集合)
2020-12-13 16:06
                         标签:效率比较   第一个   区别   put   笔记   存储   次方   treemap   执行    List: Set: Map: Collection: Collections: ArrayList: LinkedList: ArrayList: Vector: HashMap: Hashtable: HashMap: TreeMap: 以put操作为例: 以add操作为例: Iterator: 源码解析:  (以上所有内容皆为个人笔记,如有错误之处还望指正。) Java中的容器(集合) 标签:效率比较   第一个   区别   put   笔记   存储   次方   treemap   执行    原文地址:https://www.cnblogs.com/xihuantingfeng/p/11616389.html1、Java常用容器:List,Set,Map
2、Collection 和 Collections 的区别
3、ArrayList 和 LinkedList 的区别
4、ArrayList 和 Vector 的区别
5、HashMap 和 Hashtable 的区别
6、HashMap 和 TreeMap 的使用场景
7、HashMap 实现原理
8、HashSet 实现原理
9、迭代器:Iterator


package com.spring.test.service.demo;
import java.util.*;
/**
 * @Author: philosopherZB
 * @Date: 2019/10/1
 */
public class Demo {
    public static void main(String[] args){
        List
10、ArrayList 扩容源码解析(JDK8)
    //默认初始容量10
    private static final int DEFAULT_CAPACITY = 10;
    //一个空的默认对象数组,当ArrayList(int initialCapacity),ArrayList(Collection extends E> c)中的容量等于0的时候使用
    private static final Object[] EMPTY_ELEMENTDATA = {};
    //一个空的默认对象数组,用于ArrayList()构造器
    private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
    //一个对象数组,transient表示不能序列化
    transient Object[] elementData;
    //数组大小
    private int size;
    //以传入的容量构造一个空的list
    public ArrayList(int initialCapacity) {
        //如果传入值大于0,则创建一个该容量大小的数组。
        if (initialCapacity > 0) {
            this.elementData = new Object[initialCapacity];
        } else if (initialCapacity == 0) {
            //否则如果传入值等于0,则创建默认空数组
            this.elementData = EMPTY_ELEMENTDATA;
        } else {
            //如果小于0则抛出异常
            throw new IllegalArgumentException("Illegal Capacity: "+
                    initialCapacity);
        }
    }
    //默认添加在数组末尾
    public boolean add(E e) {
        //添加之前先确认是否需要扩容
        ensureCapacityInternal(size + 1);  // Increments modCount!!
        //新加入的元素是添加在了数组的末尾,随后数组size自增。
        elementData[size++] = e;
        return true;
    }
    private void ensureCapacityInternal(int minCapacity) {
        //先通过calculateCapacity方法计算最终容量,以确认实际容量
        ensureExplicitCapacity(calculateCapacity(elementData, minCapacity));
    }
    private static int calculateCapacity(Object[] elementData, int minCapacity) {
        //如果elementData为默认空数组,则比较传入值与默认值(10),返回两者中的较大值
        //elementData为默认空数组指的是通过ArrayList()这个构造器创建的ArrayList对象
        if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
            return Math.max(DEFAULT_CAPACITY, minCapacity);
        }
        //返回传入值
        return minCapacity;
    }
    private void ensureExplicitCapacity(int minCapacity) {
        modCount++;
        // overflow-conscious code
        //如果最终确认容量大于数组容量,则进行grow()扩容
        if (minCapacity - elementData.length > 0)
            grow(minCapacity);
    }
    //可分配的最大数组大小
    private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
    //扩容
    private void grow(int minCapacity) {
        // overflow-conscious code
        //oldCapacity表示旧容量
        int oldCapacity = elementData.length;
        //newCapacity表示新容量,计算规则为旧容量+旧容量的0.5,即旧容量的1.5倍。如果超过int的最大值会返回一个负数。
        //oldCapacity >> 1表示右移一位,对应除以2的1次方。
        int newCapacity = oldCapacity + (oldCapacity >> 1);
        //如果新容量小于最小容量,则将最小容量赋值给新容量(有时手动扩容可能也会返回
        if (newCapacity - minCapacity )
            newCapacity = minCapacity;
        //如果新容量大于MAX_ARRAY_SIZE,则执行hugeCapacity(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);
    }
    private static int hugeCapacity(int minCapacity) {
        //如果最小容量超过了int的最大值,minCapacity会是一个负数,此时抛出内存溢出错误
        if (minCapacity // overflow
            throw new OutOfMemoryError();
        //比较最小容量是否大于MAX_ARRAY_SIZE,如果是则返回Integer.MAX_VALUE,否则返回MAX_ARRAY_SIZE
        return (minCapacity > MAX_ARRAY_SIZE) ?
                Integer.MAX_VALUE :
                MAX_ARRAY_SIZE;
    }
上一篇:go语言标准库之flag
下一篇:webbrowser取页面验证码