标签:效率比较 第一个 区别 put 笔记 存储 次方 treemap 执行
List:
Set:
Map:
Collection:
Collections:
ArrayList:
LinkedList:
ArrayList:
Vector:
HashMap:
Hashtable:
HashMap:
TreeMap:
以put操作为例:
以add操作为例:
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<String> list = new ArrayList<>(5); for(int i=0;i<5;i++){ list.add("Test" + i); System.out.println("输入:Test" + i); } //利用iterator()返回一个Iterator对象 Iterator<String> it = list.iterator(); //判断是否还存在元素 while(it.hasNext()){ //第一次调用next()会返回集合中的第一个元素,之后返回下一个 String s = it.next(); if("Test3".equals(s)) //移除某个元素 it.remove(); } list.forEach(l->{ System.out.println(l); }); } }
源码解析:
//默认初始容量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); //如果新容量小于最小容量,则将最小容量赋值给新容量(有时手动扩容可能也会返回<0,对应方法为ensureCapacity()) if (newCapacity - minCapacity < 0) 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 < 0) // overflow throw new OutOfMemoryError(); //比较最小容量是否大于MAX_ARRAY_SIZE,如果是则返回Integer.MAX_VALUE,否则返回MAX_ARRAY_SIZE return (minCapacity > MAX_ARRAY_SIZE) ? Integer.MAX_VALUE : MAX_ARRAY_SIZE; }
(以上所有内容皆为个人笔记,如有错误之处还望指正。)
标签:效率比较 第一个 区别 put 笔记 存储 次方 treemap 执行
原文地址:https://www.cnblogs.com/xihuantingfeng/p/11616389.html