提交 db70fa9a 编写于 作者: 沉默王二's avatar 沉默王二 💬

java重要知识点

上级 ff5cd61b
......@@ -191,26 +191,26 @@
## Java重要知识点
- [彻底弄懂Java中的Unicode和UTF-8编码](docs/basic-extra-meal/java-unicode.md)
- [Java中int、Integer、new Integer之间的区别](docs/basic-extra-meal/int-cache.md)
- [Java中new Integer与Integer.valueOf的区别](docs/basic-extra-meal/int-cache.md)
- [深入剖析Java中的拆箱和装箱](docs/basic-extra-meal/box.md)
- [彻底讲明白的Java浅拷贝与深拷贝](docs/basic-extra-meal/deep-copy.md)
- [一文彻底讲明白的Java中的浅拷贝与深拷贝](docs/basic-extra-meal/deep-copy.md)
- [深入理解Java中的hashCode方法](docs/basic-extra-meal/hashcode.md)
- [一次性搞清楚equals和hashCode](docs/basic-extra-meal/equals-hashcode.md)
- [为什么重写equals方法的时候必须要重写hashCode方法?](docs/basic-extra-meal/equals-hashcode.md)
- [Java重写(Overriding)时应当遵守的11条规则](docs/basic-extra-meal/Overriding.md)
- [Java到底是值传递还是引用传递?](docs/basic-extra-meal/pass-by-value.md)
- [Java不能实现真正泛型的原因是什么?](docs/basic-extra-meal/true-generic.md)
- [详解Java中Comparable和Comparator的区别](docs/basic-extra-meal/comparable-omparator.md)
- [jdk9为何要将String的底层实现由char[]改成了byte[]?](docs/basic-extra-meal/jdk9-char-byte-string.md)
- [详解Java中Comparable和Comparator接口的区别](docs/basic-extra-meal/comparable-omparator.md)
- [jdk9为什么要将String的底层实现由char数组改成了byte数组?](docs/basic-extra-meal/jdk9-char-byte-string.md)
- [为什么JDK源码中,无限循环大多使用for(;;)而不是while(true)?](docs/basic-extra-meal/jdk-while-for-wuxian-xunhuan.md)
- [先有Class还是先有Object?](docs/basic-extra-meal/class-object.md)
- [Java 中,先有Class还是先有Object?](docs/basic-extra-meal/class-object.md)
- [详解Java中instanceof关键字的用法](docs/oo/instanceof.md)
- [instanceof关键字是如何实现的?](docs/basic-extra-meal/instanceof-jvm.md)
- [Java instanceof关键字用法](docs/oo/instanceof.md)
- [深入理解Java中的不可变对象](docs/basic-extra-meal/immutable.md)
- [Java中可变参数的使用](docs/basic-extra-meal/varables.md)
- [深入理解Java泛型](docs/basic-extra-meal/generic.md)
- [深入理解Java注解](docs/basic-extra-meal/annotation.md)
- [Java枚举(enum)](docs/basic-extra-meal/enum.md)
- [大白话说Java反射:入门、使用、原理](docs/basic-extra-meal/fanshe.md)
- [深入理解Java中的泛型](docs/basic-extra-meal/generic.md)
- [Java不能实现真正泛型的原因是什么?](docs/basic-extra-meal/true-generic.md)
- [深入理解Java中的注解](docs/basic-extra-meal/annotation.md)
- [新来个技术总监,彻底把 Java 枚举(enum)讲清楚了](docs/basic-extra-meal/enum.md)
- [大白话说清楚Java反射:入门、使用、原理](docs/basic-extra-meal/fanshe.md)
## Java网络编程
......
......@@ -198,90 +198,27 @@ export const sidebarConfig = sidebar({
prefix:"basic-extra-meal/",
collapsable: true,
children: [
{
text: "Unicode和UTF-8编码",
link: "java-unicode",
},
{
text: "new Integer和Integer.valueOf区别",
link: "int-cache",
},
{
text: "拆箱和装箱",
link: "box",
},
{
text: "浅拷贝与深拷贝",
link: "deep-copy",
},
{
text: "深入理解Java中的hashCode方法",
link: "hashcode",
},
{
text: "重写equals时为什么要重写hashCode",
link: "equals-hashcode",
},
{
text: "重写时应当遵守的11条规则",
link: "Overriding",
},
{
text: "Java到底是值传递还是引用传递",
link: "pass-by-value",
},
{
text: "Java为什么不能实现真正的泛型",
link: "true-generic",
},
{
text: "Comparable和Comparator的区别",
link: "comparable-omparator",
},
{
text: "JDK9中String为什么由char[]改成byte[]",
link: "jdk9-char-byte-string",
},
{
text: "JDK源码无限循环用for(;;)还是while(true)",
link: "jdk-while-for-wuxian-xunhuan",
},
{
text: "先有Class还是先有Object",
link: "class-object",
},
{
text: "instanceof关键字是如何实现的",
link: "instanceof-jvm",
},
{
text: "instanceof",
link: "oo/instanceof",
},
{
text: "不可变对象",
link: "basic-extra-meal/immutable",
},
{
text: "可变参数",
link: "basic-extra-meal/varables",
},
{
text: "泛型",
link: "basic-extra-meal/generic",
},
{
text: "注解",
link: "basic-extra-meal/annotation",
},
{
text: "枚举",
link: "basic-extra-meal/enum",
},
{
text: "反射",
link: "basic-extra-meal/fanshe",
},
"java-unicode",
"int-cache",
"box",
"deep-copy",
"hashcode",
"equals-hashcode",
"Overriding",
"pass-by-value",
"comparable-omparator",
"jdk9-char-byte-string",
"jdk-while-for-wuxian-xunhuan",
"class-object",
"instanceof",
"instanceof-jvm",
"immutable"
"varables",
"generic",
"true-generic",
"annotation",
"enum",
"fanshe",
],
},
{
......
---
title: Java重写(Overriding)时应当遵守的11条规则
shortTitle: 重写时应当遵守的11条规则
category:
- Java核心
tag:
- Java
- Java重要知识点
description: Java程序员进阶之路,小白的零基础Java教程,从入门到进阶,Java重写(Overriding)时应当遵守的11条规则
head:
- - meta
- name: keywords
content: Java,Java SE,Java基础,Java教程,Java程序员进阶之路,Java入门,教程,java,重写,Overriding
---
# Java重写(Overriding)时应当遵守的11条规则
重写(Overriding)算是 Java 中一个非常重要的概念,理解重写到底是什么对每个 Java 程序员来说都至关重要,这篇文章就来给大家说说重写过程中应当遵守的 12 条规则。
### 01、什么是重写?
## 01、什么是重写?
重写带来了一种非常重要的能力,可以让子类重新实现从超类那继承过来的方法。在下面这幅图中,Animal 是父类,Dog 是子类,Dog 重新实现了 `move()` 方法用来和父类进行区分,毕竟狗狗跑起来还是比较有特色的。
......@@ -17,9 +23,9 @@ tag:
重写的方法和被重写的方法,不仅方法名相同,参数也相同,只不过,方法体有所不同。
### 02、哪些方法可以被重写?
## 02、哪些方法可以被重写?
**规则一:只能重写继承过来的方法**
### **规则一:只能重写继承过来的方法**。
因为重写是在子类重新实现从父类继承过来的方法时发生的,所以只能重写继承过来的方法,这很好理解。这就意味着,只能重写那些被 public、protected 或者 default 修饰的方法,private 修饰的方法无法被重写。
......@@ -63,9 +69,9 @@ public class Dog extends Animal {
}
```
### 03、哪些方法不能被重写?
## 03、哪些方法不能被重写?
**规则二:final、static 的方法不能被重写**
### **规则二:final、static 的方法不能被重写**。
一个方法是 final 的就意味着它无法被子类继承到,所以就没办法重写。
......@@ -91,9 +97,9 @@ public class Animal {
![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/basic-extra-meal/Overriding-3.png)
### 04、重写方法的要求
## 04、重写方法的要求
**规则三:重写的方法必须有相同的参数列表**
### **规则三:重写的方法必须有相同的参数列表**。
```java
public class Animal {
......@@ -143,7 +149,7 @@ public class Dog extends Animal {
![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/basic-extra-meal/Overriding-4.png)
**规则五:重写的方法不能使用限制等级更严格的权限修饰符**
### **规则五:重写的方法不能使用限制等级更严格的权限修饰符**。
可以这样来理解:
......@@ -171,7 +177,7 @@ public class Dog extends Animal {
![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/basic-extra-meal/Overriding-5.png)
**规则六:重写后的方法不能抛出比父类中更高级别的异常**
### **规则六:重写后的方法不能抛出比父类中更高级别的异常**。
举例来说,如果父类中的方法抛出的是 IOException,那么子类中重写的方法不能抛出 Exception,可以是 IOException 的子类或者不抛出任何异常。这条规则只适用于可检查的异常。
......@@ -231,9 +237,9 @@ Error:(9, 16) java: com.itwanger.overriding.Dog中的eat()无法覆盖com.itwang
被覆盖的方法未抛出java.lang.Exception
```
### 05、如何调用被重写的方法?
## 05、如何调用被重写的方法?
**规则七:可以在子类中通过 super 关键字来调用父类中被重写的方法**
### **规则七:可以在子类中通过 super 关键字来调用父类中被重写的方法**。
子类继承父类的方法而不是重新实现是很常见的一种做法,在这种情况下,可以按照下面的形式调用父类的方法:
......@@ -260,15 +266,15 @@ public class Dog extends Animal {
}
```
### 06、重写和构造方法
## 06、重写和构造方法
**规则八:构造方法不能被重写**
### **规则八:构造方法不能被重写**。
因为构造方法很特殊,而且子类的构造方法不能和父类的构造方法同名(类名不同),所以构造方法和重写之间没有任何关系。
### 07、重写和抽象方法
## 07、重写和抽象方法
**规则九:如果一个类继承了抽象类,抽象类中的抽象方法必须在子类中被重写**
### **规则九:如果一个类继承了抽象类,抽象类中的抽象方法必须在子类中被重写**。
先来看这样一个接口类:
......@@ -306,15 +312,15 @@ public class BullDog extends AbstractDog {
}
```
### 08、重写和 synchronized 方法
## 08、重写和 synchronized 方法
**规则十:synchronized 关键字对重写规则没有任何影响**
### **规则十:synchronized 关键字对重写规则没有任何影响**。
synchronized 关键字用于在多线程环境中获取和释放监听对象,因此它对重写规则没有任何影响,这就意味着 synchronized 方法可以去重写一个非同步方法。
### 09、重写和 strictfp 方法
## 09、重写和 strictfp 方法
**规则十一:strictfp 关键字对重写规则没有任何影响**
### **规则十一:strictfp 关键字对重写规则没有任何影响**。
如果你想让浮点运算更加精确,而且不会因为硬件平台的不同导致执行的结果不一致的话,可以在方法上添加 strictfp 关键字。因此 strictfp 关键和重写规则无关。
......
---
title: 深入理解Java中的注解
shortTitle: 深入理解Java中的注解
category:
- Java核心
tag:
- Java
- Java重要知识点
description: Java程序员进阶之路,小白的零基础Java教程,从入门到进阶,深入理解Java中的注解
head:
- - meta
- name: keywords
content: Java,Java SE,Java基础,Java教程,Java程序员进阶之路,Java入门,教程,java,注解,annotation
---
# 深入理解Java注解
“二哥,这节讲注解吗?”三妹问。
“是的。”我说,“注解是 Java 中非常重要的一部分,但经常被忽视也是真的。之所以这么说是因为我们更倾向成为一名注解的使用者而不是创建者。`@Override` 注解用过吧?但你知道怎么自定义一个注解吗?”
......
---
title: 深入剖析Java中的拆箱和装箱
shortTitle: 深入剖析Java中的拆箱和装箱
category:
- Java核心
tag:
- Java
- Java重要知识点
description: Java程序员进阶之路,小白的零基础Java教程,从入门到进阶,深入剖析Java中的拆箱和装箱
head:
- - meta
- name: keywords
content: Java,Java SE,Java基础,Java教程,Java程序员进阶之路,Java入门,教程,装箱,拆箱,包装类型
---
# 深入剖析Java中的拆箱和装箱
“哥,听说 Java 的每个基本类型都对应了一个包装类型,比如说 int 的包装类型为 Integer,double 的包装类型为 Double,是这样吗?”从三妹这句话当中,能听得出来,她已经提前预习这块内容了。
......
---
title: Java 中,先有Class还是先有Object?
shortTitle: 先有Class还是先有Object?
category:
- Java核心
tag:
- Java
- Java重要知识点
description: Java程序员进阶之路,小白的零基础Java教程,从入门到进阶,Java 中,先有Class还是先有Object?
head:
- - meta
- name: keywords
content: Java,Java SE,Java基础,Java教程,Java程序员进阶之路,Java入门,教程,java,class,object
---
# 先有Class还是先有Object?
Java 对象模型中:
......@@ -18,7 +25,7 @@ Java 对象模型中:
针对这个问题,我在知乎上看到了 R 大的一个回答,正好解答了我心中的疑惑,就分享出来给各位小伙伴一个参考和启发~
>作者:RednaxelaFX,整理:沉默王二,参考链接:https://www.zhihu.com/question/30301819/answer/47539163
>作者:RednaxelaFX,整理:沉默王二,参考链接:[https://www.zhihu.com/question/30301819/answer/47539163](https://www.zhihu.com/question/30301819/answer/47539163)
-----
......
---
title: 详解Java中Comparable和Comparator接口的区别
shortTitle: Comparable和Comparator的区别
category:
- Java核心
tag:
- Java
- Java重要知识点
description: Java程序员进阶之路,小白的零基础Java教程,从入门到进阶,Comparable和Comparator接口的区别
head:
- - meta
- name: keywords
content: Java,Java SE,Java基础,Java教程,Java程序员进阶之路,Java入门,教程,java,泛型
---
# 详解Java中Comparable和Comparator的区别
那天,小二去马蜂窝面试,面试官老王一上来就甩给了他一道面试题:请问Comparable和Comparator有什么区别?小二差点笑出声,因为三年前,也就是 2021 年,他在《Java 程序员进阶之路》专栏上看到过这题😆。
那天,小二去马蜂窝面试,面试官老王一上来就甩给了他一道面试题:请问Comparable和Comparator有什么区别?小二差点笑出声,因为三年前,也就是 2021 年,他在《[Java 程序员进阶之路](https://tobebetterjavaer.com/)》专栏上看到过这题😆。
Comparable 和 Comparator 是 Java 的两个接口,从名字上我们就能够读出来它们俩的相似性:以某种方式来比较两个对象。但它们之间到底有什么区别呢?请随我来,打怪进阶喽!
### 01、Comparable
## 01、Comparable
Comparable 接口的定义非常简单,源码如下所示。
......@@ -58,7 +63,7 @@ public class Cmower implements Comparable<Cmower> {
凭证就在于 `compareTo()` 方法,该方法的返回值可能为负数,零或者正数,代表的意思是该对象按照排序的规则小于、等于或者大于要比较的对象。如果指定对象的类型与此对象不能进行比较,则引发 `ClassCastException` 异常(自从有了泛型,这种情况就少有发生了)。
### 02、Comparator
## 02、Comparator
Comparator 接口的定义相比较于 Comparable 就复杂的多了,不过,核心的方法只有两个,来看一下源码。
......@@ -151,7 +156,7 @@ for (Cmower c : list) {
这意味着沉默王三的年纪比沉默王二小,排在第一位;沉默王一的年纪比沉默王二大,排在第三位。和我们的预期完全符合。
### 03、到底该用哪一个呢?
## 03、到底该用哪一个呢?
通过上面的两个例子可以比较出 Comparable 和 Comparator 两者之间的区别:
......@@ -170,6 +175,7 @@ for (Cmower c : list) {
好了,关于 Comparable 和 Comparator 我们就先聊这么多。总而言之,如果对象的排序需要基于自然顺序,请选择 `Comparable`,如果需要按照对象的不同属性进行排序,请选择 `Comparator`
----
最近整理了一份牛逼的学习资料,包括但不限于Java基础部分(JVM、Java集合框架、多线程),还囊括了 **数据库、计算机网络、算法与数据结构、设计模式、框架类Spring、Netty、微服务(Dubbo,消息队列) 网关** 等等等等……详情戳:[可以说是2022年全网最全的学习和找工作的PDF资源了](https://tobebetterjavaer.com/pdf/programmer-111.html)
......
---
title: 一文彻底讲明白的Java中的浅拷贝与深拷贝
shortTitle: Java中的浅拷贝与深拷贝
category:
- Java核心
tag:
- Java
- Java重要知识点
description: Java程序员进阶之路,小白的零基础Java教程,从入门到进阶,一文彻底讲明白的Java中的浅拷贝与深拷贝
head:
- - meta
- name: keywords
content: Java,Java SE,Java基础,Java教程,Java程序员进阶之路,Java入门,教程,java,深拷贝,浅拷贝
---
# 彻底讲明白的Java浅拷贝与深拷贝
“哥,听说浅拷贝和深拷贝是 Java 面试中经常会被问到的一个问题,是这样吗?”
“还真的是,而且了解浅拷贝和深拷贝的原理,对 Java 是值传递还是引用传递也会有更深的理解。”我肯定地回答。
......
---
title: 新来个技术总监,彻底把 Java 枚举(enum)讲清楚了
shortTitle: Java枚举(enum)
category:
- Java核心
tag:
- Java
- Java重要知识点
description: Java程序员进阶之路,小白的零基础Java教程,从入门到进阶,新来个技术总监,彻底把 Java 枚举(enum)讲清楚了
head:
- - meta
- name: keywords
content: Java,Java SE,Java基础,Java教程,Java程序员进阶之路,Java入门,教程,java,枚举,enum
---
# Java枚举(enum)
“今天我们来学习枚举吧,三妹!”我说,“同学让你去她家玩了两天,感觉怎么样呀?”
“心情放松了不少。”三妹说,“可以开始学 Java 了,二哥。”
......
---
title: 为什么重写equals方法的时候必须要重写hashCode方法?
shortTitle: 为什么重写equals的时候必须重写hashCode
category:
- Java核心
tag:
- Java
- Java重要知识点
description: Java程序员进阶之路,小白的零基础Java教程,从入门到进阶,为什么重写equals方法的时候必须要重写hashCode方法
head:
- - meta
- name: keywords
content: Java,Java SE,Java基础,Java教程,Java程序员进阶之路,Java入门,教程,java,hashcode,equals
---
# 一次性搞清楚equals和hashCode
“二哥,我在读《Effective Java》 的时候,第 11 条规约说重写 equals 的时候必须要重写 hashCode 方法,这是为什么呀?”三妹单刀直入地问。
“三妹啊,这个问题问得非常好,因为它也是面试中经常考的一个知识点。今天哥就带你来梳理一下。”我说。
......
---
title: 大白话说清楚Java反射:入门、使用、原理
shortTitle: Java反射:入门、使用、原理
category:
- Java核心
tag:
- Java
- Java重要知识点
description: Java程序员进阶之路,小白的零基础Java教程,从入门到进阶,大白话说清楚Java反射:入门、使用、原理
head:
- - meta
- name: keywords
content: Java,Java SE,Java基础,Java教程,Java程序员进阶之路,Java入门,教程,java,反射
---
# 大白话说Java反射:入门、使用、原理
“二哥,什么是反射呀?”三妹开门见山地问。
“要想知道什么是反射,就需要先来了解什么是‘正射’。”我笑着对三妹说,“一般情况下,我们在使用某个类之前已经确定它到底是个什么类了,拿到手就直接可以使用 `new` 关键字来调用构造方法进行初始化,之后使用这个类的对象来进行操作。”
......@@ -313,11 +318,11 @@ Method[] methods2 = System.class.getMethods();
第一篇:深入理解 Java 反射和动态代理
>链接:https://dunwu.github.io/javacore/basics/java-reflection.html#_1-%E5%8F%8D%E5%B0%84%E7%AE%80%E4%BB%8B
>链接:[https://dunwu.github.io/javacore/basics/java-reflection.html](https://dunwu.github.io/javacore/basics/java-reflection.html)
第二篇:大白话说Java反射:入门、使用、原理:
>链接:https://www.cnblogs.com/chanshuyi/p/head_first_of_reflection.html
>链接:[https://www.cnblogs.com/chanshuyi/p/head_first_of_reflection.html](https://www.cnblogs.com/chanshuyi/p/head_first_of_reflection.html)
----
......
---
title: 深入理解Java中的泛型
shortTitle: 深入理解Java中的泛型
category:
- Java核心
tag:
- Java
- Java重要知识点
description: Java程序员进阶之路,小白的零基础Java教程,从入门到进阶,深入理解Java中的泛型
head:
- - meta
- name: keywords
content: Java,Java SE,Java基础,Java教程,Java程序员进阶之路,Java入门,教程,java,泛型
---
# 深入理解Java泛型
“二哥,为什么要设计泛型啊?”三妹开门见山地问。
“三妹啊,听哥慢慢给你讲啊。”我说。
......@@ -459,7 +464,7 @@ list3.add(new Wangxiaoer());
“三妹,关于泛型,这里还有一篇很不错的文章,你等会去看一下。”我说。
>https://www.pdai.tech/md/java/basic/java-basic-x-generic.html
>[https://www.pdai.tech/md/java/basic/java-basic-x-generic.html](https://www.pdai.tech/md/java/basic/java-basic-x-generic.html)
“对泛型机制讲的也很透彻,你结合二哥给你讲的这些,再深入的学习一下。”
......
---
title: 深入理解Java中的hashCode方法
shortTitle: 深入理解Java中的hashCode方法
category:
- Java核心
tag:
- Java
- Java重要知识点
description: Java程序员进阶之路,小白的零基础Java教程,从入门到进阶,深入理解Java中的hashCode方法
head:
- - meta
- name: keywords
content: Java,Java SE,Java基础,Java教程,Java程序员进阶之路,Java入门,教程,java,hashcode
---
# 深入理解Java中的hashCode方法
假期结束了,需要快速切换到工作的状态投入到新的一天当中。放假的时候痛快地玩耍,上班的时候积极的工作,这应该是我们大多数“现代人”该有的生活状态。
......
---
title: 深入理解Java中的不可变对象
shortTitle: 深入理解Java中的不可变对象
category:
- Java核心
tag:
- Java
- Java重要知识点
description: Java程序员进阶之路,小白的零基础Java教程,从入门到进阶,深入理解Java中的不可变对象
head:
- - meta
- name: keywords
content: Java,Java SE,Java基础,Java教程,Java程序员进阶之路,Java入门,教程,java,不可变对象,immutable
---
# 深入理解Java中的不可变对象
......@@ -12,7 +19,7 @@ tag:
收到读者小 R 的私信后,我就总感觉自己有一种义不容辞的责任,非要把 immutable 类说明白不可!
### 01、什么是不可变类
## 01、什么是不可变类
一个类的对象在通过构造方法创建后如果状态不会再被改变,那么它就是一个不可变(immutable)类。它的所有成员变量的赋值仅在构造方法中完成,不会提供任何 setter 方法供外部类去修改。
......@@ -24,7 +31,7 @@ tag:
假如说类是不可变的,那么对象的状态就也是不可变的。这样的话,每次修改对象的状态,就会产生一个新的对象供不同的线程使用,我们程序员就不必再担心并发问题了。
### 02、常见的不可变类
## 02、常见的不可变类
提到不可变类,几乎所有的程序员第一个想到的,就是 String 类。那为什么 String 类要被设计成不可变的呢?
......@@ -52,7 +59,7 @@ System.out.println(cmower);// 沉默王二,一枚有趣的程序员
除了 String 类,包装器类 Integer、Long 等也是不可变类。
### 03、手撸不可变类
## 03、手撸不可变类
看懂一个不可变类也许容易,但要创建一个自定义的不可变类恐怕就有点难了。但知难而进是我们作为一名优秀的程序员不可或缺的品质,正因为不容易,我们才能真正地掌握它。
......@@ -197,7 +204,7 @@ public Book getBook() {
促销价:Book{name='Web全栈开发进阶之路', price=79}
```
### 04、总结
## 04、总结
不可变类有很多优点,就像之前提到的 String 类那样,尤其是在多线程环境下,它非常的安全。尽管每次修改都会创建一个新的对象,增加了内存的消耗,但这个缺点相比它带来的优点,显然是微不足道的——无非就是捡了西瓜,丢了芝麻。
......
---
title: Java中的instanceof关键字是如何实现的?
shortTitle: instanceof关键字是如何实现的?
category:
- Java核心
tag:
- Java
- Java重要知识点
description: Java程序员进阶之路,小白的零基础Java教程,从入门到进阶,Java中的instanceof关键字是如何实现的?
head:
- - meta
- name: keywords
content: Java,Java SE,Java基础,Java教程,Java程序员进阶之路,Java入门,教程,java,instanceof
---
# instanceof关键字是如何实现的?
小二那天去面试,碰到了这个问题:“**instanceof 关键字是如何实现的**?”面试官希望他能从底层来分析一下,结果小二没答上来,就来问我。
我唯唯诺诺,强装镇定,只好把 R 大的一篇回答甩给了他,并且叮嘱他:“认认真真看,玩完后要是还不明白,再来问我。。。”
>作者:RednaxelaFX,整理:沉默王二,链接:https://www.zhihu.com/question/21574535/answer/18998914
>作者:RednaxelaFX,整理:沉默王二,链接:[https://www.zhihu.com/question/21574535/answer/18998914](https://www.zhihu.com/question/21574535/answer/18998914)
![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/basic-extra-meal/instanceof-jvm-b676fee6-bfd4-4ae9-9c7b-e488e345f775.gif)
--------
### 场景一:月薪 3000 元一下的码农职位
## 场景一:月薪 3000 元一下的码农职位
用 Java 伪代码来表现instanceof关键字在Java语言规范所描述的运行时语义,是这样的:
......@@ -40,20 +46,20 @@ if (obj == null) {
如果面试官说“这不是废话嘛”,进入场景二。
### 场景二:月薪6000-8000的Java研发职位
## 场景二:月薪6000-8000的Java研发职位
JVM有一条名为 instanceof 的指令,而Java源码编译到Class文件时会把Java语言中的 instanceof 运算符映射到JVM的 instanceof 指令上。
javac是这样做的:
- instanceof 是javac能识别的一个关键字,对应到Token.INSTANCEOF的token类型。做词法分析的时候扫描到"instanceof"关键字就映射到了一个Token.INSTANCEOF token。
- 该编译器的抽象语法树节点有一个JCTree.JCInstanceOf类用于表示instanceof运算。做语法分析的时候解析到[instanceof运算符](https://tobebetterjavaer.com/oo/instanceof.html)就会生成这个JCTree.JCInstanceof类型的节点。
- 该编译器的抽象语法树节点有一个JCTree.JCInstanceOf类用于表示instanceof运算。做语法分析的时候解析到[instanceof运算符](https://tobebetterjavaer.com/basic-extra-meal/instanceof.html)就会生成这个JCTree.JCInstanceof类型的节点。
- 中途还得根据Java语言规范对instanceof运算符的编译时检查的规定把有问题的情况找出来。
- 到最后生成字节码的时候为JCTree.JCInstanceof节点生成instanceof字节码指令。
回答到这层面就已经能解决好些实际问题了,如果面试官还说,“这不还是废话嘛”,进入场景三。
### 场景三:月薪10000的Java高级研发职位
## 场景三:月薪10000的Java高级研发职位
先简单介绍一下instanceof的字节码:
......@@ -71,11 +77,11 @@ javac是这样做的:
如果面试官还不满意,进入场景四。
### 场景四:月薪10000以上的Java资深研发职位
## 场景四:月薪10000以上的Java资深研发职位
这个岗位注重性能调优什么的,R 大说可以上论文了:
>https://dl.acm.org/doi/10.1145/583810.583821
>[https://dl.acm.org/doi/10.1145/583810.583821](https://dl.acm.org/doi/10.1145/583810.583821)
论文我也看不懂,所以这里就不 BB 了。(逃
......@@ -99,7 +105,7 @@ HotSpot VM的两个编译器,Client Compiler (C1) 与 Server Compiler (C2) 各
VM runtime的:
>http://hg.openjdk.java.net/jdk7u/jdk7u/hotspot/file/tip/src/share/vm/oops/oop.inline.hpp
>[http://hg.openjdk.java.net/jdk7u/jdk7u/hotspot/file/tip/src/share/vm/oops/oop.inline.hpp](http://hg.openjdk.java.net/jdk7u/jdk7u/hotspot/file/tip/src/share/vm/oops/oop.inline.hpp)
分享的最后,二哥简单来说一下。
......
---
title: 详解Java中instanceof关键字的用法
shortTitle: instanceof关键字的用法
category:
- Java核心
tag:
- Java
- Java重要知识点
description: Java程序员进阶之路,小白的零基础Java教程,从入门到进阶,详解Java中instanceof关键字的用法
head:
- - meta
- name: keywords
content: Java,Java SE,Java基础,Java教程,Java程序员进阶之路,Java入门,教程,java,instanceof
---
# Java instanceof关键字用法
instanceof 关键字的用法其实很简单:
......@@ -141,4 +146,11 @@ if (obj instanceof String s) {
好了,关于 instanceof 操作符我们就先讲到这吧,难是一点都不难,希望各位同学也能够很好的掌握。
----
最近整理了一份牛逼的学习资料,包括但不限于Java基础部分(JVM、Java集合框架、多线程),还囊括了 **数据库、计算机网络、算法与数据结构、设计模式、框架类Spring、Netty、微服务(Dubbo,消息队列) 网关** 等等等等……详情戳:[可以说是2022年全网最全的学习和找工作的PDF资源了](https://tobebetterjavaer.com/pdf/programmer-111.html)
关注二哥的原创公众号 **沉默王二**,回复**111** 即可免费领取。
![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/xingbiaogongzhonghao.png)
\ No newline at end of file
---
title: Java中new Integer与Integer.valueOf的区别
shortTitle: new Integer与Integer.valueOf的区别
category:
- Java核心
tag:
- Java
- Java重要知识点
description: Java程序员进阶之路,小白的零基础Java教程,从入门到进阶,Java中new Integer与Integer.valueOf的区别
head:
- - meta
- name: keywords
content: Java,Java SE,Java基础,Java教程,Java程序员进阶之路,Java入门,教程,Integer
---
# Java中int、Integer、new Integer之间的区别
“三妹,今天我们来补一个小的知识点:Java 数据类型缓存池。”我喝了一口枸杞泡的茶后对三妹说,“考你一个问题哈:`new Integer(18) 与 Integer.valueOf(18) ` 的区别是什么?”
“三妹,今天我们来补一个小的知识点:Java 数据类型缓存池。”我喝了一口枸杞泡的茶后对三妹说,“考你一个问题哈:`new Integer(18) 与 Integer.valueOf(18)` 的区别是什么?”
“难道不一样吗?”三妹有点诧异。
......@@ -108,7 +113,7 @@ private static class IntegerCache {
之前我们在[学习 static 关键字](https://github.com/itwanger/toBeBetterJavaer/blob/master/docs/keywords/java-static.md)的时候,提到过静态代码块,还记得吧?三妹。静态代码块通常用来初始化一些静态变量,它会优先于 main() 方法执行。
之前我们在[学习 static 关键字](https://tobebetterjavaer.com/oo/static.html)的时候,提到过静态代码块,还记得吧?三妹。静态代码块通常用来初始化一些静态变量,它会优先于 main() 方法执行。
在静态代码块中,low 为 -128,也就是缓存池的最小值;high 默认为 127,也就是缓存池的最大值,共计 256 个。
......
---
title: 彻底弄懂Java中的Unicode和UTF-8编码
shortTitle: 彻底弄懂Unicode和UTF-8编码
category:
- Java核心
tag:
- Java
- Java重要知识点
description: Java程序员进阶之路,小白的零基础Java教程,从入门到进阶,彻底弄懂Java中的Unicode和UTF-8编码
head:
- - meta
- name: keywords
content: Java,Java SE,Java基础,Java教程,Java程序员进阶之路,Java入门,教程,unicode,utf-8
---
# 彻底弄懂Java中的Unicode和UTF-8编码
“二哥,[上一篇](https://mp.weixin.qq.com/s/twim3w_dp5ctCigjLGIbFw)文章中提到了 Unicode,说 Java 中的
“二哥,[上一篇](https://tobebetterjavaer.com/basic-grammar/basic-data-type.html)文章中提到了 Unicode,说 Java 中的
char 类型之所以占 2 个字节,是因为 Java 使用的是 Unicode 字符集而不是 ASCII 字符集,我有点迷,想了解一下,能细致给我说说吗?”
“当然没问题啊,三妹。”
**1)ASCII**
## **1)ASCII**
对于计算机来说,只认 0 和 1,所有的信息最终都是一个二进制数。一个二进制数要么是 0,要么是 1,所以 8 个二进制数放在一起(一个字节),就会组合出 256 种状态,也就是 2 的 8 次方(`2^8`),从 00000000 到 11111111。
......@@ -49,7 +54,7 @@ PPPS:英式标点符号,也叫英文标点符号,和中文标点符号很
![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/core-points/ten-05.png)
**2)Unicode**
## **2)Unicode**
这个世界上,除了英语,还有法语、葡萄牙语、西班牙语、德语、俄语、阿拉伯语、韩语、日语等等等等。ASCII 码用来表示英语是绰绰有余的,但其他这些语言就没办法了。
......@@ -152,7 +157,7 @@ UTF-16 使用 2 个或者 4 个字节来存储字符。
- 对于 Unicode 编号范围在 10000 ~ 10FFFF 之间的字符,UTF-16 使用四个字节存储,具体来说就是:将字符编号的所有比特位分成两部分,较高的一些比特位用一个值介于 D800~DBFF 之间的双字节存储,较低的一些比特位(剩下的比特位)用一个值介于 DC00~DFFF 之间的双字节存储。
**3)char**
## **3)char**
搞清楚了 Unicode 之后,再回头来看 char 为什么是两个字节的问题,就很容易搞明白了。
......
---
title: 为什么JDK源码中,无限循环大多使用for(;;)而不是while(true)?
shortTitle: JDK源码无限循环大多使用for(;;)而不是while(true)?
category:
- Java核心
tag:
- Java
- Java重要知识点
description: Java程序员进阶之路,小白的零基础Java教程,从入门到进阶,为什么JDK源码中,无限循环大多使用for(;;)而不是while(true)?
head:
- - meta
- name: keywords
content: Java,Java SE,Java基础,Java教程,Java程序员进阶之路,Java入门,教程,java,jdk,无限循环,for,while
---
# 为什么JDK源码中,无限循环大多使用for(;;)而不是while(true)?
在知乎上看到 R 大的这篇回答,着实感觉需要分享给在座的各位 javaer 们,真心透彻。
>https://www.zhihu.com/question/52311366/answer/130090347
>[https://www.zhihu.com/question/52311366/answer/130090347](https://www.zhihu.com/question/52311366/answer/130090347)
-----
......
---
title: jdk9为什么要将String的底层实现由char数组改成了byte数组?
shortTitle: String的底层实现由char改成了byte?
category:
- Java核心
tag:
- Java
- Java重要知识点
description: Java程序员进阶之路,小白的零基础Java教程,从入门到进阶,jdk9为什么要将String的底层实现由char数组改成了byte数组?
head:
- - meta
- name: keywords
content: Java,Java SE,Java基础,Java教程,Java程序员进阶之路,Java入门,教程,java,string,char,byte
---
# jdk9为何要将String的底层实现由char[]改成了byte[]?
大家好,我是二哥呀!如果你不是 Java8 的钉子户,你应该早就发现了:String 类的源码已经由 `char[]` 优化为了 `byte[]` 来存储字符串内容,为什么要这样做呢?
开门见山地说,从 `char[]``byte[]`,最主要的目的是**为了节省字符串占用的内存**。内存占用减少带来的另外一个好处,就是 GC 次数也会减少。
### 一、为什么要优化 String 节省内存空间
## 一、为什么要优化 String 节省内存空间
我们使用 `jmap -histo:live pid | head -n 10` 命令就可以查看到堆内对象示例的统计信息、查看 ClassLoader 的信息以及 finalizer 队列。
......@@ -27,7 +32,7 @@ tag:
那也就是说优化 String 节省内存空间是非常有必要的,如果是去优化一个使用频率没有 String 这么高的类库,就显得非常的鸡肋。
### 二、`byte[]` 为什么就能节省内存空间呢?
## 二、`byte[]` 为什么就能节省内存空间呢?
众所周知,char 类型的数据在 JVM 中是占用两个字节的,并且使用的是 UTF-8 编码,其值范围在 '\u0000'(0)和 '\uffff'(65,535)(包含)之间。
......@@ -76,7 +81,7 @@ Java 会根据字符串的内容自动设置为相应的编码,要么 Latin-1
也就是说,从 `char[]``byte[]`**中文是两个字节,纯英文是一个字节,在此之前呢,中文是两个字节,应为也是两个字节**
### 三、为什么用UTF-16而不用UTF-8呢?
## 三、为什么用UTF-16而不用UTF-8呢?
在 UTF-8 中,0-127 号的字符用 1 个字节来表示,使用和 ASCII 相同的编码。只有 128 号及以上的字符才用 2 个、3 个或者 4 个字节来表示。
......@@ -106,7 +111,7 @@ Java 会根据字符串的内容自动设置为相应的编码,要么 Latin-1
所以UTF-16在Java的世界里,就可以视为一个定长的编码。
>参考链接:https://www.zhihu.com/question/447224628
>参考链接:[https://www.zhihu.com/question/447224628](https://www.zhihu.com/question/447224628)
----
......
---
title: Java到底是值传递还是引用传递?
shortTitle: Java到底是值传递还是引用传递?
category:
- Java核心
tag:
- Java
- Java重要知识点
description: Java程序员进阶之路,小白的零基础Java教程,从入门到进阶,Java到底是值传递还是引用传递?
head:
- - meta
- name: keywords
content: Java,Java SE,Java基础,Java教程,Java程序员进阶之路,Java入门,教程,java,值传递,引用传递
---
# Java到底是值传递还是引用传递?
“哥,说说 Java 到底是值传递还是引用传递吧?”三妹一脸的困惑,看得出来她被这个问题折磨得不轻。
......
---
title: Java不能实现真正泛型的原因是什么?
shortTitle: Java不能实现真正泛型的原因是什么?
category:
- Java核心
tag:
- Java
- Java重要知识点
description: Java程序员进阶之路,小白的零基础Java教程,从入门到进阶,Java不能实现真正泛型的原因是什么?
head:
- - meta
- name: keywords
content: Java,Java SE,Java基础,Java教程,Java程序员进阶之路,Java入门,教程,java,泛型
---
# Java不能实现真正泛型的原因是什么?
“二哥,为啥 Java 不能实现真正泛型啊?”三妹开门见山地问。
......@@ -64,7 +70,7 @@ Java 在 2004 年已经积累了较为丰富的生态,如果把现有的类修
第二,不是“实现不了”。Pizza,1996 年的实验语言,在 Java 的基础上扩展了泛型。
>Pizza 教程地址:http://pizzacompiler.sourceforge.net/doc/tutorial.html
>Pizza 教程地址:[http://pizzacompiler.sourceforge.net/doc/tutorial.html](http://pizzacompiler.sourceforge.net/doc/tutorial.html)
“1996 年?”三妹表示很吃惊。
......@@ -219,7 +225,7 @@ Java 神奇就神奇在这,表面上万物皆对象,但为了性能上的考
Project Valhalla:正在进行当中的 OpenJDK 项目,计划给未来的 Java 添加改进的泛型支持。
>源码地址:http://openjdk.java.net/projects/valhalla/
>源码地址:[http://openjdk.java.net/projects/valhalla/](http://openjdk.java.net/projects/valhalla/)
让我们拭目以待吧!
......
---
title: 详解Java中可变参数的使用
shortTitle: 详解Java中可变参数的使用
category:
- Java核心
tag:
- Java
- Java重要知识点
description: Java程序员进阶之路,小白的零基础Java教程,从入门到进阶,详解Java中可变参数的使用
head:
- - meta
- name: keywords
content: Java,Java SE,Java基础,Java教程,Java程序员进阶之路,Java入门,教程,java,可变参数
---
# Java中可变参数的使用
# 详解Java中可变参数的使用
为了让铁粉们能白票到阿里云的服务器,老王当了整整两天的客服,真正体验到了什么叫做“为人民群众谋福利”的不易和辛酸。正在他眼睛红肿打算要休息之际,小二跑过来问他:“Java 的可变参数究竟是怎么一回事?”老王一下子又清醒了,他爱 Java,他爱传道解惑,他爱这群尊敬他的读者。
......
......@@ -191,10 +191,11 @@ head:
### 常用工具类
- [Java Arrays工具类10大常用方法](common-tool/arrays.md)
- [Java集合框架:Collections工具类](common-tool/collections.md)
- [Java Arrays:专为数组而生的工具类](common-tool/arrays.md)
- [Java Collections:专为集合框架而生的工具类](common-tool/collections.md)
- [Hutool:国产良心工具包,让你的Java变得更甜](common-tool/hutool.md)
- [Google开源的Guava工具库,太强大了~](common-tool/guava.md)
- [Guava:Google开源的工具库,太强大了](common-tool/guava.md)
- [这10个工具类,让我的开发效率提升了50%](common-tool/utils.md)
### Java新特性
......@@ -205,26 +206,26 @@ head:
### Java重要知识点
- [彻底弄懂Java中的Unicode和UTF-8编码](basic-extra-meal/java-unicode.md)
- [Java中int、Integer、new Integer之间的区别](basic-extra-meal/int-cache.md)
- [Java中new Integer与Integer.valueOf的区别](basic-extra-meal/int-cache.md)
- [深入剖析Java中的拆箱和装箱](basic-extra-meal/box.md)
- [彻底讲明白的Java浅拷贝与深拷贝](basic-extra-meal/deep-copy.md)
- [一文彻底讲明白的Java中的浅拷贝与深拷贝](basic-extra-meal/deep-copy.md)
- [深入理解Java中的hashCode方法](basic-extra-meal/hashcode.md)
- [一次性搞清楚equals和hashCode](basic-extra-meal/equals-hashcode.md)
- [为什么重写equals方法的时候必须要重写hashCode方法?](basic-extra-meal/equals-hashcode.md)
- [Java重写(Overriding)时应当遵守的11条规则](basic-extra-meal/Overriding.md)
- [Java到底是值传递还是引用传递?](basic-extra-meal/pass-by-value.md)
- [Java不能实现真正泛型的原因是什么?](basic-extra-meal/true-generic.md)
- [详解Java中Comparable和Comparator的区别](basic-extra-meal/comparable-omparator.md)
- [jdk9为何要将String的底层实现由char[]改成了byte[]?](basic-extra-meal/jdk9-char-byte-string.md)
- [详解Java中Comparable和Comparator接口的区别](basic-extra-meal/comparable-omparator.md)
- [jdk9为什么要将String的底层实现由char数组改成了byte数组?](basic-extra-meal/jdk9-char-byte-string.md)
- [为什么JDK源码中,无限循环大多使用for(;;)而不是while(true)?](basic-extra-meal/jdk-while-for-wuxian-xunhuan.md)
- [先有Class还是先有Object?](basic-extra-meal/class-object.md)
- [Java 中,先有Class还是先有Object?](basic-extra-meal/class-object.md)
- [详解Java中instanceof关键字的用法](oo/instanceof.md)
- [instanceof关键字是如何实现的?](basic-extra-meal/instanceof-jvm.md)
- [Java instanceof关键字用法](oo/instanceof.md)
- [深入理解Java中的不可变对象](basic-extra-meal/immutable.md)
- [Java中可变参数的使用](basic-extra-meal/varables.md)
- [深入理解Java泛型](basic-extra-meal/generic.md)
- [深入理解Java注解](basic-extra-meal/annotation.md)
- [Java枚举(enum)](basic-extra-meal/enum.md)
- [大白话说Java反射:入门、使用、原理](basic-extra-meal/fanshe.md)
- [深入理解Java中的泛型](basic-extra-meal/generic.md)
- [Java不能实现真正泛型的原因是什么?](basic-extra-meal/true-generic.md)
- [深入理解Java中的注解](basic-extra-meal/annotation.md)
- [新来个技术总监,彻底把 Java 枚举(enum)讲清楚了](basic-extra-meal/enum.md)
- [大白话说清楚Java反射:入门、使用、原理](basic-extra-meal/fanshe.md)
### Java网络编程
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册