Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenDocCN
jbt-zh
提交
c7387d1f
J
jbt-zh
项目概览
OpenDocCN
/
jbt-zh
8 个月 前同步成功
通知
0
Star
8
Fork
1
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
J
jbt-zh
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
c7387d1f
编写于
6月 23, 2020
作者:
W
wizardforcel
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
2020-06-23 21:24:52
上级
5bc5dcc7
变更
4
隐藏空白更改
内联
并排
Showing
4 changed file
with
79 addition
and
77 deletion
+79
-77
docs/46.md
docs/46.md
+36
-34
docs/48.md
docs/48.md
+16
-16
docs/49.md
docs/49.md
+25
-25
docs/50.md
docs/50.md
+2
-2
未找到文件。
docs/46.md
浏览文件 @
c7387d1f
# 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
;
...
...
docs/48.md
浏览文件 @
c7387d1f
# 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
docs/49.md
浏览文件 @
c7387d1f
# 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
docs/50.md
浏览文件 @
c7387d1f
# 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.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录