提交 fadb349a 编写于 作者: G guide

Update Java基础知识.md

上级 2cbc52ff
......@@ -11,9 +11,8 @@
- [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.1.5. import java 和 javax 有什么区别?](#115-import-java-和-javax-有什么区别)
- [1.1.6. 为什么说 Java 语言“编译与解释并存”?](#116-为什么说-java-语言编译与解释并存)
- [1.2. Java 语法](#12-java-语法)
- [1.2.1. 字符型常量和字符串常量的区别?](#121-字符型常量和字符串常量的区别)
- [1.2.2. 关于注释?](#122-关于注释)
......@@ -52,16 +51,16 @@
- [2.3. 修饰符](#23-修饰符)
- [2.3.1. 在一个静态方法内调用一个非静态成员为什么是非法的?](#231-在一个静态方法内调用一个非静态成员为什么是非法的)
- [2.3.2. 静态方法和实例方法有何不同](#232-静态方法和实例方法有何不同)
- [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.4. 其它重要知识点](#24-其它重要知识点)
- [2.4.1. String StringBuffer 和 StringBuilder 的区别是什么? String 为什么是不可变的?](#241-string-stringbuffer-和-stringbuilder-的区别是什么-string-为什么是不可变的)
- [2.4.2. Object 类的常见方法总结](#242-object-类的常见方法总结)
- [2.4.3. == 与 equals(重要)](#243-与-equals重要)
- [2.4.4. hashCode 与 equals (重要)](#244-hashcode-与-equals-重要)
- [2.4.4.1. hashCode()介绍](#2441-hashcode介绍)
- [2.4.4.2. 为什么要有 hashCode](#2442-为什么要有-hashcode)
- [2.4.4.3. hashCode()与 equals()的相关规定](#2443-hashcode与-equals的相关规定)
- [2.4.5. Java 序列化中如果有些字段不想进行序列化,怎么办?](#245-java-序列化中如果有些字段不想进行序列化怎么办)
- [2.4.6. 获取用键盘输入常用的两种方法](#246-获取用键盘输入常用的两种方法)
- [3. Java 核心技术](#3-java-核心技术)
- [3.1. 反射机制](#31-反射机制)
- [3.1.1.静态编译和动态编译](#311静态编译和动态编译)
......@@ -84,6 +83,7 @@
<!-- /code_chunk_output -->
## 1. Java 基本功
### 1.1. Java 入门(基础概念与常识)
......@@ -1004,9 +1004,9 @@ public class Student {
2. 静态方法在访问本类的成员时,只允许访问静态成员(即静态成员变量和静态方法),而不允许访问实例成员变量和实例方法;实例方法则无此限制。
### 2.5. 其它重要知识点
### 2.4. 其它重要知识点
#### 2.5.1. String StringBuffer 和 StringBuilder 的区别是什么? String 为什么是不可变的?
#### 2.4.1. String StringBuffer 和 StringBuilder 的区别是什么? String 为什么是不可变的?
**可变性**
......@@ -1051,7 +1051,7 @@ abstract class AbstractStringBuilder implements Appendable, CharSequence {
2. 单线程操作字符串缓冲区下操作大量数据: 适用 `StringBuilder`
3. 多线程操作字符串缓冲区下操作大量数据: 适用 `StringBuffer`
#### 2.5.2. Object 类的常见方法总结
#### 2.4.2. Object 类的常见方法总结
Object 类是一个特殊的类,是所有类的父类。它主要提供了以下 11 个方法:
......@@ -1080,7 +1080,7 @@ protected void finalize() throws Throwable { }//实例被垃圾回收器回收
```
#### 2.5.3. == 与 equals(重要)
#### 2.4.3. == 与 equals(重要)
**==** : 它的作用是判断两个对象的地址是不是相等。即,判断两个对象是不是同一个对象(基本数据类型==比较的是值,引用数据类型==比较的是内存地址)。
......@@ -1116,23 +1116,23 @@ public class test1 {
- String 中的 equals 方法是被重写过的,因为 object 的 equals 方法是比较的对象的内存地址,而 String 的 equals 方法比较的是对象的值。
- 当创建 String 类型的对象时,虚拟机会在常量池中查找有没有已经存在的值和要创建的值相同的对象,如果有就把它赋给当前引用。如果没有就在常量池中重新创建一个 String 对象。
#### 2.5.4. hashCode 与 equals (重要)
#### 2.4.4. hashCode 与 equals (重要)
面试官可能会问你:“你重写过 hashcode 和 equals 么,为什么重写 equals 时必须重写 hashCode 方法?”
##### 2.5.4.1. hashCode()介绍
##### 2.4.4.1. hashCode()介绍
hashCode() 的作用是获取哈希码,也称为散列码;它实际上是返回一个 int 整数。这个哈希码的作用是确定该对象在哈希表中的索引位置。hashCode() 定义在 JDK 的 Object.java 中,这就意味着 Java 中的任何类都包含有 hashCode() 函数。
散列表存储的是键值对(key-value),它的特点是:能根据“键”快速的检索出对应的“值”。这其中就利用到了散列码!(可以快速找到所需要的对象)
##### 2.5.4.2. 为什么要有 hashCode
##### 2.4.4.2. 为什么要有 hashCode
**我们先以“HashSet 如何检查重复”为例子来说明为什么要有 hashCode:** 当你把对象加入 HashSet 时,HashSet 会先计算对象的 hashcode 值来判断对象加入的位置,同时也会与该位置其他已经加入的对象的 hashcode 值作比较,如果没有相符的 hashcode,HashSet 会假设对象没有重复出现。但是如果发现有相同 hashcode 值的对象,这时会调用 `equals()`方法来检查 hashcode 相等的对象是否真的相同。如果两者相同,HashSet 就不会让其加入操作成功。如果不同的话,就会重新散列到其他位置。(摘自我的 Java 启蒙书《Head first java》第二版)。这样我们就大大减少了 equals 的次数,相应就大大提高了执行速度。
通过我们可以看出:`hashCode()` 的作用就是**获取哈希码**,也称为散列码;它实际上是返回一个 int 整数。这个**哈希码的作用**是确定该对象在哈希表中的索引位置。**`hashCode()`在散列表中才有用,在其它情况下没用**。在散列表中 hashCode() 的作用是获取对象的散列码,进而确定该对象在散列表中的位置。
##### 2.5.4.3. hashCode()与 equals()的相关规定
##### 2.4.4.3. hashCode()与 equals()的相关规定
1. 如果两个对象相等,则 hashcode 一定也是相同的
2. 两个对象相等,对两个对象分别调用 equals 方法都返回 true
......@@ -1142,13 +1142,13 @@ hashCode() 的作用是获取哈希码,也称为散列码;它实际上是返
推荐阅读:[Java hashCode() 和 equals()的若干问题解答](https://www.cnblogs.com/skywang12345/p/3324958.html)
#### 2.5.5. Java 序列化中如果有些字段不想进行序列化,怎么办?
#### 2.4.5. Java 序列化中如果有些字段不想进行序列化,怎么办?
对于不想进行序列化的变量,使用 transient 关键字修饰。
transient 关键字的作用是:阻止实例中那些用此关键字修饰的的变量序列化;当对象被反序列化时,被 transient 修饰的变量值不会被持久化和恢复。transient 只能修饰变量,不能修饰类和方法。
#### 2.5.6. 获取用键盘输入常用的两种方法
#### 2.4.6. 获取用键盘输入常用的两种方法
方法 1:通过 Scanner
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册