Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
武汉红喜
whatsmars
提交
f1f03bdf
W
whatsmars
项目概览
武汉红喜
/
whatsmars
通知
3
Star
0
Fork
1
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
W
whatsmars
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
f1f03bdf
编写于
8月 13, 2019
作者:
武汉红喜
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
collections
上级
bdd52776
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
60 addition
and
63 deletion
+60
-63
whatsmars-common/src/test/java/org/hongxi/java/util/collections/HashMap.java
...c/test/java/org/hongxi/java/util/collections/HashMap.java
+60
-63
未找到文件。
whatsmars-common/src/test/java/org/hongxi/java/util/collections/HashMap.java
浏览文件 @
f1f03bdf
...
...
@@ -4,6 +4,7 @@ import java.util.Objects;
/**
* @author shenhongxi 2019/8/13
* @see java.util.Hashtable
*/
public
class
HashMap
<
K
,
V
>
{
...
...
@@ -20,15 +21,11 @@ public class HashMap<K, V> {
/**
* The table is rehashed when its size exceeds this threshold. (The
* value of this field is (int)(capacity * loadFactor).)
*
* @serial
*/
private
int
threshold
;
/**
* The load factor for the hashtable.
*
* @serial
*/
private
float
loadFactor
;
...
...
@@ -193,64 +190,6 @@ public class HashMap<K, V> {
*/
private
static
final
int
MAX_ARRAY_SIZE
=
Integer
.
MAX_VALUE
-
8
;
/**
* Increases the capacity of and internally reorganizes this
* hashtable, in order to accommodate and access its entries more
* efficiently. This method is called automatically when the
* number of keys in the hashtable exceeds this hashtable's capacity
* and load factor.
*/
@SuppressWarnings
(
"unchecked"
)
protected
void
rehash
()
{
int
oldCapacity
=
table
.
length
;
Entry
<?,?>[]
oldMap
=
table
;
// overflow-conscious code
int
newCapacity
=
(
oldCapacity
<<
1
)
+
1
;
if
(
newCapacity
-
MAX_ARRAY_SIZE
>
0
)
{
if
(
oldCapacity
==
MAX_ARRAY_SIZE
)
// Keep running with MAX_ARRAY_SIZE buckets
return
;
newCapacity
=
MAX_ARRAY_SIZE
;
}
Entry
<?,?>[]
newMap
=
new
Entry
<?,?>[
newCapacity
];
modCount
++;
threshold
=
(
int
)
Math
.
min
(
newCapacity
*
loadFactor
,
MAX_ARRAY_SIZE
+
1
);
table
=
newMap
;
for
(
int
i
=
oldCapacity
;
i
--
>
0
;)
{
for
(
Entry
<
K
,
V
>
old
=
(
Entry
<
K
,
V
>)
oldMap
[
i
];
old
!=
null
;
)
{
Entry
<
K
,
V
>
e
=
old
;
old
=
old
.
next
;
int
index
=
(
e
.
hash
&
0x7FFFFFFF
)
%
newCapacity
;
e
.
next
=
(
Entry
<
K
,
V
>)
newMap
[
index
];
newMap
[
index
]
=
e
;
}
}
}
private
void
addEntry
(
int
hash
,
K
key
,
V
value
,
int
index
)
{
modCount
++;
Entry
<?,?>
tab
[]
=
table
;
if
(
count
>=
threshold
)
{
// Rehash the table if the threshold is exceeded
rehash
();
tab
=
table
;
hash
=
key
.
hashCode
();
index
=
(
hash
&
0x7FFFFFFF
)
%
tab
.
length
;
}
// Creates the new entry.
@SuppressWarnings
(
"unchecked"
)
Entry
<
K
,
V
>
e
=
(
Entry
<
K
,
V
>)
tab
[
index
];
tab
[
index
]
=
new
Entry
<>(
hash
,
key
,
value
,
e
);
count
++;
}
/**
* Maps the specified <code>key</code> to the specified
* <code>value</code> in this hashtable. Neither the key nor the
...
...
@@ -292,6 +231,64 @@ public class HashMap<K, V> {
return
null
;
}
private
void
addEntry
(
int
hash
,
K
key
,
V
value
,
int
index
)
{
modCount
++;
Entry
<?,?>
tab
[]
=
table
;
if
(
count
>=
threshold
)
{
// Rehash the table if the threshold is exceeded
rehash
();
tab
=
table
;
hash
=
key
.
hashCode
();
index
=
(
hash
&
0x7FFFFFFF
)
%
tab
.
length
;
}
// Creates the new entry.
@SuppressWarnings
(
"unchecked"
)
Entry
<
K
,
V
>
e
=
(
Entry
<
K
,
V
>)
tab
[
index
];
tab
[
index
]
=
new
Entry
<>(
hash
,
key
,
value
,
e
);
count
++;
}
/**
* Increases the capacity of and internally reorganizes this
* hashtable, in order to accommodate and access its entries more
* efficiently. This method is called automatically when the
* number of keys in the hashtable exceeds this hashtable's capacity
* and load factor.
*/
@SuppressWarnings
(
"unchecked"
)
protected
void
rehash
()
{
int
oldCapacity
=
table
.
length
;
Entry
<?,?>[]
oldMap
=
table
;
// overflow-conscious code
int
newCapacity
=
(
oldCapacity
<<
1
)
+
1
;
if
(
newCapacity
-
MAX_ARRAY_SIZE
>
0
)
{
if
(
oldCapacity
==
MAX_ARRAY_SIZE
)
// Keep running with MAX_ARRAY_SIZE buckets
return
;
newCapacity
=
MAX_ARRAY_SIZE
;
}
Entry
<?,?>[]
newMap
=
new
Entry
<?,?>[
newCapacity
];
modCount
++;
threshold
=
(
int
)
Math
.
min
(
newCapacity
*
loadFactor
,
MAX_ARRAY_SIZE
+
1
);
table
=
newMap
;
for
(
int
i
=
oldCapacity
;
i
--
>
0
;)
{
for
(
Entry
<
K
,
V
>
old
=
(
Entry
<
K
,
V
>)
oldMap
[
i
];
old
!=
null
;
)
{
Entry
<
K
,
V
>
e
=
old
;
old
=
old
.
next
;
int
index
=
(
e
.
hash
&
0x7FFFFFFF
)
%
newCapacity
;
e
.
next
=
(
Entry
<
K
,
V
>)
newMap
[
index
];
newMap
[
index
]
=
e
;
}
}
}
/**
* Removes the key (and its corresponding value) from this
* hashtable. This method does nothing if the key is not in the hashtable.
...
...
@@ -330,7 +327,7 @@ public class HashMap<K, V> {
public
void
clear
()
{
Entry
<?,?>
tab
[]
=
table
;
modCount
++;
for
(
int
index
=
tab
.
length
;
--
index
>=
0
;
)
for
(
int
index
=
tab
.
length
;
--
index
>=
0
;)
tab
[
index
]
=
null
;
count
=
0
;
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录