From aa3a6a29a215fcbfe2e1d69c87ea789b5e91180a Mon Sep 17 00:00:00 2001 From: Silverados <295843706@qq.com> Date: Sun, 17 Mar 2019 23:07:37 +0800 Subject: [PATCH 01/12] =?UTF-8?q?jvm=E5=AF=B9boolean=E6=95=B0=E7=BB=84?= =?UTF-8?q?=E7=9A=84=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 原文为 The Java Virtual Machine does directly support boolean arrays. Its newarray instruction (§newarray) enables creation of boolean arrays. Arrays of type boolean are accessed and modified using the byte array instructions baload and bastore (§baload, §bastore). --- docs/notes/Java 基础.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/notes/Java 基础.md b/docs/notes/Java 基础.md index d7d93d48..2b7c2ddc 100644 --- a/docs/notes/Java 基础.md +++ b/docs/notes/Java 基础.md @@ -53,7 +53,7 @@ - double/64 - boolean/\~ -boolean 只有两个值:true、false,可以使用 1 bit 来存储,但是具体大小没有明确规定。JVM 会在编译时期将 boolean 类型的数据转换为 int,使用 1 来表示 true,0 表示 false。JVM 并不直接支持 boolean 数组,而是使用 byte 数组来表示 int 数组来表示。 +boolean 只有两个值:true、false,可以使用 1 bit 来存储,但是具体大小没有明确规定。JVM 会在编译时期将 boolean 类型的数据转换为 int,使用 1 来表示 true,0 表示 false。JVM 直接支持boolean类型的数组,它的newarry指令允许boolean数组的创建。boolean类型的数组的访问和修改则是使用byte数组指令baload和bastore。 - [Primitive Data Types](https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html) - [The Java® Virtual Machine Specification](https://docs.oracle.com/javase/specs/jvms/se8/jvms8.pdf) From f7424312252d90e6c649746268b96521e718fc5e Mon Sep 17 00:00:00 2001 From: raozh Date: Sat, 23 Mar 2019 23:40:23 +0800 Subject: [PATCH 02/12] =?UTF-8?q?=E8=AF=AD=E8=A8=80=E6=A0=A1=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/notes/Java 并发.md | 6 +++--- docs/notes/Redis.md | 8 ++++---- docs/notes/剑指 Offer 题解 - 20~29.md | 4 ++-- docs/notes/攻击技术.md | 4 ++-- 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/docs/notes/Java 并发.md b/docs/notes/Java 并发.md index 9505fb4e..d5194244 100644 --- a/docs/notes/Java 并发.md +++ b/docs/notes/Java 并发.md @@ -1,4 +1,4 @@ - + * [一、线程状态转换](#一线程状态转换) * [新建(New)](#新建new) * [可运行(Runnable)](#可运行runnable) @@ -264,7 +264,7 @@ public void run() { ## InterruptedException -通过调用一个线程的 interrupt() 来中断该线程,如果该线程处于阻塞、限期等待或者无限期等待状态,那么就会抛出 InterruptedException,从而提前结束该线程。但是不能中断 I/O 阻塞和 synchronized 锁阻塞。 +通过调用一个线程的 interrupt() 来中断该线程,如果该线程处于阻塞、有限期等待或者无限期等待状态,那么就会抛出 InterruptedException,从而提前结束该线程。但是不能中断 I/O 阻塞和 synchronized 锁阻塞。 对于以下代码,在 main() 中启动一个线程之后再中断它,由于线程中调用了 Thread.sleep() 方法,因此会抛出一个 InterruptedException,从而提前结束线程,不执行之后的语句。 @@ -1198,7 +1198,7 @@ public static void main(String[] args) throws InterruptedException { 可见性指当一个线程修改了共享变量的值,其它线程能够立即得知这个修改。Java 内存模型是通过在变量修改后将新值同步回主内存,在变量读取前从主内存刷新变量值来实现可见性的。 -主要有有三种实现可见性的方式: +主要有三种实现可见性的方式: - volatile - synchronized,对一个变量执行 unlock 操作之前,必须把变量值同步回主内存。 diff --git a/docs/notes/Redis.md b/docs/notes/Redis.md index 3a6f48ee..89bb51b5 100644 --- a/docs/notes/Redis.md +++ b/docs/notes/Redis.md @@ -1,4 +1,4 @@ - + * [一、概述](#一概述) * [二、数据类型](#二数据类型) * [STRING](#string) @@ -363,7 +363,7 @@ List 是一个双向链表,可以通过 lpop 和 lpush 写入和读取消息 在分布式场景下,无法使用单机环境下的锁来对多个节点上的进程进行同步。 -可以使用 Reids 自带的 SETNX 命令实现分布式锁,除此之外,还可以使用官方提供的 RedLock 分布式锁实现。 +可以使用 Redis 自带的 SETNX 命令实现分布式锁,除此之外,还可以使用官方提供的 RedLock 分布式锁实现。 ## 其它 @@ -405,7 +405,7 @@ Redis 可以为每个键设置过期时间,当键过期时,会自动删除 可以设置内存最大使用量,当内存使用量超出时,会施行数据淘汰策略。 -Reids 具体有 6 种淘汰策略: +Redis 具体有 6 种淘汰策略: | 策略 | 描述 | | :--: | :--: | @@ -555,7 +555,7 @@ Sentinel(哨兵)可以监听集群中的服务器,并在主服务器进入 分片是将数据划分为多个部分的方法,可以将数据存储到多台机器里面,这种方法在解决某些问题时可以获得线性级别的性能提升。 -假设有 4 个 Reids 实例 R0,R1,R2,R3,还有很多表示用户的键 user:1,user:2,... ,有不同的方式来选择一个指定的键存储在哪个实例中。 +假设有 4 个 Redis 实例 R0,R1,R2,R3,还有很多表示用户的键 user:1,user:2,... ,有不同的方式来选择一个指定的键存储在哪个实例中。 - 最简单的方式是范围分片,例如用户 id 从 0\~1000 的存储到实例 R0 中,用户 id 从 1001\~2000 的存储到实例 R1 中,等等。但是这样需要维护一张映射范围表,维护操作代价很高。 - 还有一种方式是哈希分片,使用 CRC32 哈希函数将键转换为一个数字,再对实例数量求模就能知道应该存储的实例。 diff --git a/docs/notes/剑指 Offer 题解 - 20~29.md b/docs/notes/剑指 Offer 题解 - 20~29.md index 39bb3bbe..81a779e0 100644 --- a/docs/notes/剑指 Offer 题解 - 20~29.md +++ b/docs/notes/剑指 Offer 题解 - 20~29.md @@ -1,4 +1,4 @@ - + * [20. 表示数值的字符串](#20-表示数值的字符串) * [题目描述](#题目描述) * [解题思路](#解题思路) @@ -318,7 +318,7 @@ private void swap(TreeNode root) { # 28 对称的二叉树 -[NowCder](https://www.nowcoder.com/practice/ff05d44dfdb04e1d83bdbdab320efbcb?tpId=13&tqId=11211&tPage=1&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking) +[NowCoder](https://www.nowcoder.com/practice/ff05d44dfdb04e1d83bdbdab320efbcb?tpId=13&tqId=11211&tPage=1&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking) ## 题目描述 diff --git a/docs/notes/攻击技术.md b/docs/notes/攻击技术.md index ed24d7f2..1b9b4ff3 100644 --- a/docs/notes/攻击技术.md +++ b/docs/notes/攻击技术.md @@ -1,4 +1,4 @@ - + * [一、跨站脚本攻击](#一跨站脚本攻击) * [二、跨站请求伪造](#二跨站请求伪造) * [三、SQL 注入攻击](#三sql-注入攻击) @@ -43,7 +43,7 @@ ### 2. 过滤特殊字符 -例如将 `<` 转义为 `<`,将 `>` 转义为 `>`,从而避免 HTML 和 Jascript 代码的运行。 +例如将 `<` 转义为 `<`,将 `>` 转义为 `>`,从而避免 HTML 和 Javascript 代码的运行。 富文本编辑器允许用户输入 HTML 代码,就不能简单地将 `<` 等字符进行过滤了,极大地提高了 XSS 攻击的可能性。 From 7c941a540c5904e1fd08cb7653918c9888db194b Mon Sep 17 00:00:00 2001 From: Dwade3 <36162683+PualrDwade@users.noreply.github.com> Date: Sun, 24 Mar 2019 10:54:38 +0800 Subject: [PATCH 03/12] =?UTF-8?q?Update=20Java=20=E8=99=9A=E6=8B=9F?= =?UTF-8?q?=E6=9C=BA.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 增加标记-整理算法的优缺点分析 --- docs/notes/Java 虚拟机.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/docs/notes/Java 虚拟机.md b/docs/notes/Java 虚拟机.md index 5073521f..166ae1c3 100644 --- a/docs/notes/Java 虚拟机.md +++ b/docs/notes/Java 虚拟机.md @@ -240,6 +240,14 @@ obj = null; 让所有存活的对象都向一端移动,然后直接清理掉端边界以外的内存。 +优点: + +- 不会产生内存碎片 + +不足: + +- 在标记-清除的基础上还需进行对象的移动,成本相对较高 + ### 3. 复制

From 839de87b77cf115baf0b282bdee380d1a717ef24 Mon Sep 17 00:00:00 2001 From: Dwade3 <36162683+PualrDwade@users.noreply.github.com> Date: Sun, 24 Mar 2019 20:30:20 +0800 Subject: [PATCH 04/12] =?UTF-8?q?Update=20Java=20=E8=99=9A=E6=8B=9F?= =?UTF-8?q?=E6=9C=BA.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 删除了重复的语句 --- docs/notes/Java 虚拟机.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/docs/notes/Java 虚拟机.md b/docs/notes/Java 虚拟机.md index 5073521f..da761017 100644 --- a/docs/notes/Java 虚拟机.md +++ b/docs/notes/Java 虚拟机.md @@ -514,8 +514,6 @@ public static final int value = 123; 初始化阶段才真正开始执行类中定义的 Java 程序代码。初始化阶段是虚拟机执行类构造器 <clinit>() 方法的过程。在准备阶段,类变量已经赋过一次系统要求的初始值,而在初始化阶段,根据程序员通过程序制定的主观计划去初始化类变量和其它资源。 -在准备阶段,已经为类变量分配了系统所需的初始值,并且在初始化阶段,根据程序员通过程序进行的主观计划来初始化类变量和其他资源。 - <clinit>() 是由编译器自动收集类中所有类变量的赋值动作和静态语句块中的语句合并产生的,编译器收集的顺序由语句在源文件中出现的顺序决定。特别注意的是,静态语句块只能访问到定义在它之前的类变量,定义在它之后的类变量只能赋值,不能访问。例如以下代码: ```java From 313380b30c4885c246566b809e208ff8cef10dcb Mon Sep 17 00:00:00 2001 From: Nick Wong Date: Sun, 24 Mar 2019 23:05:18 +0800 Subject: [PATCH 05/12] =?UTF-8?q?java=20=E5=81=8F=E5=90=91=E9=94=81?= =?UTF-8?q?=E6=8B=BC=E5=86=99=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/notes/Java 并发.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/notes/Java 并发.md b/docs/notes/Java 并发.md index d5194244..34f5eb5e 100644 --- a/docs/notes/Java 并发.md +++ b/docs/notes/Java 并发.md @@ -1573,7 +1573,7 @@ public static String concatString(String s1, String s2, String s3) { ## 轻量级锁 -JDK 1.6 引入了偏向锁和轻量级锁,从而让锁拥有了四个状态:无锁状态(unlocked)、偏向锁状态(biasble)、轻量级锁状态(lightweight locked)和重量级锁状态(inflated)。 +JDK 1.6 引入了偏向锁和轻量级锁,从而让锁拥有了四个状态:无锁状态(unlocked)、偏向锁状态(biased)、轻量级锁状态(lightweight locked)和重量级锁状态(inflated)。 以下是 HotSpot 虚拟机对象头的内存布局,这些数据被称为 Mark Word。其中 tag bits 对应了五个状态,这些状态在右侧的 state 表格中给出。除了 marked for gc 状态,其它四个状态已经在前面介绍过了。 From 064b924df372cb4e8576cfe107ebf19453e92a11 Mon Sep 17 00:00:00 2001 From: Silverados <295843706@qq.com> Date: Tue, 26 Mar 2019 13:23:43 +0800 Subject: [PATCH 06/12] =?UTF-8?q?Update=20Java=20=E5=9F=BA=E7=A1=80.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 重写还有一个抛出异常类型的限制。 --- docs/notes/Java 基础.md | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/docs/notes/Java 基础.md b/docs/notes/Java 基础.md index 3068e439..0080aecc 100644 --- a/docs/notes/Java 基础.md +++ b/docs/notes/Java 基础.md @@ -668,12 +668,31 @@ SuperExtendExample.func() 存在于继承体系中,指子类实现了一个与父类在方法声明上完全相同的一个方法。 -为了满足里式替换原则,重写有有以下两个限制: +为了满足里式替换原则,重写有以下三个限制: - 子类方法的访问权限必须大于等于父类方法; - 子类方法的返回类型必须是父类方法返回类型或为其子类型。 +- 子类方法抛出的异常类型必须是父类抛出异常类型或为其子类型。 -使用 @Override 注解,可以让编译器帮忙检查是否满足上面的两个限制条件。 +使用 @Override 注解,可以让编译器帮忙检查是否满足上面的三个限制条件。例如: +```java +public class test { + class father{ + protected List say() throws Throwable{ + System.out.println("father"); + return new ArrayList<>(); + } + } + + class son extends father{ + @Override + public ArrayList say() throws Exception { + System.out.println("son"); + return new ArrayList<>(); + } + } +} +``` **2. 重载(Overload)** From c74541fe84ef74381ab8c35e9bbb14e6978156f8 Mon Sep 17 00:00:00 2001 From: CyC2018 Date: Tue, 26 Mar 2019 14:42:43 +0800 Subject: [PATCH 07/12] =?UTF-8?q?Update=20Java=20=E5=9F=BA=E7=A1=80.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/notes/Java 基础.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/notes/Java 基础.md b/docs/notes/Java 基础.md index 2834c204..48d44803 100644 --- a/docs/notes/Java 基础.md +++ b/docs/notes/Java 基础.md @@ -53,7 +53,7 @@ - double/64 - boolean/\~ -boolean 只有两个值:true、false,可以使用 1 bit 来存储,但是具体大小没有明确规定。JVM 会在编译时期将 boolean 类型的数据转换为 int,使用 1 来表示 true,0 表示 false。JVM 直接支持boolean类型的数组,它的newarry指令允许boolean数组的创建。boolean类型的数组的访问和修改则是使用byte数组指令baload和bastore。 +boolean 只有两个值:true、false,可以使用 1 bit 来存储,但是具体大小没有明确规定。JVM 会在编译时期将 boolean 类型的数据转换为 int,使用 1 来表示 true,0 表示 false。JVM 并不直接支持 boolean 数组,而是使用 byte 数组来表示 boolean 数组。 - [Primitive Data Types](https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html) - [The Java® Virtual Machine Specification](https://docs.oracle.com/javase/specs/jvms/se8/jvms8.pdf) From 59438653081893cf658e13a3e3466e3170bcef37 Mon Sep 17 00:00:00 2001 From: CyC2018 Date: Tue, 26 Mar 2019 14:46:44 +0800 Subject: [PATCH 08/12] =?UTF-8?q?Update=20Java=20=E5=9F=BA=E7=A1=80.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/notes/Java 基础.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/notes/Java 基础.md b/docs/notes/Java 基础.md index 48d44803..be04ba06 100644 --- a/docs/notes/Java 基础.md +++ b/docs/notes/Java 基础.md @@ -53,7 +53,7 @@ - double/64 - boolean/\~ -boolean 只有两个值:true、false,可以使用 1 bit 来存储,但是具体大小没有明确规定。JVM 会在编译时期将 boolean 类型的数据转换为 int,使用 1 来表示 true,0 表示 false。JVM 并不直接支持 boolean 数组,而是使用 byte 数组来表示 boolean 数组。 +boolean 只有两个值:true、false,可以使用 1 bit 来存储,但是具体大小没有明确规定。JVM 会在编译时期将 boolean 类型的数据转换为 int,使用 1 来表示 true,0 表示 false。JVM 支持 boolean 数组,但是是通过读写 byte 数组来实现的 - [Primitive Data Types](https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html) - [The Java® Virtual Machine Specification](https://docs.oracle.com/javase/specs/jvms/se8/jvms8.pdf) From 8c556c0308cfafafe3933c938ac8ce0f159d5525 Mon Sep 17 00:00:00 2001 From: CyC2018 Date: Tue, 26 Mar 2019 14:46:55 +0800 Subject: [PATCH 09/12] =?UTF-8?q?Update=20Java=20=E5=9F=BA=E7=A1=80.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/notes/Java 基础.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/notes/Java 基础.md b/docs/notes/Java 基础.md index be04ba06..6b843341 100644 --- a/docs/notes/Java 基础.md +++ b/docs/notes/Java 基础.md @@ -53,7 +53,7 @@ - double/64 - boolean/\~ -boolean 只有两个值:true、false,可以使用 1 bit 来存储,但是具体大小没有明确规定。JVM 会在编译时期将 boolean 类型的数据转换为 int,使用 1 来表示 true,0 表示 false。JVM 支持 boolean 数组,但是是通过读写 byte 数组来实现的 +boolean 只有两个值:true、false,可以使用 1 bit 来存储,但是具体大小没有明确规定。JVM 会在编译时期将 boolean 类型的数据转换为 int,使用 1 来表示 true,0 表示 false。JVM 支持 boolean 数组,但是是通过读写 byte 数组来实现的。 - [Primitive Data Types](https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html) - [The Java® Virtual Machine Specification](https://docs.oracle.com/javase/specs/jvms/se8/jvms8.pdf) From f2e328077837db950892d87587761a23395218b9 Mon Sep 17 00:00:00 2001 From: CyC2018 Date: Tue, 26 Mar 2019 14:56:18 +0800 Subject: [PATCH 10/12] =?UTF-8?q?Update=20Java=20=E5=9F=BA=E7=A1=80.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/notes/Java 基础.md | 34 +++++++++++++++++++--------------- 1 file changed, 19 insertions(+), 15 deletions(-) diff --git a/docs/notes/Java 基础.md b/docs/notes/Java 基础.md index 2152dd26..eb01433c 100644 --- a/docs/notes/Java 基础.md +++ b/docs/notes/Java 基础.md @@ -674,22 +674,26 @@ SuperExtendExample.func() - 子类方法的返回类型必须是父类方法返回类型或为其子类型。 - 子类方法抛出的异常类型必须是父类抛出异常类型或为其子类型。 -使用 @Override 注解,可以让编译器帮忙检查是否满足上面的三个限制条件。例如: -```java -public class test { - class father{ - protected List say() throws Throwable{ - System.out.println("father"); - return new ArrayList<>(); - } - } +使用 @Override 注解,可以让编译器帮忙检查是否满足上面的三个限制条件。 - class son extends father{ - @Override - public ArrayList say() throws Exception { - System.out.println("son"); - return new ArrayList<>(); - } +下面的示例中,SubClass 为 SuperClass 的子类,SubClass 重写了 SuperClass 的 func() 方法。其中: + +- 子类方法访问权限为 public,大于父类的 protected。 +- 子类的返回类型为 ArrayList,是父类返回类型 List 的子类。 +- 子类抛出的异常类型为 Exception,是父类抛出异常 Throwable 的子类。 +- 子类重写方法使用 @Override 注解,从而让编译器自动检查是否满足限制条件。 + +```java +class SuperClass { + protected List func() throws Throwable { + return new ArrayList<>(); + } +} + +class SubClass extends SuperClass { + @Override + public ArrayList func() throws Exception { + return new ArrayList<>(); } } ``` From 89f95ac293420e542a38fc2a975e98ed264ab0d1 Mon Sep 17 00:00:00 2001 From: Silverados <295843706@qq.com> Date: Tue, 26 Mar 2019 23:30:44 +0800 Subject: [PATCH 11/12] =?UTF-8?q?Update=20Java=20=E5=AE=B9=E5=99=A8.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 这这这没有因果关系啊:实现了 RandomAccess 接口,因此支持随机访问。 而且应该是 快速随机访问。 Marker interface used by List implementations to indicate that * they support fast (generally constant time) random access. The primary * purpose of this interface is to allow generic algorithms to alter their * behavior to provide good performance when applied to either random or * sequential access lists. --- docs/notes/Java 容器.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/notes/Java 容器.md b/docs/notes/Java 容器.md index 22ee80d6..4221beac 100644 --- a/docs/notes/Java 容器.md +++ b/docs/notes/Java 容器.md @@ -114,7 +114,7 @@ List list = Arrays.asList(1, 2, 3); ### 1. 概览 -实现了 RandomAccess 接口,因此支持随机访问。这是理所当然的,因为 ArrayList 是基于数组实现的。 +因为 ArrayList 是基于数组实现的,所以支持快速随机访问。RandomAccess接口标识着该类支持快速随机访问。 ```java public class ArrayList extends AbstractList From 9f680db0cc99bd992c7f979442ecf458a33f9c1b Mon Sep 17 00:00:00 2001 From: CyC2018 Date: Wed, 27 Mar 2019 20:32:46 +0800 Subject: [PATCH 12/12] =?UTF-8?q?Update=20Java=20=E5=AE=B9=E5=99=A8.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/notes/Java 容器.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/notes/Java 容器.md b/docs/notes/Java 容器.md index 4221beac..be75c0fa 100644 --- a/docs/notes/Java 容器.md +++ b/docs/notes/Java 容器.md @@ -114,7 +114,7 @@ List list = Arrays.asList(1, 2, 3); ### 1. 概览 -因为 ArrayList 是基于数组实现的,所以支持快速随机访问。RandomAccess接口标识着该类支持快速随机访问。 +因为 ArrayList 是基于数组实现的,所以支持快速随机访问。RandomAccess 接口标识着该类支持快速随机访问。 ```java public class ArrayList extends AbstractList