ArrayList :
底层基于数组实现,在使用add方法添加元素时,首先校验集合容量,将新添加的值放入集合尾部并进行长度加一,进行自动扩容,扩容的操作时将数据中的所有元素复制到新的集合中。

在指定位置添加元素时
public void add(int index, E element) {
检查索引是否为0或者超出集合长度
rangeCheckForAdd(index);
将集合扩容,长度加1
ensureCapacityInternal(size + 1); // Increments modCount!!
//从指定index位置开始将其后元素向后移动一位,空余出index位置
System.arraycopy(elementData, index, elementData, index + 1,
size - index);
给index赋值
elementData[index] = element;
size++;
}

从 ensureCapacityInternal 延申到此方法
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);
}
由此可见在创建arrayList集合时最好提前预估长度,以免不必要的扩容,提高性能。

transient Object[] elementData; 集合中加transient是防止被自动序列化。因为arrayList是基于动态数组,可能不会使用数组的全部空间,在它的类中重写了序列化和反序列化方法

HashMap: 线程不安全, 默认大小为16 负载因子0.75 当集合中元素大于 16*0.75时就会发生扩容。
使用put方法后,会计算出key的hash值,然后根据数组长度取模运算出存放下标。
在数组长度有限的情况下会出现计算下标一致的情况(hash冲突)那么会在此
形成链表,采用头插法插入。当hash冲突严重时就会形成很长的链表,导致
查询效率低下。
在jdk1.8中,判断如果链表中元素长度如果大于8那么就将
链表转换为红黑树,从而优化的查询效率,由O(n)变为0(logn)

get方法,使用key值计算下标,如果下标相同,遍历链表调用equals()方法比较。
在多线程中使用时,并发扩容时会导致形成环形链表,假如在寻找一个不存在的key时找到环形链表的index会出现死循环。

未完待续。。

JAVA常用集合解析的更多相关文章

  1. Java常用集合笔记

    最近事情比较少,闲暇之余温习巩固一下Java的一些基础知识,并做一些笔记, Java常用集合, 主要参考的这篇文章:Java常用集合 ArrayList/Vertor 1. ArrayList 的主要 ...

  2. JAVA常用集合源码解析系列-ArrayList源码解析(基于JDK8)

    文章系作者原创,如有转载请注明出处,如有雷同,那就雷同吧~(who care!) 一.写在前面 这是源码分析计划的第一篇,博主准备把一些常用的集合源码过一遍,比如:ArrayList.HashMap及 ...

  3. java常用集合浅层解析-面试必备

    ArrayList 1.动态数组 2.线程不安全 3.存储空间连续 4.查询快,添加删除慢 构造方法 /** + Shared empty array instance used for defaul ...

  4. java常用集合详解 contains

    java集合是对常用数据集合的封装,差不多就是数组吧,验证某个元素是否在数据集合里,最原始的方法是,用个循环,"某个元素"与数据集合中的每个元素逐个进行比较. java 对常用的一 ...

  5. Java常用API解析——序列化API

    原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6797659.html 工作中发现,自己对Java的了解还很片面,没有深入的研究,有很多的J ...

  6. JAVA 常用集合接口List、Set、Map总结

    java中频繁使用List.Set.Map接口,将其总结如下 它们的继承与实现关系如下: Collection├List│├LinkedList│├ArrayList│└Vector│ └Stack└ ...

  7. 链表与哈希表基本概念及Java常用集合

    -链表- 是一种物理存储单元上非连续.非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的.链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成.每个结点包括两个 ...

  8. Java图书管理系统(用Java常用集合实现)

    图书管理系统 一.需求说明 1.功能:登录,注册,忘记密码,管理员管理,图书管理. 2.管理员管理:管理员的增删改查. 3.图书管理:图书的增删改查. 4.管理员属性包括:id,姓名,性别,年龄,家庭 ...

  9. java常用集合总结

    1.线程安全 线程安全就是说多线程访问同一代码,不会产生不确定的结果. 2.List类和Set类List类和Set类是Collection集合接口的子接口.Set子接口:无序,不允许重复.List子接 ...

随机推荐

  1. android.os.NetworkOnMainThreadException异常 (转)

    转:http://blog.csdn.net/wotoumingzxy/article/details/7797295 这个异常大概意思是在主线程访问网络时出的异常. Android在4.0之前的版本 ...

  2. String Algorithm Summary - 1

    目录 Suffix Array Summay 单个字符串问题 两个字符串问题 多个字符串问题 AC-Automaton Summary 求长度为n(2e9)不包含给定字符串的合法串个数 包含至少一个词 ...

  3. js中文首字母数组排序

    js中文首字母数组排序 数组的排序js算法: var Pinyin = (function() { var Pinyin = function(ops) { this.initialize(ops); ...

  4. Hexo next博客的pjax一个Bug引发的关于pjax用法的小技巧-----pjax后图片点击放大的js失效

    文章目录 广告: 背景 发现 解决 get技能 广告: 本人博客地址:https://mmmmmm.me 源码:https://github.com/dataiyangu/dataiyangu.git ...

  5. 2019山东省ACM省赛菜鸡的赛后总结

    省赛总结 2019-05-13 21:27:40 虽然第一次就死的这么难看,但是的确发现了很多问题,我想这是未来我和我的队友要解决的,而不是去难过,去感慨自己是有多菜.在大一训练结束马上参加暑假集训的 ...

  6. 转 Python - openpyxl 读写操作Excel

    Python - openpyxl 读写操作Excel   openpyxl特点   openpyxl(可读写excel表)专门处理Excel2007及以上版本产生的xlsx文件,xls和xlsx之间 ...

  7. 将xml文件转为txt文件

    import os import re import sys import glob import xml.etree.ElementTree as ET def xml_to_txt(indir,o ...

  8. SQL语句的执行顺序和效率

    今天上午在开发的过程中,突然遇到一个问题,需要了解SQL语句的执行顺序才能继续,上网上查了一下相关的资料,现整理如下:一.sql语句的执行步骤: 1)语法分析,分析语句的语法是否符合规范,衡量语句中各 ...

  9. dwr中的部分问题和总结

    2015-9-1 1.dwr设置同步异步:DWREngine.setAsync(false);//dwr设置为同步 --->使用目的是堵塞js,因为设置这样是为了js进行java的后台数据获取. ...

  10. C# System.Windows.Forms.Panel

    UserControl 定义的界面 输出到panel 实现界面切换