java list 结构_Java中常见数据结构List之ArrayList
这里主要包含ArrayList和LinkedList.
关于Java中的集合内容, 感觉都已经被写烂了, 我这里主要是做个复习, 再从扒下源代码, 尽量用最直白的语言把里面的核心内容记录下来。仅此而已。
首先放一个Collection下的UML图:(此图是idea通过diagram功能生成的, 基于JDK7)
一、ArrayList
1, for-each原理:
0、 在编译的时候编译器会自动将对for这个关键字的使用转化为对目标的迭代器的使用,这就是foreach循环的原理
1、ArrayList之所以能使用foreach循环遍历,是因为ArrayList所有的List都是Collection的子接口,而Collection是Iterable的子接口,ArrayList的父类AbstractList正确地实现了Iterable接口的iterator方法。之前我自己写的ArrayList用foreach循环直接报空指针异常是因为我自己写的ArrayList并没有实现Iterable接口
2、任何一个集合,无论是JDK提供的还是自己写的,只要想使用foreach循环遍历,就必须正确地实现Iterable接口。
2, 集合中的 fail-fast iterator:
Iterator 是工作在一个独立的线程中,并且拥有一个 mutex 锁。 Iterator 被创建之后会建立一个指向原来对象的单链索引表,当原来的对象数量发生变化时,这个索引表的内容不会同步改变,所以当索引指针往后移动的时候就找不到要迭代的对象,所以按照 fail-fast 原则 Iterator 会马上抛出 java.util.ConcurrentModificationException 异常。
当使用foreach遍历一个list元素时, 因为foreach底层实现是使用iteator中的hasNext, next等, 源码中next执行时会checkForComdification:
3, ArrayList初始值大小是10, 每次扩容是增加2倍。优缺点是:
//默认的构造函数, 当然还有构造函数是可以指定大小的
public ArrayList() {
this(10);
}
//jdk7中的扩容代码, 我看了jdk6中是扩容1.5倍的, 这里有点差别
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的优点:
1、ArrayList底层以数组实现,是一种随机访问模式,再加上它实现了RandomAccess接口,因此查找也就是get的时候非常快
2、ArrayList在顺序添加一个元素的时候非常方便,只是往数组里面添加了一个元素而已
ArrayList的缺点:
1、删除元素的时候,涉及到一次元素复制,如果要复制的元素很多,那么就会比较耗费性能
2、插入元素的时候,涉及到一次元素复制,如果要复制的元素很多,那么就会比较耗费性能
因此,ArrayList比较适合顺序添加、随机访问的场景。
4,细节: 为什么ArrayList的elementData是用transient修饰的?
ArrayList实现了Serializable接口,这意味着ArrayList是可以被序列化的,用transient修饰elementData意味着我不希望elementData数组被序列化。这是为什么?因为序列化ArrayList的时候,ArrayList里面的elementData未必是满的,比方说elementData有10的大小,但是我只用了其中的3个,那么是否有必要序列化整个elementData呢?显然没有这个必要,因此ArrayList中重写了writeObject方法:
private transient Object[] elementData;
private void writeObject(java.io.ObjectOutputStream s)
throws java.io.IOException{
// Write out element count, and any hidden stuff
int expectedModCount = modCount;
s.defaultWriteObject();
// Write out array length
s.writeInt(elementData.length);
// Write out all elements in the proper order.
for (int i=0; i
s.writeObject(elementData[i]);
if (modCount != expectedModCount) {
throw new ConcurrentModificationException();
}
}
每次序列化的时候调用这个方法,先调用defaultWriteObject()方法序列化ArrayList中的非transient元素,elementData不去序列化它,然后遍历elementData,只序列化那些有的元素,这样:
1、加快了序列化的速度
2、减小了序列化之后的文件大小
java list 结构_Java中常见数据结构List之ArrayList相关推荐
- 什么是java的关键字_java中常见的关键字
什么是关键字呢? 概述:关键字就是在java语言中赋予特殊含义的单词 特点:1.组成的关键字的单词全是小写 2.常见的代码编辑器中,对关键字都有特殊的颜色标记 比如在idea中对关键字都有特殊的颜色标 ...
- java util 排序_Java中常见的排序方法
本博主要介绍Java中几种常见的排序算法: /* 排序方法的演示 1)插入排序(直接插入排序.希尔排序) 2)交换排序(冒泡排序.快速排序) 3)选择排序(直接选择排序.堆排序) 4)归并排序 5)分 ...
- java 代码冲突检测_Java中常见的代码冲突
java 代码冲突检测 在工作中,最近我对现有Java项目进行了代码清理. 完成该练习后,我可以看到在代码中一次又一次地发生了一组常见的代码冲突. 因此,我想出了此类常见违规的清单,并与同行共享,以提 ...
- java 字符串掐头去尾_java中常见的类
简介 类层次结构最顶层的基类,所有类都直接或间接继承自Object类,所以,所有的类都是以恶个Object(对象) 构造方法 Object: 构造一个对象,所有子类初始化时都会优先调用该方法 常用的成 ...
- java异常类_java中常见的异常类
展开全部 从异常类的继承架构图中可以看出:Exception 类扩展出数个子类,其中 IOException.RunntimeException 是较常用的两种. 习惯上将 Error 与 Excep ...
- 搜索中常见数据结构与算法探究(二)
本文介绍了几个常见的匹配算法,通过算法过程和算法分析介绍了各个算法的优缺点和使用场景,并为后续的搜索文章做个铺垫:读者可以通过比较几种算法的差异,进一步了解匹配算法演进过程以及解决问题的场景:KMP算 ...
- java构造单例线程池_java中常见的六种线程池详解
之前我们介绍了线程池的四种拒绝策略,了解了线程池参数的含义,那么今天我们来聊聊Java 中常见的几种线程池,以及在jdk7 加入的 ForkJoin 新型线程池 首先我们列出Java 中的六种线程池如 ...
- java常见的报错_Java中常见的错误有哪些?
原标题:Java中常见的错误有哪些? 1.java.lang.Error 错误.是所有错误的基类,用于标识严重的程序运行问题.这些问题通常描述一些不应被应用程序捕获的反常情况. 原因: 1.对系统所访 ...
- java string对象名称_java中常见对象——String
字符串:就是由多个字符组成的一串数据.也可以看成是一个字符数组. A:字符串字面值"abc"也可以看成是一个字符串对象. B:字符串是常量,一旦被赋值,就不能被改变. 构造方法: ...
最新文章
- 画布之轮播图片HTML5,Axure原型设计之轮播图
- 【052】测试数据引发的骚乱
- 电脑温度测试软件_网购电脑够便宜?坑连着坑真的不好躲
- C++ Primer 5th笔记(10)chapter10 泛型算法 :lambda
- linux系统下PHP无法调用oracle数据库的解决方法
- ORACLE数据库维护
- Hadoop,MapReduce
- Linux 命令(21)—— cd 命令(builtin)
- 团队协助 开源项目_适合小团队的协作工具,良心开源项目管理工具
- 关于deployment descripter(web.xml)的认识
- zabbix邮箱告警配置
- csdn博客如何添加图片
- 通过分析周榜前100名专家的博客文章 手把手教你写出爆款文章
- 如何计算乘积 java_Java模拟计算机的整数乘积计算功能示例
- 西门子_Step7软件仿真方法
- linux桌面 任务栏,状态栏消失恢复
- jsp里照片放在哪里_章小蕙气场靠包装?放人群里很不起眼,就是一个普通大妈!...
- ASP.NETt运行原理和运行机制
- ubuntu自带的ibus输入中文出现奇怪模式问题
- 极狐GitLab:从硅谷到中国,远程办公背后的挑战与创新