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取页面验证码