最近受到一次面试的启发,开始看jdk6的标准源码,在这里记录下自己看的过程中的体会,和大家分享。
从最常用的数据结构开始
ArrayList<E>
- 此对象的存储采用的是标准的Object数组(elementData)进行存储,同时使用一个整形记录数组(elementData)中实际数据的长度。
/**
* The array buffer into which the elements of the ArrayList are stored.
* The capacity of the ArrayList is the length of this array buffer.
*/
private transient Object[] elementData;
/**
* The size of the ArrayList (the number of elements it contains).
*
* @serial
*/
private int size;
/**
* Constructs an empty list with an initial capacity of ten.
*/
public ArrayList() {
this(10);
}
- 对象中的存储数组elementData会随着需要存储数据的增加而扩大。在调用对象的add方法时,arraylist会首先判断容量是否足够,不够时,采用newCapacity = (oldCapacity * 3)/2 + 1的策略,进行扩充。此策略只计算一次,如果扔不足够,则直接按照新的容量进行扩展。
public boolean add(E e) {
ensureCapacity(size + 1); // Increments modCount!!
elementData[size++] = e;
return true;
}
public void ensureCapacity(int minCapacity) {
modCount++;
int oldCapacity = elementData.length;
if (minCapacity > oldCapacity) {
Object oldData[] = elementData;
int newCapacity = (oldCapacity * 3) / 2 + 1;
if (newCapacity < minCapacity)
newCapacity = minCapacity;
// minCapacity is usually close to size, so this is a win:
elementData = Arrays.copyOf(elementData, newCapacity);
}
}
- 对象中的存储数组elementData不会随着需要存储数据的减少而缩小。对象只会改变elementData中的数据存储位置,进行迁移,并依赖gc判断移除对象的回收。
public E remove(int index) {
RangeCheck(index);
modCount++;
E oldValue = (E) elementData[index];
int numMoved = size - index - 1;
if (numMoved > 0)
System.arraycopy(elementData, index + 1, elementData, index, numMoved);
elementData[--size] = null; // Let gc do its work
return oldValue;
}
- indexof采用的是标准的遍历算法,时间复杂度很高,效率很低。并且都是从前开始匹配。contains方法同理。
public int indexOf(Object o) {
if (o == null) {
for (int i = 0; i < size; i++)
if (elementData[i] == null)
return i;
} else {
for (int i = 0; i < size; i++)
if (o.equals(elementData[i]))
return i;
}
return -1;
}
上面可以通过源码,更准确的看到标准类库中对象的特点,后面会继续加入其他的数据类型、和标准类库中的其他类。
分享到:
相关推荐
For example:<br><br> jad -o -dtest -sjava *.class<br><br> (or jad -o -d test -s java *.class, which has the same effect)<br><br>This command decompiles all .class files in the current directory <br>...
<br><br><br>安装和配置jdk6.0和tomcat6.0<br><br><br><br>调试(jsp):<br><br><br><br>1.到Tomcat的安装目录的webapps目录,可以看到ROOT,examples, tomcat-docs之类Tomcat自带的的目录.<br><br><br><br>2.在...
实验室教学管理系统(Web版 全套源码 安装即用)<br><br>本系统是一个完整的JSP-JAVA应用项目,合适有初步JSP编程经验的朋友们提高和学习之用。<br><br>系统含全套源码,合适朋友们在此基础上举一反三结合实际开发出...
实验室教学管理系统(Web版 全套源码 安装即用)<br><br>本系统是一个完整的JSP-JAVA应用项目,合适有初步JSP编程经验的朋友们提高和学习之用。<br><br>系统含全套源码,合适朋友们在此基础上举一反三结合实际开发出...
<Web版办公自动化系统>(全套源码 安装即用)<br><br>本系统是一个完整的JSP应用项目,合适有初步JSP编程经验的朋友们提高和学习之用。<br><br>系统含全套源码,合适朋友们在此基础上举一反三结合实际开发出优秀的JSP...
<br><br>本系统是Web模式的在线考试管理系统<br><br>运行环境:Tomact+JDK<br><br>编程模式:JSP+JavaBean+JavaServlet<br><br>后台数据库:MS-Access<br><br>系统主要完成的功能如下:<br><br>.基本信息管理 考生...
新闻发布管理系统(Web版 全套源码 安装即用)<br><br>本系统是一个完整的JSP-JAVA应用项目,合适有初步JSP编程经验的朋友们提高和学习之用。<br><br>系统含全套源码,合适朋友们在此基础上举一反三结合实际开发出优秀...
Java异常处理机制<br>第8章 Java反射机制<br>第9章 数据结构与集合类<br>第3篇 图形用户界面<br>第10章 Java Swing(上)<br>第11章 Java Swing(下)<br>第12章 Applet网页小程序<br>第13章 图形编程<br>第14章 ...
航空订票系统管理系统(Web版 全套源码 安装即用)<br><br>本系统是一个完整的JSP-JAVA应用项目,合适有初步JSP编程经验的朋友们提高和学习之用。<br><br>系统含全套源码,合适朋友们在此基础上举一反三结合实际开发出...
航空订票系统管理系统(Web版 全套源码 安装即用)<br><br>本系统是一个完整的JSP-JAVA应用项目,合适有初步JSP编程经验的朋友们提高和学习之用。<br><br>系统含全套源码,合适朋友们在此基础上举一反三结合实际开发出...
本TXT文件为第一章:Linux 下安装 JDK<br>测试环境:系统 CentOS 5.2<br>第一步:查看Linux自带的JDK是否已安装并卸载……<br>第二步:安装JDK步骤……<br>第三步:配置环境变量<br>三步完成安装<br>其他安装请见<br...
java.util包中的ArrayList很常用,参考jdk源码中的ArrayList.java,写了一个c版的ArrayList,<E>目前仅坚持 char *(字符串) 和 int (整型).
实验室教学管理系统(Web版 全套源码 安装即用)<br><br>本系统是一个完整的JSP-JAVA应用项目,合适有初步JSP编程经验的朋友们提高和学习之用。<br><br>系统含全套源码,合适朋友们在此基础上举一反三结合实际开发出...
<Signature>sNLLKGMUdF0r8O1kKilWAGdgfs2BvJb/2Xp8p5iuDVfZXmhppo+d0Ran1P9TKdjV4ABwAgKXxJ3jcQTqE/2IRfqwnPf8itN8aFZlV3TJPYeD3yWE7IT55Gz6EijUpC7aKeoohTb4w2fpox58wWoF3SNp6sK6jDfiAUGEHYJ9pjU=</Signature> ...
1.1 JDK7新特性<一>概述 . . . . . . . . . . . . . . 1.2 JDK7新特性<二> 语法 . . . . . . . . . . . . . 1.3 JDK7新特性<三> JDBC4.1 . . . . . . . . . . 1.4 JDK7新特性<四> NIO2.0 文件系统 . . . 1.5 JDK...
jdk6 源码jdk6 源码jdk6 源码jdk6 源码jdk6 源码jdk6 源码
创建数据库表结构及测试数据<br> 在jsfejb3-ejb源码DBScript目录下有一个脚本:employee.sql是数据库的建库、建表、建测试数据为一体的脚本,可直接使用。<br> <br> 4).发布项目<br> a. ejb端:如果是用Myeclipse把...
JDK1.8【函数式接口】【定义与使用】【源码】 文章地址:https://blog.csdn.net/m0_37969197/article/details/124146253 * 函数式接口(类的定义与适应形式,只是一种类的定义形式,属于新增语法) * 包:java....