From faf3ae3a5db0e1a0fd89fa62782c82e15b1c4dde Mon Sep 17 00:00:00 2001 From: async Date: Sun, 16 May 2021 10:44:29 +0800 Subject: [PATCH 01/10] =?UTF-8?q?Update=20ArrayList=E6=BA=90=E7=A0=81+?= =?UTF-8?q?=E6=89=A9=E5=AE=B9=E6=9C=BA=E5=88=B6=E5=88=86=E6=9E=90.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit fix: typo error --- docs/java/collection/ArrayList源码+扩容机制分析.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/java/collection/ArrayList源码+扩容机制分析.md b/docs/java/collection/ArrayList源码+扩容机制分析.md index 1a04914f..a30ba17e 100644 --- a/docs/java/collection/ArrayList源码+扩容机制分析.md +++ b/docs/java/collection/ArrayList源码+扩容机制分析.md @@ -894,7 +894,7 @@ public class EnsureCapacityTest { 运行结果: ``` -使用ensureCapacity方法前:1773 +使用ensureCapacity方法后:1773 ``` 通过运行结果,我们可以看出向 ArrayList 添加大量元素之前最好先使用`ensureCapacity` 方法,以减少增量重新分配的次数。 From 6295b7a46d505a61a9d44846e1a6c71782fb4a7c Mon Sep 17 00:00:00 2001 From: guide Date: Wed, 19 May 2021 20:12:16 +0800 Subject: [PATCH 02/10] =?UTF-8?q?Update=20ArrayList=E6=BA=90=E7=A0=81+?= =?UTF-8?q?=E6=89=A9=E5=AE=B9=E6=9C=BA=E5=88=B6=E5=88=86=E6=9E=90.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/java/collection/ArrayList源码+扩容机制分析.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/java/collection/ArrayList源码+扩容机制分析.md b/docs/java/collection/ArrayList源码+扩容机制分析.md index 1a04914f..a30ba17e 100644 --- a/docs/java/collection/ArrayList源码+扩容机制分析.md +++ b/docs/java/collection/ArrayList源码+扩容机制分析.md @@ -894,7 +894,7 @@ public class EnsureCapacityTest { 运行结果: ``` -使用ensureCapacity方法前:1773 +使用ensureCapacity方法后:1773 ``` 通过运行结果,我们可以看出向 ArrayList 添加大量元素之前最好先使用`ensureCapacity` 方法,以减少增量重新分配的次数。 From 470b56b35ad830e235d39c1f9f53286176ebceb8 Mon Sep 17 00:00:00 2001 From: jguo Date: Fri, 21 May 2021 11:39:41 -0700 Subject: [PATCH 03/10] =?UTF-8?q?Update=20=E5=8F=8D=E5=B0=84=E6=9C=BA?= =?UTF-8?q?=E5=88=B6.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit fix typo --- docs/java/basis/反射机制.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/java/basis/反射机制.md b/docs/java/basis/反射机制.md index 0e2389b5..d6fe4263 100644 --- a/docs/java/basis/反射机制.md +++ b/docs/java/basis/反射机制.md @@ -80,7 +80,7 @@ Class alunbarClass2 = o.getClass(); **4.通过类加载器`xxxClassLoader.loadClass()`传入类路径获取:** ```java -class clazz = ClassLoader.LoadClass("cn.javaguide.TargetObject"); +Class clazz = ClassLoader.loadClass("cn.javaguide.TargetObject"); ``` 通过类加载器获取 Class 对象不会进行初始化,意味着不进行包括初始化等一些列步骤,静态块和静态对象不会得到执行 @@ -173,4 +173,4 @@ value is JavaGuide ```java Class tagetClass = Class.forName("cn.javaguide.TargetObject"); -``` \ No newline at end of file +``` From ae531bf22c2d4a9118d77f8c72dfbc0357c04f3c Mon Sep 17 00:00:00 2001 From: guide Date: Sun, 23 May 2021 20:20:02 +0800 Subject: [PATCH 04/10] =?UTF-8?q?[fix]=20=E5=8A=A8=E6=80=81=E5=AF=B9?= =?UTF-8?q?=E8=B1=A1=E5=B9=B4=E9=BE=84=E5=88=A4=E5=AE=9A=E6=8F=8F=E8=BF=B0?= =?UTF-8?q?=E4=B8=8D=E5=87=86=E7=A1=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/java/jvm/JVM垃圾回收.md | 36 ++++++++++++++++++-------------- 1 file changed, 20 insertions(+), 16 deletions(-) diff --git a/docs/java/jvm/JVM垃圾回收.md b/docs/java/jvm/JVM垃圾回收.md index d657f3b8..d25667a5 100644 --- a/docs/java/jvm/JVM垃圾回收.md +++ b/docs/java/jvm/JVM垃圾回收.md @@ -176,26 +176,30 @@ public class GCTest { 大部分情况,对象都会首先在 Eden 区域分配,在一次新生代垃圾回收后,如果对象还存活,则会进入 s0 或者 s1,并且对象的年龄还会加 1(Eden 区->Survivor 区后对象的初始年龄变为 1),当它的年龄增加到一定程度(默认为 15 岁),就会被晋升到老年代中。对象晋升到老年代的年龄阈值,可以通过参数 `-XX:MaxTenuringThreshold` 来设置。 -> 修正([issue552](https://github.com/Snailclimb/JavaGuide/issues/552)):“Hotspot 遍历所有对象时,按照年龄从小到大对其所占用的大小进行累积,当累积的某个年龄大小超过了 survivor 区的一半时,取这个年龄和 MaxTenuringThreshold 中更小的一个值,作为新的晋升年龄阈值”。 +> 修正([issue552](https://github.com/Snailclimb/JavaGuide/issues/552)):“Hotspot 遍历所有对象时,按照年龄从小到大对其所占用的大小进行累积,当累积的某个年龄大小超过了 survivor 区的 50% 时(默认值是 50%,可以通过 `-XX:TargetSurvivorRatio=percent` 来设置,参见 [issue1199](https://github.com/Snailclimb/JavaGuide/issues/1199) ),取这个年龄和 MaxTenuringThreshold 中更小的一个值,作为新的晋升年龄阈值”。 > -> **动态年龄计算的代码如下** +> jdk8官方文档引用 :https://docs.oracle.com/javase/8/docs/technotes/tools/unix/java.html 。 +> +> ![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/java-guide-blog/image-20210523201742303.png) +> +> **动态年龄计算的代码如下:** > > ```c++ > uint ageTable::compute_tenuring_threshold(size_t survivor_capacity) { -> //survivor_capacity是survivor空间的大小 -> size_t desired_survivor_size = (size_t)((((double)survivor_capacity)*TargetSurvivorRatio)/100); -> size_t total = 0; -> uint age = 1; -> while (age < table_size) { -> //sizes数组是每个年龄段对象大小 -> total += sizes[age]; -> if (total > desired_survivor_size) { -> break; -> } -> age++; -> } -> uint result = age < MaxTenuringThreshold ? age : MaxTenuringThreshold; -> ... +> //survivor_capacity是survivor空间的大小 +> size_t desired_survivor_size = (size_t)((((double)survivor_capacity)*TargetSurvivorRatio)/100); +> size_t total = 0; +> uint age = 1; +> while (age < table_size) { +> //sizes数组是每个年龄段对象大小 +> total += sizes[age]; +> if (total > desired_survivor_size) { +> break; +> } +> age++; +> } +> uint result = age < MaxTenuringThreshold ? age : MaxTenuringThreshold; +> ... > } > > ``` From 2062c3e9c6fe5e489042cfa1e565b4961a64aeaa Mon Sep 17 00:00:00 2001 From: guide Date: Sun, 23 May 2021 20:56:00 +0800 Subject: [PATCH 05/10] =?UTF-8?q?[fix]=20=E6=95=B4=E5=9E=8B=E5=8C=85?= =?UTF-8?q?=E8=A3=85=E7=B1=BB=E5=80=BC=E7=9A=84=E6=AF=94=E8=BE=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/java/basis/Java基础知识疑难点.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/docs/java/basis/Java基础知识疑难点.md b/docs/java/basis/Java基础知识疑难点.md index 3688a0e6..b11de0c5 100644 --- a/docs/java/basis/Java基础知识疑难点.md +++ b/docs/java/basis/Java基础知识疑难点.md @@ -72,16 +72,16 @@ Reference:[Java中equals方法造成空指针异常的原因及解决方案](htt 先看下面这个例子: ```java -Integer x = 3; -Integer y = 3; -System.out.println(x == y);// true -Integer a = new Integer(3); -Integer b = new Integer(3); -System.out.println(a == b);//false -System.out.println(a.equals(b));//true +Integer i1 = 40; +Integer i2 = new Integer(40); +System.out.println(i1==i2);//false ``` -当使用自动装箱方式创建一个Integer对象时,当数值在-128 ~127时,会将创建的 Integer 对象缓存起来,当下次再出现该数值时,直接从缓存中取出对应的Integer对象。所以上述代码中,x和y引用的是相同的Integer对象。 +`Integer i1=40` 这一行代码会发生拆箱,也就是说这行代码等价于 `Integer i1=Integer.valueOf(40)` 。因此,`i1` 直接使用的是常量池中的对象。而`Integer i1 = new Integer(40)` 会直接创建新的对象。因此,输出 false 。 + +记住:**所有整型包装类对象之间值的比较,全部使用 `equals()` 方法比较**。 + +![](https://img-blog.csdnimg.cn/20210313164740893.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM0MzM3Mjcy,size_16,color_FFFFFF,t_70) **注意:** 如果你的IDE(IDEA/Eclipse)上安装了阿里巴巴的p3c插件,这个插件如果检测到你用 ==的话会报错提示,推荐安装一个这个插件,很不错。 From 2fbd08922c58680eefc4783675c28f74393888e8 Mon Sep 17 00:00:00 2001 From: guide Date: Sun, 23 May 2021 21:04:50 +0800 Subject: [PATCH 06/10] =?UTF-8?q?Update=20Java=E9=9B=86=E5=90=88=E6=A1=86?= =?UTF-8?q?=E6=9E=B6=E5=B8=B8=E8=A7=81=E9=9D=A2=E8=AF=95=E9=A2=98.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/java/collection/Java集合框架常见面试题.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/java/collection/Java集合框架常见面试题.md b/docs/java/collection/Java集合框架常见面试题.md index 9cc5b54f..63e67002 100644 --- a/docs/java/collection/Java集合框架常见面试题.md +++ b/docs/java/collection/Java集合框架常见面试题.md @@ -86,7 +86,7 @@ - `HashMap`: JDK1.8 之前 `HashMap` 由数组+链表组成的,数组是 `HashMap` 的主体,链表则是主要为了解决哈希冲突而存在的(“拉链法”解决冲突)。JDK1.8 以后在解决哈希冲突时有了较大的变化,当链表长度大于阈值(默认为 8)(将链表转换成红黑树前会判断,如果当前数组的长度小于 64,那么会选择先进行数组扩容,而不是转换为红黑树)时,将链表转化为红黑树,以减少搜索时间 - `LinkedHashMap`: `LinkedHashMap` 继承自 `HashMap`,所以它的底层仍然是基于拉链式散列结构即由数组和链表或红黑树组成。另外,`LinkedHashMap` 在上面结构的基础上,增加了一条双向链表,使得上面的结构可以保持键值对的插入顺序。同时通过对链表进行相应的操作,实现了访问顺序相关逻辑。详细可以查看:[《LinkedHashMap 源码详细分析(JDK1.8)》](https://www.imooc.com/article/22931) -- `Hashtable`: 数组+链表组成的,数组是 `HashMap` 的主体,链表则是主要为了解决哈希冲突而存在的 +- `Hashtable`: 数组+链表组成的,数组是 `Hashtable` 的主体,链表则是主要为了解决哈希冲突而存在的 - `TreeMap`: 红黑树(自平衡的排序二叉树) ### 1.1.4. 如何选用集合? From 7c567657853e6ac3082d3362aeead1f126b6e895 Mon Sep 17 00:00:00 2001 From: guide Date: Sun, 23 May 2021 21:30:29 +0800 Subject: [PATCH 07/10] =?UTF-8?q?Update=20java=E7=BA=BF=E7=A8=8B=E6=B1=A0?= =?UTF-8?q?=E5=AD=A6=E4=B9=A0=E6=80=BB=E7=BB=93.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/java/multi-thread/java线程池学习总结.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/java/multi-thread/java线程池学习总结.md b/docs/java/multi-thread/java线程池学习总结.md index 18b12001..66d835fd 100644 --- a/docs/java/multi-thread/java线程池学习总结.md +++ b/docs/java/multi-thread/java线程池学习总结.md @@ -545,7 +545,7 @@ public interface Callable { 1. **`execute()`方法用于提交不需要返回值的任务,所以无法判断任务是否被线程池执行成功与否;** 2. **`submit()`方法用于提交需要返回值的任务。线程池会返回一个 `Future` 类型的对象,通过这个 `Future` 对象可以判断任务是否执行成功** ,并且可以通过 `Future` 的 `get()`方法来获取返回值,`get()`方法会阻塞当前线程直到任务完成,而使用 `get(long timeout,TimeUnit unit)`方法则会阻塞当前线程一段时间后立即返回,这时候有可能任务没有执行完。 -我们以**`AbstractExecutorService`**接口中的一个 `submit` 方法为例子来看看源代码: +我们以 **`AbstractExecutorService`** 接口中的一个 `submit()` 方法为例子来看看源代码: ```java public Future submit(Runnable task) { From c27b54539a77d1682fb14c070d7908376d8ec942 Mon Sep 17 00:00:00 2001 From: 2293736867 <2293736867@qq.com> Date: Mon, 24 May 2021 09:55:14 +0800 Subject: [PATCH 08/10] =?UTF-8?q?Object=E7=B1=BB=E6=96=B9=E6=B3=95?= =?UTF-8?q?=E6=8E=92=E7=89=88=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/java/basis/Java基础知识.md | 36 ++++++++++------------------- 1 file changed, 12 insertions(+), 24 deletions(-) diff --git a/docs/java/basis/Java基础知识.md b/docs/java/basis/Java基础知识.md index f526cd0d..40c9e873 100644 --- a/docs/java/basis/Java基础知识.md +++ b/docs/java/basis/Java基础知识.md @@ -1118,30 +1118,18 @@ abstract class AbstractStringBuilder implements Appendable, CharSequence { Object 类是一个特殊的类,是所有类的父类。它主要提供了以下 11 个方法: -```java +- `public final native Class getClass()`:`native`方法,用于返回当前运行时对象的`Class`对象,使用了`final`关键字修饰,故不允许子类重写 +- `public native int hashCode()`:`native`方法,用于返回对象的哈希码,主要使用在哈希表中,比如`HashMap` +- `public boolean equals(Object obj)`:用于比较两个对象的内存地址是否相等,`String`类对该方法进行了重写,判断用户比较字符串的值是否相等 +- `protected native Object clone() throws CloneNotSupportedException`:`naitive`方法,用于创建并返回当前对象的一份拷贝。一般情况下,对于任何对象`x`,表达式`x.clone() != x`为`true`,`x.clone().getClass() == x.getClass()`为`true`。`Object`本身没有实现`Cloneable`接口,所以不重写`clone`方法并且进行调用的话会发生`CloneNotSupportedException`异常 +- `public String toString()`:返回`类的名字@实例的哈希码`的16进制的字符串。建议`Object`所有的子类都重写这个方法 +- `public final native void notify()`:`native`方法,并且不能重写。唤醒一个在此对象监视器上等待的线程(监视器相当于就是锁的概念),如果有多个线程在等待只会任意唤醒一个 +- `public final native void notifyAll()`:`native`方法,并且不能重写。跟`notify`一样,唯一的区别就是会唤醒在此对象监视器上等待的所有线程,而不是一个线程 +- `public final native void wait(long timeout) throws InterruptedException`:`native`方法,并且不能重写。暂停线程的执行。注意:`sleep`方法没有释放锁,而`wait`方法释放了锁 ,`timeout`是等待时间 +- `public final void wait(long timeout, int nanos) throws InterruptedException`:多了`nanos`参数,这个参数表示额外时间(以毫微秒为单位,范围是`0-999999`), 所以超时的时间还需要加上`nanos`毫秒 +- `public final void wait() throws InterruptedException`:跟之前的2个`wait`方法一样,只不过该方法一直等待,没有超时时间这个概念 +- `protected void finalize() throws Throwable { }`:实例被垃圾回收器回收的时候触发的操作 -public final native Class getClass()//native方法,用于返回当前运行时对象的Class对象,使用了final关键字修饰,故不允许子类重写。 - -public native int hashCode() //native方法,用于返回对象的哈希码,主要使用在哈希表中,比如JDK中的HashMap。 -public boolean equals(Object obj)//用于比较2个对象的内存地址是否相等,String类对该方法进行了重写用户比较字符串的值是否相等。 - -protected native Object clone() throws CloneNotSupportedException//naitive方法,用于创建并返回当前对象的一份拷贝。一般情况下,对于任何对象 x,表达式 x.clone() != x 为true,x.clone().getClass() == x.getClass() 为true。Object本身没有实现Cloneable接口,所以不重写clone方法并且进行调用的话会发生CloneNotSupportedException异常。 - -public String toString()//返回类的名字@实例的哈希码的16进制的字符串。建议Object所有的子类都重写这个方法。 - -public final native void notify()//native方法,并且不能重写。唤醒一个在此对象监视器上等待的线程(监视器相当于就是锁的概念)。如果有多个线程在等待只会任意唤醒一个。 - -public final native void notifyAll()//native方法,并且不能重写。跟notify一样,唯一的区别就是会唤醒在此对象监视器上等待的所有线程,而不是一个线程。 - -public final native void wait(long timeout) throws InterruptedException//native方法,并且不能重写。暂停线程的执行。注意:sleep方法没有释放锁,而wait方法释放了锁 。timeout是等待时间。 - -public final void wait(long timeout, int nanos) throws InterruptedException//多了nanos参数,这个参数表示额外时间(以毫微秒为单位,范围是 0-999999)。 所以超时的时间还需要加上nanos毫秒。 - -public final void wait() throws InterruptedException//跟之前的2个wait方法一样,只不过该方法一直等待,没有超时时间这个概念 - -protected void finalize() throws Throwable { }//实例被垃圾回收器回收的时候触发的操作 - -``` ## 反射 @@ -1400,4 +1388,4 @@ Java Io 流共涉及 40 多个类,这些类看上去很杂乱,但实际上 - https://stackoverflow.com/questions/1906445/what-is-the-difference-between-jdk-and-jre - https://www.educba.com/oracle-vs-openjdk/ -- https://stackoverflow.com/questions/22358071/differences-between-oracle-jdk-and-openjdk?answertab=active#tab-top## 基础概念与常识 \ No newline at end of file +- https://stackoverflow.com/questions/22358071/differences-between-oracle-jdk-and-openjdk?answertab=active#tab-top## 基础概念与常识 From 9cc9218c71de155d4e2d09897264a05d1da390ba Mon Sep 17 00:00:00 2001 From: tangj1992 <694756023@qq.com> Date: Mon, 24 May 2021 10:37:30 +0800 Subject: [PATCH 09/10] =?UTF-8?q?Update=20ConcurrentHashMap=E6=BA=90?= =?UTF-8?q?=E7=A0=81+=E5=BA=95=E5=B1=82=E6=95=B0=E6=8D=AE=E7=BB=93?= =?UTF-8?q?=E6=9E=84=E5=88=86=E6=9E=90.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修改错别字 --- .../ConcurrentHashMap源码+底层数据结构分析.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/java/collection/ConcurrentHashMap源码+底层数据结构分析.md b/docs/java/collection/ConcurrentHashMap源码+底层数据结构分析.md index ebabf4a4..cb5ce818 100644 --- a/docs/java/collection/ConcurrentHashMap源码+底层数据结构分析.md +++ b/docs/java/collection/ConcurrentHashMap源码+底层数据结构分析.md @@ -91,7 +91,7 @@ public ConcurrentHashMap(int initialCapacity,float loadFactor, int concurrencyLe 总结一下在 Java 7 中 ConcurrnetHashMap 的初始化逻辑。 1. 必要参数校验。 -2. 校验并发级别 concurrencyLevel 大小,如果大于最大值,重置为最大值。无惨构造**默认值是 16.** +2. 校验并发级别 concurrencyLevel 大小,如果大于最大值,重置为最大值。无参构造**默认值是 16.** 3. 寻找并发级别 concurrencyLevel 之上最近的 **2 的幂次方**值,作为初始化容量大小,**默认是 16**。 4. 记录 segmentShift 偏移量,这个值为【容量 = 2 的N次方】中的 N,在后面 Put 时计算位置时会用到。**默认是 32 - sshift = 28**. 5. 记录 segmentMask,默认是 ssize - 1 = 16 -1 = 15. From 513258a7f44876d8f981e4d41dc7294a3ef6dd9f Mon Sep 17 00:00:00 2001 From: guide Date: Tue, 25 May 2021 23:15:13 +0800 Subject: [PATCH 10/10] =?UTF-8?q?Update=20Java=E5=9F=BA=E7=A1=80=E7=9F=A5?= =?UTF-8?q?=E8=AF=86.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/java/basis/Java基础知识.md | 33 +++++++++++++++++++---------- 1 file changed, 22 insertions(+), 11 deletions(-) diff --git a/docs/java/basis/Java基础知识.md b/docs/java/basis/Java基础知识.md index 40c9e873..4911d88f 100644 --- a/docs/java/basis/Java基础知识.md +++ b/docs/java/basis/Java基础知识.md @@ -1118,17 +1118,28 @@ abstract class AbstractStringBuilder implements Appendable, CharSequence { Object 类是一个特殊的类,是所有类的父类。它主要提供了以下 11 个方法: -- `public final native Class getClass()`:`native`方法,用于返回当前运行时对象的`Class`对象,使用了`final`关键字修饰,故不允许子类重写 -- `public native int hashCode()`:`native`方法,用于返回对象的哈希码,主要使用在哈希表中,比如`HashMap` -- `public boolean equals(Object obj)`:用于比较两个对象的内存地址是否相等,`String`类对该方法进行了重写,判断用户比较字符串的值是否相等 -- `protected native Object clone() throws CloneNotSupportedException`:`naitive`方法,用于创建并返回当前对象的一份拷贝。一般情况下,对于任何对象`x`,表达式`x.clone() != x`为`true`,`x.clone().getClass() == x.getClass()`为`true`。`Object`本身没有实现`Cloneable`接口,所以不重写`clone`方法并且进行调用的话会发生`CloneNotSupportedException`异常 -- `public String toString()`:返回`类的名字@实例的哈希码`的16进制的字符串。建议`Object`所有的子类都重写这个方法 -- `public final native void notify()`:`native`方法,并且不能重写。唤醒一个在此对象监视器上等待的线程(监视器相当于就是锁的概念),如果有多个线程在等待只会任意唤醒一个 -- `public final native void notifyAll()`:`native`方法,并且不能重写。跟`notify`一样,唯一的区别就是会唤醒在此对象监视器上等待的所有线程,而不是一个线程 -- `public final native void wait(long timeout) throws InterruptedException`:`native`方法,并且不能重写。暂停线程的执行。注意:`sleep`方法没有释放锁,而`wait`方法释放了锁 ,`timeout`是等待时间 -- `public final void wait(long timeout, int nanos) throws InterruptedException`:多了`nanos`参数,这个参数表示额外时间(以毫微秒为单位,范围是`0-999999`), 所以超时的时间还需要加上`nanos`毫秒 -- `public final void wait() throws InterruptedException`:跟之前的2个`wait`方法一样,只不过该方法一直等待,没有超时时间这个概念 -- `protected void finalize() throws Throwable { }`:实例被垃圾回收器回收的时候触发的操作 +```java +public final native Class getClass()//native方法,用于返回当前运行时对象的Class对象,使用了final关键字修饰,故不允许子类重写。 + +public native int hashCode() //native方法,用于返回对象的哈希码,主要使用在哈希表中,比如JDK中的HashMap。 +public boolean equals(Object obj)//用于比较2个对象的内存地址是否相等,String类对该方法进行了重写用户比较字符串的值是否相等。 + +protected native Object clone() throws CloneNotSupportedException//naitive方法,用于创建并返回当前对象的一份拷贝。一般情况下,对于任何对象 x,表达式 x.clone() != x 为true,x.clone().getClass() == x.getClass() 为true。Object本身没有实现Cloneable接口,所以不重写clone方法并且进行调用的话会发生CloneNotSupportedException异常。 + +public String toString()//返回类的名字@实例的哈希码的16进制的字符串。建议Object所有的子类都重写这个方法。 + +public final native void notify()//native方法,并且不能重写。唤醒一个在此对象监视器上等待的线程(监视器相当于就是锁的概念)。如果有多个线程在等待只会任意唤醒一个。 + +public final native void notifyAll()//native方法,并且不能重写。跟notify一样,唯一的区别就是会唤醒在此对象监视器上等待的所有线程,而不是一个线程。 + +public final native void wait(long timeout) throws InterruptedException//native方法,并且不能重写。暂停线程的执行。注意:sleep方法没有释放锁,而wait方法释放了锁 。timeout是等待时间。 + +public final void wait(long timeout, int nanos) throws InterruptedException//多了nanos参数,这个参数表示额外时间(以毫微秒为单位,范围是 0-999999)。 所以超时的时间还需要加上nanos毫秒。 + +public final void wait() throws InterruptedException//跟之前的2个wait方法一样,只不过该方法一直等待,没有超时时间这个概念 + +protected void finalize() throws Throwable { }//实例被垃圾回收器回收的时候触发的操作 +``` ## 反射