提交 7411760b 编写于 作者: W wizardforcel

2020-06-23 11:53:30

上级 250d97fb
......@@ -41,7 +41,7 @@ Java HashMap 是基于 HashTable 的 Map 实现。 这就是为什么面试官
* 初始容量(默认值为 16)只是创​​建哈希表时的容量。
* *负载因子(默认值 .75)*是衡量哈希表在自动增加其容量之前的填充程度的度量。
* 当哈希表中的条目数超过负载因子与当前容量的乘积时,哈希表将被*重映射*(即内部数据结构将被重建)。
5. 使用“`Collections.synchronizedMap()`”方法使地图同步。
5. 使用“`Collections.synchronizedMap()`”方法使映射同步。
6. 由 HashMap 类返回的 迭代器为“***故障快速***”。
7. HashMap 由 Array(Key)和 LinkedList(Value)支持。
8. HashMap 使用 hashcode(使用密钥)来标识应在 HashMap 中放置或检索对象的确切位置。
......@@ -72,8 +72,8 @@ Java HashMap 是基于 HashTable 的 Map 实现。 这就是为什么面试官
在此示例中,您将学到以下几点
1. 如何迭代地图
2. 迭代地图的不同方法
1. 如何迭代映射
2. 迭代映射的不同方法
3. HashCode 和 Equals 何时被调用。 (请特别注意 HashCode 的输出和 equals 方法调用)
```java
......
# Java 初学者的地图收藏教程
# Java 初学者的映射收藏教程
> 原文: [https://javabeginnerstutorial.com/core-java-tutorial/map-collection-tutorial-for-java-beginners/](https://javabeginnerstutorial.com/core-java-tutorial/map-collection-tutorial-for-java-beginners/)
Map 是 Java Collection 框架下的一个 Interface。
# 地图界面的主要特征
# 映射界面的主要特征
* 它是一个用于将键映射到值的对象。
* 映射不能包含重复值。
......@@ -16,12 +16,12 @@ Map 是 Java Collection 框架下的一个 Interface。
* 键值映射集
* 由于 Map 如上所述提供了 3 个视图,因此您可以迭代键,值或键值对。
* 可以在迭代过程中以安全的方式从 Map 中删除条目。
* 不允许地图包含自身作为键。
* 地图可以包含自身作为值。
* 一些地图实现可以包含的键和值有一些限制。
* 不允许映射包含自身作为键。
* 映射可以包含自身作为值。
* 一些映射实现可以包含的键和值有一些限制。
* 尝试插入不合格的键或值将引发非受检异常。
# 具体地图实现
# 具体映射实现
* HashMap
* 哈希表
......@@ -34,7 +34,7 @@ Map 是 Java Collection 框架下的一个 Interface。
* ConcurrentSkipListMap
* ConcurrentHashMap
# 地图界面中的重要方法
# 映射界面中的重要方法
* **`put(K key, V value)`**:使用指定的键将指定的值放入映射中。
* **`putAll(Map<? extends K, ? extends V> m)`**:将所有映射从给定 Map 复制到此 Map。
......
......@@ -32,9 +32,9 @@ Set 是 Java Collection Framework 的一部分。 Set 是 *java.util* 程序包
## 构造器
* **HashSet(Collection <?扩展 E > c)**:构造一个新集合,其中包含指定集合中的元素。
* **HashSet(int initialCapacity,float loadFactor)**:构造一个新的空集; 支持的 HashMap 实例具有指定的初始容量和指定的负载系数。
* **HashSet(int initialCapacity)**:构造一个新的空集。
* **`HashSet(Collection<? extends E> c)`**:构造一个新集合,其中包含指定集合中的元素。
* **`HashSet(int initialCapacity, float loadFactor)`**:构造一个新的空集; 支持的 HashMap 实例具有指定的初始容量和指定的负载系数。
* **`HashSet(int initialCapacity)`**:构造一个新的空集。
# 链接哈希集
......@@ -48,11 +48,11 @@ Set 是 Java Collection Framework 的一部分。 Set 是 *java.util* 程序包
* 它不同步。
* 此类的 Iterator 方法返回的 Iterator 为 FAIL-FAST。
## Constructor
## 构造器
* **LinkedHashSet(int initialCapacity,float loadFactor)**:构造一个具有指定初始容量和负载因子的新的空链接哈希集。
* **LinkedHashSet(int initialCapacity)**:构造一个新的,空的,具有指定初始容量和默认加载因子 0.75 的链接哈希集。
* **LinkedHashSet()**:构造一个新的空链接哈希集,默认初始容量为 16,负载因子为 0.75。
* **LinkedHashSet(Collection <?扩展 E > c)**:构造一个新的链接哈希集,其元素与指定的集合相同。
* **`LinkedHashSet(int initialCapacity, float loadFactor)`**:构造一个具有指定初始容量和负载因子的新的空链接哈希集。
* **`LinkedHashSet(int initialCapacity)`**:构造一个新的,空的,具有指定初始容量和默认加载因子 0.75 的链接哈希集。
* **`LinkedHashSet()`**:构造一个新的空链接哈希集,默认初始容量为 16,负载因子为 0.75。
* **`LinkedHashSet(Collection<? extends E> c)`**:构造一个新的链接哈希集,其元素与指定的集合相同。
# 树集
\ No newline at end of file
......@@ -19,7 +19,7 @@ SortedSet 的重要点
# SortedSet 中的重要方法
* **比较器<? super E >比较器()**:返回用于对 Set 中的元素进行排序的比较器。
* **subSet(E fromElement,E toElement)**:返回此集合部分的视图,其元素范围从 fromElement(包括)到 toElement(不包括)。
* **headSet(E toElement)**:返回此集合中的元素严格小于 toElement 的部分的视图。
* **tailSet(E fromElement)**:返回此集合中其元素大于或等于 fromElement 的部分的视图
\ No newline at end of file
* **`Comparator<? super E> comparator()`**:返回用于对 Set 中的元素进行排序的比较器。
* **`subSet(E fromElement, E toElement)`**:返回此集合部分的视图,其元素范围从 fromElement(包括)到 toElement(不包括)。
* **`headSet(E toElement)`**:返回此集合中的元素严格小于 toElement 的部分的视图。
* **`tailSet(E fromElement)`**:返回此集合中其元素大于或等于 fromElement 的部分的视图
\ No newline at end of file
# Java 初学者排序地图收藏教程
# Java 初学者排序映射收藏教程
> 原文: [https://javabeginnerstutorial.com/core-java-tutorial/sorted-map-collection-tutorial-for-java-beginners/](https://javabeginnerstutorial.com/core-java-tutorial/sorted-map-collection-tutorial-for-java-beginners/)
......@@ -19,6 +19,6 @@
# SortedMap 界面中的重要方法
* **subMap(K fromKey,K toKey)**:返回此地图部分的视图,其元素范围从 fromElement(包括)到 toElement(不包括)。
* **headMap(K toKey)**:返回此地图部分的视图,其元素严格小于 toElement。
* **tailMap(K fromKey)**:返回此图的一部分,其元素大于或等于 fromElement 的视图。
\ No newline at end of file
* **`subMap(K fromKey, K toKey)`**:返回此映射部分的视图,其元素范围从 fromElement(包括)到 toElement(不包括)。
* **`headMap(K toKey)`**:返回此映射部分的视图,其元素严格小于 toElement。
* **`tailMap(K fromKey)`**:返回此图的一部分,其元素大于或等于 fromElement 的视图。
\ No newline at end of file
......@@ -21,13 +21,13 @@ Java 序列化是一个过程,其中 Object 的当前状态将保存在字节
现在我们知道什么是序列化了。 但是我们需要了解如何用 Java 实现它以及它如何工作。
Java 已经提供了开箱即用的方式( ***java.io.Serializable*** 接口)来序列化对象。 如果要序列化任何类,则该类需要实现给定的接口。
Java 已经提供了开箱即用的方式(`java.io.Serializable`接口)来序列化对象。 如果要序列化任何类,则该类需要实现给定的接口。
**注***:可序列化接口是标记接口。 因此,Serializable 接口中没有任何方法。
**注**:可序列化接口是标记接口。 因此,Serializable 接口中没有任何方法。
## Java 类序列化代码
**Employee.java**
`Employee.java`
```java
package com.jbt;
......@@ -42,7 +42,7 @@ public class Employee implements Serializable
}
```
**SerializaitonClass.java**
`SerializaitonClass.java`
```java
package com.jbt;
......@@ -72,7 +72,7 @@ public class SerializaitonClass {
}
```
**DeserializationClass.java**
`DeserializationClass.java`
```java
package com.jbt;
......@@ -103,9 +103,9 @@ public class DeserializationClass {
}
```
首先,运行“ ***SerializaitonClass*** ”,您将创建“ ***employee.txt*** ”文件。
首先,运行“`SerializaitonClass`”,您将创建“`employee.txt`”文件。
第二次运行“ ***DeserializationClass*** ”,Java 将反序列化该类,并在控制台中显示该值。
第二次运行“`DeserializationClass`”,Java 将反序列化该类,并在控制台中显示该值。
输出将是
......@@ -115,9 +115,9 @@ First Name of Employee: Vivekanand
Last Name of Employee: Gautam
```
### 项目符号
### 项目
* ***序列化*** 接口需要使对象*序列化。*
* ***序列化***接口需要使对象*序列化*
* 暂时[实例变量](https://javabeginnerstutorial.com/core-java-tutorial/instance-variable-java/)并未以对象状态序列化。
* 如果 Super 类实现了 Serializable,则子类也可以自动进行 Serializable。
* 如果无法对超类进行序列化,则在对子类进行反序列化时,将调用超类的默认[构造器](https://javabeginnerstutorial.com/core-java-tutorial/constructors-in-java/)。 因此,所有变量将获得默认值,引用将为 null。
......@@ -126,7 +126,7 @@ Last Name of Employee: Gautam
* ***序列化*** 接口需要使对象*序列化。*
* ***序列化***接口需要使对象*序列化*
* 暂时[实例变量](https://javabeginnerstutorial.com/core-java-tutorial/instance-variable-java/)并未以对象状态序列化。
* 如果 Super 类实现了 Serializable,则子类也可以自动进行 Serializable。
* 如果无法对超类进行序列化,则在对子类进行反序列化时,将调用超类的默认[构造器](https://javabeginnerstutorial.com/core-java-tutorial/constructors-in-java/)。 因此,所有变量将获得默认值,引用将为 null。
\ No newline at end of file
......@@ -8,16 +8,16 @@
## 使用 serialVersionUID
您必须已经看到在源代码中使用了一个名为“ ***serialVersionUID*** ”的变量。 使用此变量有特定的原因。
您必须已经看到在源代码中使用了一个名为“`serialVersionUID`”的变量。 使用此变量有特定的原因。
***serialVersionUID*** 是通过序列化运行时与每个可序列化类关联的版本号。 在反序列化过程中使用此版本号来验证序列化对象的发送者和接收者是否已为该对象加载了与序列化兼容的类。
* 在可序列化类中定义 ***serialVersionUID*** 字段不是**强制性**
* 如果可序列化的类具有显式的 ***serialVersionUID*** ,则此字段的类型应为 ***长**,并且必须是静态且最终的。*
* 如果没有明确定义的 ***serialVersionUID*** 字段,则序列化运行时将计算该类的默认值。 随编译器的实现而有所不同。 因此建议定义 ***serialVersionUID。***
* 建议对 ***serialVersionUID 使用私有访问修饰符。***
* 在可序列化类中定义`serialVersionUID`字段不是**强制性**
* 如果可序列化的类具有显式的`serialVersionUID`,则此字段的类型应为`long`,并且必须是静态且最终的。
* 如果没有明确定义的`serialVersionUID`字段,则序列化运行时将计算该类的默认值。 随编译器的实现而有所不同。 因此建议定义`serialVersionUID`
* 建议对`serialVersionUID`使用私有访问修饰符。
* 数组类无法声明显式的 serialVersionUID,因此它们始终具有默认的计算值,但是对于数组类,无需匹配 serialVersionUID 值。
* 如果已加载的接收器类的 serialVersionUID 与相应的发送器类之间存在差异,则将引发 **InvalidClassException**
* 如果已加载的接收器类的 serialVersionUID 与相应的发送器类之间存在差异,则将引发 `InvalidClassException`
## 瞬态的使用
......
......@@ -18,7 +18,7 @@
源代码:注意每个代码更改。
**Employee.java**
`Employee.java`
```java
package com.jbt;
......@@ -38,7 +38,7 @@ class superEmployee implements Serializable{
}
```
**SerializaitonClass.java**
`SerializaitonClass.java`
```java
package com.jbt;
......@@ -72,7 +72,7 @@ public class SerializaitonClass {
}
```
**DeserializationClass.java**
`DeserializationClass.java`
```java
package com.jbt;
......@@ -127,7 +127,7 @@ Company Address: null
现在,我将稍作更改代码,看看会发生什么。
**Employee.java**
`Employee.java`
```java
package com.jbt;
......@@ -183,7 +183,7 @@ Company Address: null
要查看 Final 修饰符的效果,我再次更改 Employee 类的代码。
**Employee.java**
`Employee.java`
```java
package com.jbt;
......@@ -225,7 +225,7 @@ Company Address: DEL
我看到了一种情况,您可以序列化未序列化的 Interface 内部的变量。
**Employee.java**
`Employee.java`
```java
package com.jbt;
......@@ -255,7 +255,7 @@ interface variableConstant {
}
```
**DeserializationClass.java**
`DeserializationClass.java`
```java
package com.jbt;
......
......@@ -128,20 +128,20 @@ java.io.InvalidClassException: com.jbt.Employee; local class incompatible: strea
at com.jbt.DeserializationClass.main(DeserializationClass.java:11)
```
它将引发不兼容的异常。 因为给定的类 Employee.java 在序列化和反序列化过程之间进行了更改。 因此,系统无法识别它仍然是同一类。 为了使我们的系统了解到它是同一类,您必须在一个类中使用 ***serialVersionUID*** 变量。
它将引发不兼容的异常。 因为给定的类 Employee.java 在序列化和反序列化过程之间进行了更改。 因此,系统无法识别它仍然是同一类。 为了使我们的系统了解到它是同一类,您必须在一个类中使用`serialVersionUID`变量。
您可以尝试执行上述步骤,但保持 ***serialVersionUID*** 不变,并查看输出。 反序列化过程将正常进行。
您可以尝试执行上述步骤,但保持`serialVersionUID`不变,并查看输出。 反序列化过程将正常进行。
### 项目符号
### 项目
* 在可序列化类中定义 ***serialVersionUID*** 字段不是必需的**。**
* 如果可序列化的类具有显式的 ***serialVersionUID*** ,则此字段的类型应为 ***长**,并且必须是静态且最终的。*
* 如果没有明确定义的 ***serialVersionUID*** 字段,则序列化运行时将计算该类的默认值。 该值可以根据编译器的实现而变化。 因此,建议定义 ***serialVersionUID。***
* 建议对 ***serialVersionUID 使用私有访问修饰符。***
* 不同的类可以具有相同的 ***serialVersionUID。***
* 在可序列化类中定义`serialVersionUID`字段不是必需的。
* 如果可序列化的类具有显式的`serialVersionUID`,则此字段的类型应为`long`,并且必须是静态且最终的。
* 如果没有明确定义的`serialVersionUID`字段,则序列化运行时将计算该类的默认值。 该值可以根据编译器的实现而变化。 因此,建议定义`serialVersionUID`
* 建议对`serialVersionUID`使用私有访问修饰符。
* 不同的类可以具有相同的`serialVersionUID`
* 数组类无法声明显式的 serialVersionUID,因此它们始终具有默认的计算值,但是对于数组类,无需匹配 serialVersionUID 值。
* 如果已加载的接收器类的 serialVersionUID 与相应的发送器类之间存在差异,则将引发 **InvalidClassException**
* 如果要禁止序列化同一类旧版本的新类,则应对同一类的不同版本使用不同的 ***serialVersionUID***
* 如果已加载的接收器类的 serialVersionUID 与相应的发送器类之间存在差异,则将引发`InvalidClassException`
* 如果要禁止序列化同一类旧版本的新类,则应对同一类的不同版本使用不同的`serialVersionUID`
## @SuppressWarnings(“序列”)
......
......@@ -125,7 +125,7 @@ HelloWorld obj = new HelloWorld();
objectName.methodName(arg1, arg2, arg3).
```
### 项目符号
### 项目
* 一个类只能具有公开和默认访问权限。
* 公开类必须使用相同名称的 Java 文件。
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册