最近受到一次面试的启发,开始看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;
}
上面可以通过源码,更准确的看到标准类库中对象的特点,后面会继续加入其他的数据类型、和标准类库中的其他类。
分享到:
相关推荐
<br>第1章 Java基础 <br>1.1 转换基本数据类型 <br>1.2 Java的运算符 <br>1.3 控制程序的流程 <br>1.4 计算阶乘 <br>1.5 实现命令行程序 <br>第2章 Java面向对象程序设计 <br>2. 1 复数类 <br>2. 2 equals.chashCode...
- **集合框架**: 研究ArrayList、LinkedList、HashMap、HashSet等数据结构的实现。 - **I/O流**: 理解字节流、字符流、缓冲流、对象序列化等概念。 - **网络编程**: 学习Socket通信,HTTP、FTP协议的实现。 - **国际...
2. **集合框架**:`java.util`包中的`ArrayList`、`LinkedList`、`HashMap`、`HashSet`等数据结构的实现,这些是日常编程中最常用的工具。源码可以帮助理解它们的性能特性,比如插入、删除、查找的时间复杂度。 3. ...
List<String> list = new ArrayList<>(); list.sort(Comparator.comparing(String::length)); // 方法引用 ``` `String::length`表示直接使用`String`类的`length()`方法。 **3. Stream API** Stream API是Java 8...
通过阅读这些类的源码,可以学习到各种设计模式,如工厂模式、单例模式、装饰器模式等,同时也能理解Java内置数据结构(如`ArrayList`, `HashMap`)的实现细节,这对于提升编程技能和解决问题具有极大帮助。...
深入理解JDK 1.6的源码对于Java开发者来说至关重要,因为它揭示了语言核心库的工作原理,有助于优化代码、理解和解决潜在问题。 1. **Java虚拟机(JVM)**:JDK 1.6中的JVM是Java程序执行的基础,它的主要职责是...
6. **集合框架**:`java.util`包中的集合类,如ArrayList、HashMap、LinkedList等,其内部实现细节对于理解数据结构和算法有很大帮助。 7. **I/O流**:`java.io`和`java.nio`包提供了丰富的输入/输出流接口和类,...
源码分析能够揭示ArrayList、HashMap、HashSet等数据结构的内部实现,帮助理解其性能特点和适用场景。 8. **网络编程** JDK 1.6的Socket和ServerSocket类提供了基础的网络通信功能。通过源码,我们可以学习到连接...
`java.util`中的ArrayList和HashMap,是常用数据结构的实现;还有`java.io`中的File类,用于文件操作。 5. **launcher**: Java启动器(Java Launcher)是JVM(Java Virtual Machine)启动应用程序的关键组件。在JDK...
3. **钻石操作符**:在创建泛型对象时,编译器可以自动推断类型参数,简化代码,如`List<String> list = new ArrayList<>();` 4. **字符串开关**:使用字符串作为switch语句的条件,使得基于字符串的分支判断更加...
在JDK 1.6中,你可以在这里找到如Object、String、ArrayList、HashMap等基础类的源代码,这些是构建任何Java程序的基础。 **6. org 文件夹** org目录通常包含开源组织或标准组织提供的库。在JDK 1.6中,org可能包含...
总的来说,JDK 1.8的源码包是一份宝贵的教育资源,它为我们揭示了Java语言背后的复杂性和精妙之处,是每一位Java开发者进阶的必经之路。无论是初学者还是资深开发者,都应该充分利用这份资源,深入探索Java的世界。
Java JDK实例开发宝典源码是一份非常宝贵的资源,它涵盖了Java编程语言的各个方面,旨在帮助开发者深入理解和熟练运用Java JDK。这份源码集合包含了众多的实际示例,可以帮助初学者和经验丰富的开发者巩固基础,提升...
这里提供的"jdk的部分源码"压缩包很可能是Oracle JDK或者OpenJDK的一部分,它们都是开源的,允许开发者深入研究和定制。 1. **Java虚拟机(JVM)**: JDK的源码中包含了Java虚拟机的实现,JVM是Java程序的执行环境。...
`java.util.ArrayList`和`java.util.HashMap`是常用的集合类,它们的实现涉及动态数组和哈希表的数据结构;`java.io`包下的类则涵盖了输入输出流的处理,如`FileInputStream`和`PrintWriter`。 通过阅读和学习这些...
这些类的源码展示了如何实现数据结构和算法,对于提升算法和数据结构理解有很大帮助。 10. **异常处理** `java.lang.Throwable`及其子类定义了Java的异常处理机制。通过查看源码,我们可以了解到异常的抛出、捕获...
List<String> list = new ArrayList<>(); ``` 4. **文件系统 API**(`java.nio.file`包):提供了一组新的API用于处理文件系统操作,如Path、Files和Paths类,增强了对文件操作的支持。 5. **改进的枚举接口**:...
在源码中,你可以看到`java.lang`、`java.util`、`java.io`等包中的各种基础类是如何实现的,例如`String`、`ArrayList`、`HashMap`等常用数据结构。 首先,`java.lang`包包含了Java语言的基础类和接口,如`Object`...
- **泛型**:通过`java.util.ArrayList<E>`等类,理解泛型的用法和限制。 - **网络编程**:研究`java.net`包,学习如何创建套接字连接,进行TCP和UDP通信。 - **XML处理**:查看`javax.xml`和`org.w3c.dom`包,...
在深入探讨JDK源码之前,我们先理解一下它的核心概念。JDK(Java Development Kit)是Oracle公司提供的用于开发和运行Java应用程序的工具集合,其中包含了Java编译器、Java运行时环境(JRE)、Java类库以及各种实用...