提交 c7387d1f 编写于 作者: W wizardforcel

2020-06-23 21:24:52

上级 5bc5dcc7
# Java Hashmap 教程
# Java `Hashmap`教程
> 原文: [https://javabeginnerstutorial.com/core-java-tutorial/java-hashmap/](https://javabeginnerstutorial.com/core-java-tutorial/java-hashmap/)
Java HashMap 是基于 HashTable 的 Map 实现。 这就是为什么面试官总是要求 HashMap 和 HashTable 之间存在差异的原因。 HashMap 基本上等于 HashTable,但以下两个区别除外。
Java `HashMap`是基于哈希表的`Map`实现。 这就是为什么面试官总是要求`HashMap``HashTable`之间存在差异的原因。 `HashMap`基本上等于`HashTable`,但以下两个区别除外。
1. HashTable 同步时,HashMap 不同步。
2. HashMap 允许为 null,而 HashTable 不允许为 null
1.`HashTable`同步时,`HashMap`不同步。
2. `HashMap`允许为`null`,而`HashTable`不允许为`null`
## HashMap 的重要属性
## `HashMap`的重要属性
| **`DEFAULT_INITIAL_CAPACITY`** | 默认初始容量(2 次幂 n)。 HashMap 可以包含许多元素。 |
| **`MAXIMUM_CAPACITY`** | HashMap 的最大容量(2 次幂 n)。 |
| **`loadFactor`** | 定义 HashMap 的阈值。 重新调整大小时将在 HashMap 中发生。 |
| **`DEFAULT_LOAD_FACTOR`** | 在 HashMap 的构造器中未定义任何负载因子时将使用。 |
| **`size`** | HashMap 包含的键/值对映射数。 |
| | |
| --- | --- |
| **`DEFAULT_INITIAL_CAPACITY`** | 默认初始容量(2 的 n 次幂)。 `HashMap`可以包含许多元素。 |
| **`MAXIMUM_CAPACITY`** | `HashMap`的最大容量(2 的 n 次幂)。 |
| **`loadFactor`** | 定义`HashMap`的阈值。 重新调整大小时将在`HashMap`中发生。 |
| **`DEFAULT_LOAD_FACTOR`** | 在`HashMap`的构造器中未定义任何负载因子时将使用。 |
| **`size`** | `HashMap`包含的键/值对映射数。 |
## 创建 HashMap
## 创建`HashMap`
在创建 HashMap 时未定义任何参数时,将使用默认的初始容量(16)和默认的负载系数(0.75)。 该 HashMap 最多可以包含 16 个元素,并且在插入第 13 个元素时会调整 HashMap 的大小。 这是因为负载系数为 75% (。75),并且在添加第 13 个元素(12 + 1)时将超过此阈值。
在创建`HashMap`时未定义任何参数时,将使用默认的初始容量(16)和默认的负载系数(0.75)。 该`HashMap`最多可以包含 16 个元素,并且在插入第 13 个元素时会调整`HashMap`的大小。 这是因为负载系数为 75% (.75),并且在添加第 13 个元素(`12 + 1`)时将超过此阈值。
您还可以提供初始容量和 loadFactor。 但是初始容量不能超过最大容量(2 功率 30),并且负载系数不能为零或负数。
您还可以提供初始容量和`loadFactor`。 但是初始容量不能超过最大容量(2 的 30 次幂),并且负载系数不能为零或负数。
## HashMap 中元素的添加
## `HashMap`中元素的添加
为了添加一个元素,您需要提供 2 个东西:键和值。
......@@ -29,52 +31,52 @@ Java HashMap 是基于 HashTable 的 Map 实现。 这就是为什么面试官
**值**:与指定键关联的值。
首先,HashMap 将为给定密钥生成一个哈希码,然后检查是否已经有与给定密钥相关联的值。 如果是,则它将返回已经关联的值。 否则,它将通过提供的键在 HashMap 中增加价值。
首先,`HashMap`将为给定密钥生成一个哈希码,然后检查是否已经有与给定密钥相关联的值。 如果是,则它将返回已经关联的值。 否则,它将通过提供的键在`HashMap`中增加价值。
## 重点
1. HashMap 不会按 Map 中的元素顺序提供任何保证(均值顺序会随时间变化)。
2. HashMap **获得****设置**操作提供恒定时间性能(如果使用正确的哈希算法)。
3. 迭代收集所需的时间与 HashMap 的“**容量**”((它可以容纳的元素)和**大小**(它当前容纳的元素)成比例。
1. `HashMap`不会按`Map`中的元素顺序提供任何保证(均值顺序会随时间变化)。
2. `HashMap`**获得****设置**操作提供恒定时间性能(如果使用正确的哈希算法)。
3. 迭代收集所需的时间与`HashMap`的“**容量**(它可以容纳的元素)和**大小**(它当前容纳的元素)成比例。
4. 如果迭代性能更为重要,那么建议不要将初始容量设置得太高而将负载系数设置得太低。 由于性能与*初始容量**负载系数*成正比。
* *容量*是哈希表中的存储桶数。
* 初始容量(默认值为 16)只是创​​建哈希表时的容量。
* *负载因子(默认值 .75)*是衡量哈希表在自动增加其容量之前的填充程度的度量。
* 当哈希表中的条目数超过负载因子与当前容量的乘积时,哈希表将被*重映射*(即内部数据结构将被重建)。
5. 使用“`Collections.synchronizedMap()`”方法使映射同步。
6. HashMap 类返回的 迭代器为“**故障快速**”。
7. HashMap 由 Array(Key)和 LinkedList(Value)支持。
8. HashMap 使用 hashcode(使用密钥)来标识应在 HashMap 中放置或检索对象的确切位置。
9. 最后,HashCode 返回后备数组中的确切位置(索引)。
10. 支持数组的大小固定。 因此,只要 Array 已满(此映射中的键数达到其阈值)。 将创建一个具有新容量的新数组,并将所有元素添加到该新数组中。
11. 在两种情况下(添加和检索对象)都将使用 HashCode,而在任何情况下均可以使用或可以不使用 equals()方法。
12. HashMap 中 Key 的最佳候选者是具有正确实现 Equals 和 Hashcode 方法的不可变类(示例:字符串类)。
13. 更好的哈希码和 equals 方法实现是 HashMap 的更好性能。
14. 这样,所有基本体的 String 和 Wrapper 类将是 HashMap 中键的理想选择。
6.`HashMap`类返回的迭代器为“**故障快速**”。
7. `HashMap`由数组(`Key`)和`LinkedList``Value`)支持。
8. `HashMap`使用`hashcode`(使用密钥)来标识应在`HashMap`中放置或检索对象的确切位置。
9. 最后,`HashCode`返回后备数组中的确切位置(索引)。
10. 支持数组的大小固定。 因此,只要数组已满(此映射中的键数达到其阈值)。 将创建一个具有新容量的新数组,并将所有元素添加到该新数组中。
11. 在两种情况下(添加和检索对象)都将使用`HashCode`,而在任何情况下均可以使用或可以不使用`equals()`方法。
12. `HashMap``Key`的最佳候选者是具有正确实现`Equals``Hashcode`方法的不可变类(示例:字符串类)。
13. 更好的哈希码和`equals`方法实现是`HashMap`的更好性能。
14. 这样,所有`String`和原始类型的包装类将是`HashMap`中键的理想选择。
# 什么是重新哈希
每个 HashMap 都有预定义的大小(初始容量),以及在需要时(超过阈值限制时)增加此大小(负载系数)的逻辑。
每个`HashMap`都有预定义的大小(初始容量),以及在需要时(超过阈值限制时)增加此大小(负载系数)的逻辑。
**示例**
使用以下配置创建 HashMap
使用以下配置创建`HashMap`
初始容量= 16(*默认初始容量*
初始容量16(*默认初始容量*
负载系数:.75(*默认负载系数*
在给定的 HashMap 中添加第 13 个元素后,超过给定 HashMap 的阈值限制,系统将创建一个新的后备键集数组(此数组的大小将是前一个数组的两倍)。 系统将不得不再次计算确切的存储桶,应放置上一个存储桶中的元素,并将旧 HashMap 中的所有元素复制到新的 HashMap 中。 整个过程称为 ReHashing,因为会再次为每个元素计算 Hashcode
在给定的`HashMap`中添加第 13 个元素后,超过给定`HashMap`的阈值限制,系统将创建一个新的后备键集数组(此数组的大小将是前一个数组的两倍)。 系统将不得不再次计算确切的存储桶,应放置上一个存储桶中的元素,并将旧`HashMap`中的所有元素复制到新的`HashMap`中。 整个过程称为重新哈希,因为会再次为每个元素计算`Hashcode`
因为超时的 HashMap 可能会被重新散布并且订单可能会发生变化。
因为超时的`HashMap`可能会被重新散布并且订单可能会发生变化。
# HashMap 的例子
# `HashMap`的例子
在此示例中,您将学到以下几点
1. 如何迭代映射
2. 迭代映射的不同方法
3. HashCode 和 Equals 何时被调用。 (请特别注意 HashCode 的输出和 equals 方法调用)
3. `HashCode``Equals`何时被调用。 (请特别注意`HashCode`的输出和`equals`方法调用)
```java
import java.util.HashMap;
......
# Java 初学者列表收集教程
# Java 初学者`List`集合教程
> 原文: [https://javabeginnerstutorial.com/core-java-tutorial/list-collection-tutorial-for-java-beginners/](https://javabeginnerstutorial.com/core-java-tutorial/list-collection-tutorial-for-java-beginners/)
在这里,我们将详细了解 List 接口及其不同实现。 `java.util`包中的列表接口是 java.util.Collection 接口的子类型。
在这里,我们将详细了解`List`接口及其不同实现。 `java.util`包中的列表接口是`java.util.Collection`接口的子类型。
## 列出接口显着点
## `List`接口显着点
1. 它是`java.util`包的一部分。
2. 它是`java.util.Collection`接口的子类型。
3. 列表是**有序集合**。 意味着可以按有序方式(按索引)访问 List 的元素。
3. 列表是**有序集合**。 意味着可以按有序方式(按索引)访问`List`的元素。
4. 允许重复值。
5. 允许为 NULL 值。
6. List 有一个名为 ListIterator 的特殊迭代器。 这将有助于双向遍历列表。
7. List 可以完全控制每个元素的插入位置。
5. 允许为`NULL`值。
6. `List`有一个名为`ListIterator`的特殊迭代器。 这将有助于双向遍历列表。
7. `List`可以完全控制每个元素的插入位置。
## 列表界面可用的操作
## `List`界面可用的操作
* 位置访问
* 搜索
* 迭代
* 范围视图
## 列表接口的具体实现
## `List`接口的具体实现
* java.util.ArrayList
* java.util.LinkedList
* java.util.Vector
* java.util.Stack
* `java.util.ArrayList`
* `java.util.LinkedList`
* `java.util.Vector`
* `java.util.Stack`
## 创建列表实例
......@@ -70,7 +70,7 @@ listA.add(0, "element 0");
## 访问元素
**语法** E set(int index,E element);
**语法**`E set(int index, E element);`
**用途**:用于返回指定位置的元素
......@@ -78,7 +78,7 @@ listA.add(0, "element 0");
## 替换元素
**语法**E set(int index, E element);
**语法**`E set(int index, E element);`
**用途**:用于替换列表中指定位置的元素。
......@@ -87,4 +87,4 @@ listA.add(0, "element 0");
## 性能点
* 列表界面具有搜索对象的方法。 但是不应使用相同的方法,因为它会降低性能,因为在某些实现中它将使用线性搜索。
* 列表可以包含另一个列表作为元素,但是 HashCode 和 Equals 不适用于这些列表,因此不应使用相同的列表。
\ No newline at end of file
* 列表可以包含另一个列表作为元素,但是`HashCode``Equals`不适用于这些列表,因此不应使用相同的列表。
\ No newline at end of file
# Java 初学者的映射收藏教程
# Java 初学者的`Map`集合教程
> 原文: [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
`Map`是 Java 集合框架下的一个接口
# 映射界面的主要特征
# `Map`界面的主要特征
* 它是一个用于将键映射到值的对象。
* 映射不能包含重复值。
* 每个键最多可以映射到一个值。
* 该接口替代了 Dictionary 类,后者是一个抽象类,而不是 Interface
* Map 界面允许 3 个集合视图
* 套钥匙
* 价值集合
* 该接口替代了`Dictionary`类,后者是一个抽象类,而不是接口
* `Map`界面允许 3 个集合视图
* 键集
* 值集
* 键值映射集
* 由于 Map 如上所述提供了 3 个视图,因此您可以迭代键,值或键值对。
* 可以在迭代过程中以安全的方式从 Map 中删除条目。
* 由于`Map`如上所述提供了 3 个视图,因此您可以迭代键,值或键值对。
* 可以在迭代过程中以安全的方式从`Map`中删除条目。
* 不允许映射包含自身作为键。
* 映射可以包含自身作为值。
* 一些映射实现可以包含的键和值有一些限制。
......@@ -23,26 +23,26 @@ Map 是 Java Collection 框架下的一个 Interface。
# 具体映射实现
* HashMap
* 哈希表
* EnumMap
* IdentityHashMap
* LinkedHashMap
* 属性
* 树形图
* WeakHashMap
* ConcurrentSkipListMap
* ConcurrentHashMap
* `HashMap`
* `HashTable`
* `EnumMap`
* `IdentityHashMap`
* `LinkedHashMap`
* `Properties`
* `TreeMap`
* `WeakHashMap`
* `ConcurrentSkipListMap`
* `ConcurrentHashMap`
# 映射界面中的重要方法
# `Map`界面中的重要方法
* **`put(K key, V value)`**:使用指定的键将指定的值放入映射中。
* **`putAll(Map<? extends K, ? extends V> m)`**:将所有映射从给定 Map 复制到此 Map
* **`putAll(Map<? extends K, ? extends V> m)`**:将所有映射从给定`Map`复制到此`Map`
* **`keySet()`**:返回包含此映射中的密钥的**集**
* **`values()`**:返回一个**集合**,其中包含此 Map 中的所有值。
* **`isEmpty()`**:检查给定 Map 中是否有任何元素。
* **`values()`**:返回一个**集合**,其中包含此`Map`中的所有值。
* **`isEmpty()`**:检查给定`Map`中是否有任何元素。
* **`remove(Object key)`**:从此映射中删除键的映射(如果存在)。
* **`containsKey(Object key)`**:检查指定键是否存在任何映射。
* **`containsValue(Object value)`**:检查是否存在用于指定 Object 的任何映射(可能不止一个)。
* **`containsValue(Object value)`**:检查是否存在用于指定对象的任何映射(可能不止一个)。
* **`get(Object key)`**:返回与此键关联的值。
* **`clear() `**:Used to remove all the mapping in given Map.
\ No newline at end of file
* **`clear() `**:用于从给定映射中移除所有映射。
\ No newline at end of file
# Java 初学者的集合教程
# Java 初学者的`Set`教程
> 原文: [https://javabeginnerstutorial.com/core-java-tutorial/set-collection-tutorial-for-java-beginners/](https://javabeginnerstutorial.com/core-java-tutorial/set-collection-tutorial-for-java-beginners/)
Set 是 Java Collection Framework 的一部分。 Set *java.util* 程序包中的一个接口。 它实现了 Collection 接口。
`Set`是 Java 集合框架的一部分。 `Set`*java.util* 程序包中的一个接口。 它实现了 Collection 接口。
# 与集合有关的要点
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册