被遗弃的 Vector 和 Stack

在 Java Collections Framework 中有两个被遗弃的 List 实现类 —— Vector 和 Stack。 Vector 通过实现 AbstractList<E> 接口来成为 Java Collections Framework List 接口的一员,而 Stack 直接继承于 Vector。 public class Vector<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable public class Stack<E> extends Vector<E> 与 ArrayList 类似的 Vector 如果希望了解 ArrayList 的底层结构可阅读另一篇文章 ArrayList 与 LinkedList 底层结构 与 ArrayList 一样,Vector 的底层结构也是 Object 数组 elementData,通过 elementCount 来表示 Vector 存储的元素个数,但与 ArrayList 不同的是,ArrayList 创建时不指定容器个数时,elementData 是一个长度为 0 的数组,只有在第一次添加元素的时候才会创建一个长度为 10 的数组,而 Vector 则是在构造方法中调用另一个构造方法直接为 elementData 创建一个长度为 10 的数组。...

April 27, 2021

ArrayList 与 LinkedList 底层结构

在 Java 中,数组可用来存储相同类型的多个数据,但由于长度不可变,在某些场景下使用比较局限。当我们希望使用类似数组的结构来存储未知个数的元素时,可以使用 ArrayList<E> 和 LinkedList<E>,它们都是 Java Collection Framework 的成员,相比普通的数组,它们提供了更多的操作来方便我们开发。由于底层使用的数据结构不同,它们也经常被拿来做比较。 继承关系 ArrayList 属于 List<E> 接口中的一个 可变长数组 实现,直接 extends AbstractList<E> abstract 类。其继承关系如下: public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable LinkedList 直接 extends AbstractSequentialList<E> abstract 类,间接 extends AbstractList<E>,由于 LinkedList 也实现了 Deque<E> 接口,所以它属于 List<E> 和 Queue<E> 接口的实现。 public class LinkedList<E> extends AbstractSequentialList<E> implements List<E>, Deque<E>, Cloneable, java.io.Serializable ArrayList 底层结构 对于 ArrayList,Java API 对它的第一句描述为 “Resizable-array implementation of the List interface”。其底层存储元素的结构为 Object 数组。...

April 24, 2021

如何阅读 Java 字节码(Byte Code)

字节码(Byte Code) 学习 Java 的都知道,我们所编写的 .java 代码文件通过编译将会生成 .class 文件,最初的方式就是通过 JDK 的 javac 指令来编译,再通过 java 命令执行 main 方法所在的类,从而执行我们的 Java 程序。而在这中间所生成的 .class 文件中的内容,就是 JVM 可以处理运行的字节码(Byte Code),它由 JVM 解释为对应系统可运行的机器指令,这也是我们的 Java 程序能够做到一处编译处处执行的原理。 对于 Java 开发人员来说,平时需要阅读 Byte Code 的场景比较少,但和阅读框架源码能够了解到框架的设计思路一样,阅读 Java Byte Code 也有利于我们理解 Java 一些深层的东西,提高我们解决问题的能力。能够阅读 Byte Code 也有利于我们去理解 Kotlin 或其它运行在 JVM 上的语言,是如何扩展 Java 所没有的特性或语法糖。 字节码文件结构 public class Hello { public static void main(String[] args) { int a = 1; int b = 1; int c = add(a, b); System....

March 7, 2021