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; }
(以上所有内容皆为个人笔记,如有错误之处还望指正。)
如对本文有疑问, 点击进行留言回复!!
before社区电量是什么意思 Before社区电量获得方法
RecycleView入门详解(教你全面掌握RecycleView用法)
动态权限请求框架RxPermissions(几行代码搞定权限)
URL路径@PathVariable出现点号“.“时值遭截断问题
网友评论