diff --git "a/docs/java/basis/Java\345\237\272\347\241\200\347\237\245\350\257\206.md" "b/docs/java/basis/Java\345\237\272\347\241\200\347\237\245\350\257\206.md" index 7d7568f7350..34d110a09a4 100644 --- "a/docs/java/basis/Java\345\237\272\347\241\200\347\237\245\350\257\206.md" +++ "b/docs/java/basis/Java\345\237\272\347\241\200\347\237\245\350\257\206.md" @@ -1,95 +1,93 @@ -点击关注[公众号](#公众号)及时获取笔主最新更新文章,并可免费领取本文档配套的《Java 面试突击》以及 Java 工程师必备学习资源。 + - + - [1. Java 基本功](#1-java-基本功) - - [1.1. Java 入门(基础概念与常识)](#11-java-入门基础概念与常识) - - [1.1.1. Java 语言有哪些特点?](#111-java-语言有哪些特点) - - [1.1.2. 关于 JVM JDK 和 JRE 最详细通俗的解答](#112-关于-jvm-jdk-和-jre-最详细通俗的解答) - - [1.1.2.1. JVM](#1121-jvm) - - [1.1.2.2. JDK 和 JRE](#1122-jdk-和-jre) - - [1.1.3. Oracle JDK 和 OpenJDK 的对比](#113-oracle-jdk-和-openjdk-的对比) - - [1.1.4. Java 和 C++的区别?](#114-java-和-c的区别) - - [1.1.5. 什么是 Java 程序的主类 应用程序和小程序的主类有何不同?](#115-什么是-java-程序的主类-应用程序和小程序的主类有何不同) - - [1.1.6. import java 和 javax 有什么区别?](#116-import-java-和-javax-有什么区别) - - [1.1.7. 为什么说 Java 语言“编译与解释并存”?](#117-为什么说-java-语言编译与解释并存) - - [1.2. Java 语法](#12-java-语法) - - [1.2.1. 字符型常量和字符串常量的区别?](#121-字符型常量和字符串常量的区别) - - [1.2.2. 关于注释?](#122-关于注释) - - [1.2.3. 标识符和关键字的区别是什么?](#123-标识符和关键字的区别是什么) - - [1.2.4. Java中有哪些常见的关键字?](#124-java中有哪些常见的关键字) - - [1.2.5. 自增自减运算符](#125-自增自减运算符) - - [1.2.6. continue、break、和return的区别是什么?](#126-continuebreak和return的区别是什么) - - [1.2.7. Java泛型了解么?什么是类型擦除?介绍一下常用的通配符?](#127-java泛型了解么什么是类型擦除介绍一下常用的通配符) - - [1.2.8. ==和equals的区别](#128-和equals的区别) - - [1.2.9. hashCode()与 equals()](#129-hashcode与-equals) - - [1.3. 基本数据类型](#13-基本数据类型) - - [1.3.1. Java中的几种基本数据类型是什么?对应的包装类型是什么?各自占用多少字节呢?](#131-java中的几种基本数据类型是什么对应的包装类型是什么各自占用多少字节呢) - - [1.3.2. 自动装箱与拆箱](#132-自动装箱与拆箱) - - [1.3.3. 8种基本类型的包装类和常量池](#133-8种基本类型的包装类和常量池) - - [1.4. 方法(函数)](#14-方法函数) - - [1.4.1. 什么是方法的返回值?返回值在类的方法里的作用是什么?](#141-什么是方法的返回值返回值在类的方法里的作用是什么) - - [1.4.2. 为什么 Java 中只有值传递?](#142-为什么-java-中只有值传递) - - [1.4.3. 重载和重写的区别](#143-重载和重写的区别) - - [1.4.3.1. 重载](#1431-重载) - - [1.4.3.2. 重写](#1432-重写) - - [1.4.4. 深拷贝 vs 浅拷贝](#144-深拷贝-vs-浅拷贝) - - [1.4.5. 方法的四种类型](#145-方法的四种类型) + - [1.1. Java 入门(基础概念与常识)](#11-java-入门基础概念与常识) + - [1.1.1. Java 语言有哪些特点?](#111-java-语言有哪些特点) + - [1.1.2. 关于 JVM JDK 和 JRE 最详细通俗的解答](#112-关于-jvm-jdk-和-jre-最详细通俗的解答) + - [1.1.2.1. JVM](#1121-jvm) + - [1.1.2.2. JDK 和 JRE](#1122-jdk-和-jre) + - [1.1.3. Oracle JDK 和 OpenJDK 的对比](#113-oracle-jdk-和-openjdk-的对比) + - [1.1.4. Java 和 C++的区别?](#114-java-和-c的区别) + - [1.1.5. 什么是 Java 程序的主类 应用程序和小程序的主类有何不同?](#115-什么是-java-程序的主类-应用程序和小程序的主类有何不同) + - [1.1.6. import java 和 javax 有什么区别?](#116-import-java-和-javax-有什么区别) + - [1.1.7. 为什么说 Java 语言“编译与解释并存”?](#117-为什么说-java-语言编译与解释并存) + - [1.2. Java 语法](#12-java-语法) + - [1.2.1. 字符型常量和字符串常量的区别?](#121-字符型常量和字符串常量的区别) + - [1.2.2. 关于注释?](#122-关于注释) + - [1.2.3. 标识符和关键字的区别是什么?](#123-标识符和关键字的区别是什么) + - [1.2.4. Java中有哪些常见的关键字?](#124-java中有哪些常见的关键字) + - [1.2.5. 自增自减运算符](#125-自增自减运算符) + - [1.2.6. continue、break、和return的区别是什么?](#126-continue-break-和return的区别是什么) + - [1.2.7. Java泛型了解么?什么是类型擦除?介绍一下常用的通配符?](#127-java泛型了解么什么是类型擦除介绍一下常用的通配符) + - [1.2.8. ==和equals的区别](#128-和equals的区别) + - [1.2.9. hashCode()与 equals()](#129-hashcode与-equals) + - [1.3. 基本数据类型](#13-基本数据类型) + - [1.3.1. Java中的几种基本数据类型是什么?对应的包装类型是什么?各自占用多少字节呢?](#131-java中的几种基本数据类型是什么对应的包装类型是什么各自占用多少字节呢) + - [1.3.2. 自动装箱与拆箱](#132-自动装箱与拆箱) + - [1.3.3. 8种基本类型的包装类和常量池](#133-8种基本类型的包装类和常量池) + - [1.4. 方法(函数)](#14-方法函数) + - [1.4.1. 什么是方法的返回值?返回值在类的方法里的作用是什么?](#141-什么是方法的返回值返回值在类的方法里的作用是什么) + - [1.4.2. 为什么 Java 中只有值传递?](#142-为什么-java-中只有值传递) + - [1.4.3. 重载和重写的区别](#143-重载和重写的区别) + - [1.4.4. 深拷贝 vs 浅拷贝](#144-深拷贝-vs-浅拷贝) + - [1.4.5. 方法的四种类型](#145-方法的四种类型) - [2. Java 面向对象](#2-java-面向对象) - - [2.1. 类和对象](#21-类和对象) - - [2.1.1. 面向对象和面向过程的区别](#211-面向对象和面向过程的区别) - - [2.1.2. 构造器 Constructor 是否可被 override?](#212-构造器-constructor-是否可被-override) - - [2.1.3. 在 Java 中定义一个不做事且没有参数的构造方法的作用](#213-在-java-中定义一个不做事且没有参数的构造方法的作用) - - [2.1.4. 成员变量与局部变量的区别有哪些?](#214-成员变量与局部变量的区别有哪些) - - [2.1.5. 创建一个对象用什么运算符?对象实体与对象引用有何不同?](#215-创建一个对象用什么运算符对象实体与对象引用有何不同) - - [2.1.6. 一个类的构造方法的作用是什么? 若一个类没有声明构造方法,该程序能正确执行吗? 为什么?](#216-一个类的构造方法的作用是什么-若一个类没有声明构造方法该程序能正确执行吗-为什么) - - [2.1.7. 构造方法有哪些特性?](#217-构造方法有哪些特性) - - [2.1.8. 在调用子类构造方法之前会先调用父类没有参数的构造方法,其目的是?](#218-在调用子类构造方法之前会先调用父类没有参数的构造方法其目的是) - - [2.1.9. 对象的相等与指向他们的引用相等,两者有什么不同?](#219-对象的相等与指向他们的引用相等两者有什么不同) - - [2.2. 面向对象三大特征](#22-面向对象三大特征) - - [2.2.1. 封装](#221-封装) - - [2.2.2. 继承](#222-继承) - - [2.2.3. 多态](#223-多态) - - [2.3. 修饰符](#23-修饰符) - - [2.3.1. 在一个静态方法内调用一个非静态成员为什么是非法的?](#231-在一个静态方法内调用一个非静态成员为什么是非法的) - - [2.3.2. 静态方法和实例方法有何不同](#232-静态方法和实例方法有何不同) - - [2.3.3. 常见关键字总结:static,final,this,super](#233-常见关键字总结staticfinalthissuper) - - [2.4. 接口和抽象类](#24-接口和抽象类) - - [2.4.1. 接口和抽象类的区别是什么?](#241-接口和抽象类的区别是什么) - - [2.5. 其它重要知识点](#25-其它重要知识点) - - [2.5.1. String StringBuffer 和 StringBuilder 的区别是什么? String 为什么是不可变的?](#251-string-stringbuffer-和-stringbuilder-的区别是什么-string-为什么是不可变的) - - [2.5.2. Object 类的常见方法总结](#252-object-类的常见方法总结) - - [2.5.3. == 与 equals(重要)](#253--与-equals重要) - - [2.5.4. hashCode 与 equals (重要)](#254-hashcode-与-equals-重要) - - [2.5.4.1. hashCode()介绍](#2541-hashcode介绍) - - [2.5.4.2. 为什么要有 hashCode](#2542-为什么要有-hashcode) - - [2.5.4.3. hashCode()与 equals()的相关规定](#2543-hashcode与-equals的相关规定) - - [2.5.5. Java 序列化中如果有些字段不想进行序列化,怎么办?](#255-java-序列化中如果有些字段不想进行序列化怎么办) - - [2.5.6. 获取用键盘输入常用的两种方法](#256-获取用键盘输入常用的两种方法) + - [2.1. 类和对象](#21-类和对象) + - [2.1.1. 面向对象和面向过程的区别](#211-面向对象和面向过程的区别) + - [2.1.2. 构造器 Constructor 是否可被 override?](#212-构造器-constructor-是否可被-override) + - [2.1.3. 在 Java 中定义一个不做事且没有参数的构造方法的作用](#213-在-java-中定义一个不做事且没有参数的构造方法的作用) + - [2.1.4. 成员变量与局部变量的区别有哪些?](#214-成员变量与局部变量的区别有哪些) + - [2.1.5. 创建一个对象用什么运算符?对象实体与对象引用有何不同?](#215-创建一个对象用什么运算符对象实体与对象引用有何不同) + - [2.1.6. 一个类的构造方法的作用是什么? 若一个类没有声明构造方法,该程序能正确执行吗? 为什么?](#216-一个类的构造方法的作用是什么-若一个类没有声明构造方法该程序能正确执行吗-为什么) + - [2.1.7. 构造方法有哪些特性?](#217-构造方法有哪些特性) + - [2.1.8. 在调用子类构造方法之前会先调用父类没有参数的构造方法,其目的是?](#218-在调用子类构造方法之前会先调用父类没有参数的构造方法其目的是) + - [2.1.9. 对象的相等与指向他们的引用相等,两者有什么不同?](#219-对象的相等与指向他们的引用相等两者有什么不同) + - [2.2. 面向对象三大特征](#22-面向对象三大特征) + - [2.2.1. 封装](#221-封装) + - [2.2.2. 继承](#222-继承) + - [2.2.3. 多态](#223-多态) + - [2.3. 修饰符](#23-修饰符) + - [2.3.1. 在一个静态方法内调用一个非静态成员为什么是非法的?](#231-在一个静态方法内调用一个非静态成员为什么是非法的) + - [2.3.2. 静态方法和实例方法有何不同](#232-静态方法和实例方法有何不同) + - [2.3.3. 常见关键字总结:static,final,this,super](#233-常见关键字总结staticfinalthissuper) + - [2.4. 接口和抽象类](#24-接口和抽象类) + - [2.4.1. 接口和抽象类的区别是什么?](#241-接口和抽象类的区别是什么) + - [2.5. 其它重要知识点](#25-其它重要知识点) + - [2.5.1. String StringBuffer 和 StringBuilder 的区别是什么? String 为什么是不可变的?](#251-string-stringbuffer-和-stringbuilder-的区别是什么-string-为什么是不可变的) + - [2.5.2. Object 类的常见方法总结](#252-object-类的常见方法总结) + - [2.5.3. == 与 equals(重要)](#253-与-equals重要) + - [2.5.4. hashCode 与 equals (重要)](#254-hashcode-与-equals-重要) + - [2.5.4.1. hashCode()介绍](#2541-hashcode介绍) + - [2.5.4.2. 为什么要有 hashCode](#2542-为什么要有-hashcode) + - [2.5.4.3. hashCode()与 equals()的相关规定](#2543-hashcode与-equals的相关规定) + - [2.5.5. Java 序列化中如果有些字段不想进行序列化,怎么办?](#255-java-序列化中如果有些字段不想进行序列化怎么办) + - [2.5.6. 获取用键盘输入常用的两种方法](#256-获取用键盘输入常用的两种方法) - [3. Java 核心技术](#3-java-核心技术) - - [3.1. 反射机制](#31-反射机制) - - [3.1.1. 静态编译和动态编译](#311静态编译和动态编译) - - [3.1.2. 反射机制优缺点](#312反射机制优缺点) - - [3.1.3. 反射的应用场景](#313反射的应用场景) - - - [3.2. 异常](#32-异常) - - [3.2.1. Java 异常类层次结构图](#321-java-异常类层次结构图) - - [3.2.2. Throwable 类常用方法](#322-throwable-类常用方法) - - [3.2.3. try-catch-finally](#323-try-catch-finally) - - [3.2.4. 使用 `try-with-resources` 来代替`try-catch-finally`](#324-使用-try-with-resources-来代替try-catch-finally) - - [3.3. 多线程](#33-多线程) - - [3.3.1. 简述线程、程序、进程的基本概念。以及他们之间关系是什么?](#331-简述线程程序进程的基本概念以及他们之间关系是什么) - - [3.3.2. 线程有哪些基本状态?](#332-线程有哪些基本状态) - - [3.4. 文件与 I\O 流](#34-文件与-io-流) - - [3.4.1. Java 中 IO 流分为几种?](#341-java-中-io-流分为几种) - - [3.4.1.1. 既然有了字节流,为什么还要有字符流?](#3411-既然有了字节流为什么还要有字符流) - - [3.4.1.2. BIO,NIO,AIO 有什么区别?](#3412-bionioaio-有什么区别) + - [3.1. 反射机制](#31-反射机制) + - [3.1.1.静态编译和动态编译](#311静态编译和动态编译) + - [3.1.2.反射机制优缺点](#312反射机制优缺点) + - [3.1.3.反射的应用场景](#313反射的应用场景) + - [3.2. 异常](#32-异常) + - [3.2.1. Java 异常类层次结构图](#321-java-异常类层次结构图) + - [3.2.2. Throwable 类常用方法](#322-throwable-类常用方法) + - [3.2.3. try-catch-finally](#323-try-catch-finally) + - [3.2.4. 使用 `try-with-resources` 来代替`try-catch-finally`](#324-使用-try-with-resources-来代替try-catch-finally) + - [3.3. 多线程](#33-多线程) + - [3.3.1. 简述线程、程序、进程的基本概念。以及他们之间关系是什么?](#331-简述线程-程序-进程的基本概念以及他们之间关系是什么) + - [3.3.2. 线程有哪些基本状态?](#332-线程有哪些基本状态) + - [3.4. 文件与 I\O 流](#34-文件与-io-流) + - [3.4.1. Java 中 IO 流分为几种?](#341-java-中-io-流分为几种) + - [3.4.1.1. 既然有了字节流,为什么还要有字符流?](#3411-既然有了字节流为什么还要有字符流) + - [3.4.1.2. BIO,NIO,AIO 有什么区别?](#3412-bionioaio-有什么区别) - [4. 参考](#4-参考) -- [5. 公众号](#5-公众号) - + + + ## 1. Java 基本功 @@ -1394,12 +1392,3 @@ Java Io 流共涉及 40 多个类,这些类看上去很杂乱,但实际上 - https://www.educba.com/oracle-vs-openjdk/ - https://stackoverflow.com/questions/22358071/differences-between-oracle-jdk-and-openjdk?answertab=active#tab-top -## 5. 公众号 - -如果大家想要实时关注我更新的文章以及分享的干货的话,可以关注我的公众号。 - -**《Java 面试突击》:** 由本文档衍生的专为面试而生的《Java 面试突击》V2.0 PDF 版本[公众号](#公众号)后台回复 **"Java 面试突击"** 即可免费领取! - -**Java 工程师必备学习资源:** 一些 Java 工程师常用学习资源公众号后台回复关键字 **“1”** 即可免费无套路获取。 - -![我的公众号](https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-6/167598cd2e17b8ec.png) diff --git "a/docs/java/jvm/JVM\345\236\203\345\234\276\345\233\236\346\224\266.md" "b/docs/java/jvm/JVM\345\236\203\345\234\276\345\233\236\346\224\266.md" index f6ede78512e..e9d219c1a3d 100644 --- "a/docs/java/jvm/JVM\345\236\203\345\234\276\345\233\236\346\224\266.md" +++ "b/docs/java/jvm/JVM\345\236\203\345\234\276\345\233\236\346\224\266.md" @@ -300,7 +300,15 @@ JDK1.2 以后,Java 对引用的概念进行了扩充,将引用分为强引 运行时常量池主要回收的是废弃的常量。那么,我们如何判断一个常量是废弃常量呢? -假如在常量池中存在字符串 "abc",如果当前没有任何 String 对象引用该字符串常量的话,就说明常量 "abc" 就是废弃常量,如果这时发生内存回收的话而且有必要的话,"abc" 就会被系统清理出常量池。 +~~**JDK1.7 及之后版本的 JVM 已经将运行时常量池从方法区中移了出来,在 Java 堆(Heap)中开辟了一块区域存放运行时常量池。**~~ + +> 修正([issue747](https://github.com/Snailclimb/JavaGuide/issues/747),[reference](https://blog.csdn.net/q5706503/article/details/84640762)): +> +> 1. **JDK1.7之前运行时常量池逻辑包含字符串常量池存放在方法区, 此时hotspot虚拟机对方法区的实现为永久代** +> 2. **JDK1.7 字符串常量池被从方法区拿到了堆中, 这里没有提到运行时常量池,也就是说字符串常量池被单独拿到堆,运行时常量池剩下的东西还在方法区, 也就是hotspot中的永久代** 。 +> 3. **JDK1.8 hotspot移除了永久代用元空间(Metaspace)取而代之, 这时候字符串常量池还在堆, 运行时常量池还在方法区, 只不过方法区的实现从永久代变成了元空间(Metaspace)** + +假如在字符串常量池中存在字符串 "abc",如果当前没有任何 String 对象引用该字符串常量的话,就说明常量 "abc" 就是废弃常量,如果这时发生内存回收的话而且有必要的话,"abc" 就会被系统清理出常量池了。 ### 2.6 如何判断一个类是无用的类 @@ -309,8 +317,8 @@ JDK1.2 以后,Java 对引用的概念进行了扩充,将引用分为强引 判定一个常量是否是“废弃常量”比较简单,而要判定一个类是否是“无用的类”的条件则相对苛刻许多。类需要同时满足下面 3 个条件才能算是 **“无用的类”** : - 该类所有的实例都已经被回收,也就是 Java 堆中不存在该类的任何实例。 -- 加载该类的 ClassLoader 已经被回收。 -- 该类对应的 java.lang.Class 对象没有在任何地方被引用,无法在任何地方通过反射访问该类的方法。 +- 加载该类的 `ClassLoader` 已经被回收。 +- 该类对应的 `java.lang.Class` 对象没有在任何地方被引用,无法在任何地方通过反射访问该类的方法。 虚拟机可以对满足上述 3 个条件的无用类进行回收,这里说的仅仅是“可以”,而并不是和对象一样不使用了就会必然被回收。 diff --git "a/docs/java/jvm/Java\345\206\205\345\255\230\345\214\272\345\237\237.md" "b/docs/java/jvm/Java\345\206\205\345\255\230\345\214\272\345\237\237.md" index 42dc7b7cb8d..01e4984312e 100644 --- "a/docs/java/jvm/Java\345\206\205\345\255\230\345\214\272\345\237\237.md" +++ "b/docs/java/jvm/Java\345\206\205\345\255\230\345\214\272\345\237\237.md" @@ -304,14 +304,14 @@ JDK1.4 中新加入的 **NIO(New Input/Output) 类**,引入了一种基于** ### 3.3 对象的访问定位 建立对象就是为了使用对象,我们的 Java 程序通过栈上的 reference 数据来操作堆上的具体对象。对象的访问方式由虚拟机实现而定,目前主流的访问方式有**①使用句柄**和**②直接指针**两种: -1. **句柄:** 如果使用句柄的话,那么 Java 堆中将会划分出一块内存来作为句柄池,reference 中存储的就是对象的句柄地址,而句柄中包含了对象实例数据与类型数据各自的具体地址信息; - - ![对象的访问定位-使用句柄](./pictures/java内存区域/对象的访问定位-使用句柄.png) +1. **句柄:** 如果使用句柄的话,那么 Java 堆中将会划分出一块内存来作为句柄池,reference 中存储的就是对象的句柄地址,而句柄中包含了对象实例数据与类型数据各自的具体地址信息; ![对象的访问定位-使用句柄](./pictures/java内存区域/对象的访问定位-使用句柄.png) 2. **直接指针:** 如果使用直接指针访问,那么 Java 堆对象的布局中就必须考虑如何放置访问类型数据的相关信息,而 reference 中存储的直接就是对象的地址。 ![对象的访问定位-直接指针](./pictures/java内存区域/对象的访问定位-直接指针.png) + + **这两种对象访问方式各有优势。使用句柄来访问的最大好处是 reference 中存储的是稳定的句柄地址,在对象被移动时只会改变句柄中的实例数据指针,而 reference 本身不需要修改。使用直接指针访问方式最大的好处就是速度快,它节省了一次指针定位的时间开销。** diff --git "a/docs/java/jvm/pictures/java\345\206\205\345\255\230\345\214\272\345\237\237/\345\257\271\350\261\241\347\232\204\350\256\277\351\227\256\345\256\232\344\275\215-\344\275\277\347\224\250\345\217\245\346\237\204.png" "b/docs/java/jvm/pictures/java\345\206\205\345\255\230\345\214\272\345\237\237/\345\257\271\350\261\241\347\232\204\350\256\277\351\227\256\345\256\232\344\275\215-\344\275\277\347\224\250\345\217\245\346\237\204.png" new file mode 100644 index 00000000000..88b494732af Binary files /dev/null and "b/docs/java/jvm/pictures/java\345\206\205\345\255\230\345\214\272\345\237\237/\345\257\271\350\261\241\347\232\204\350\256\277\351\227\256\345\256\232\344\275\215-\344\275\277\347\224\250\345\217\245\346\237\204.png" differ diff --git "a/docs/java/jvm/pictures/java\345\206\205\345\255\230\345\214\272\345\237\237/\345\257\271\350\261\241\347\232\204\350\256\277\351\227\256\345\256\232\344\275\215-\347\233\264\346\216\245\346\214\207\351\222\210.png" "b/docs/java/jvm/pictures/java\345\206\205\345\255\230\345\214\272\345\237\237/\345\257\271\350\261\241\347\232\204\350\256\277\351\227\256\345\256\232\344\275\215-\347\233\264\346\216\245\346\214\207\351\222\210.png" index 145bd405c21..f954d8a7375 100644 Binary files "a/docs/java/jvm/pictures/java\345\206\205\345\255\230\345\214\272\345\237\237/\345\257\271\350\261\241\347\232\204\350\256\277\351\227\256\345\256\232\344\275\215-\347\233\264\346\216\245\346\214\207\351\222\210.png" and "b/docs/java/jvm/pictures/java\345\206\205\345\255\230\345\214\272\345\237\237/\345\257\271\350\261\241\347\232\204\350\256\277\351\227\256\345\256\232\344\275\215-\347\233\264\346\216\245\346\214\207\351\222\210.png" differ diff --git "a/docs/java/multi-thread/java\347\272\277\347\250\213\346\261\240\345\255\246\344\271\240\346\200\273\347\273\223.md" "b/docs/java/multi-thread/java\347\272\277\347\250\213\346\261\240\345\255\246\344\271\240\346\200\273\347\273\223.md" index 6a946dd0206..890588a2672 100644 --- "a/docs/java/multi-thread/java\347\272\277\347\250\213\346\261\240\345\255\246\344\271\240\346\200\273\347\273\223.md" +++ "b/docs/java/multi-thread/java\347\272\277\347\250\213\346\261\240\345\255\246\344\271\240\346\200\273\347\273\223.md" @@ -91,7 +91,7 @@ public class ThreadPoolExecutor extends AbstractExecutorService **`ScheduledThreadPoolExecutor` 类描述:** ```java -//ScheduledExecutorService实现了ExecutorService接口 +//ScheduledExecutorService继承ExecutorService接口 public class ScheduledThreadPoolExecutor extends ThreadPoolExecutor implements ScheduledExecutorService