Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openanolis
dragonwell8_jdk
提交
58c0e728
D
dragonwell8_jdk
项目概览
openanolis
/
dragonwell8_jdk
通知
4
Star
2
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
D
dragonwell8_jdk
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
58c0e728
编写于
12月 30, 2018
作者:
T
tvaleev
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
8214687: Optimize Collections.nCopies().hashCode() and equals()
Reviewed-by: igerasim, smarks
上级
964b6207
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
103 addition
and
2 deletion
+103
-2
src/share/classes/java/util/Collections.java
src/share/classes/java/util/Collections.java
+48
-1
test/java/util/Collections/NCopies.java
test/java/util/Collections/NCopies.java
+55
-1
未找到文件。
src/share/classes/java/util/Collections.java
浏览文件 @
58c0e728
...
...
@@ -459,7 +459,7 @@ public class Collections {
for
(
int
i
=
size
;
i
>
1
;
i
--)
swap
(
list
,
i
-
1
,
rnd
.
nextInt
(
i
));
}
else
{
Object
arr
[]
=
list
.
toArray
();
Object
[]
arr
=
list
.
toArray
();
// Shuffle array
for
(
int
i
=
size
;
i
>
1
;
i
--)
...
...
@@ -5062,6 +5062,53 @@ public class Collections {
return
new
CopiesList
<>(
toIndex
-
fromIndex
,
element
);
}
@Override
public
int
hashCode
()
{
if
(
n
==
0
)
return
1
;
// hashCode of n repeating elements is 31^n + elementHash * Sum(31^k, k = 0..n-1)
// this implementation completes in O(log(n)) steps taking advantage of
// 31^(2*n) = (31^n)^2 and Sum(31^k, k = 0..(2*n-1)) = Sum(31^k, k = 0..n-1) * (31^n + 1)
int
pow
=
31
;
int
sum
=
1
;
for
(
int
i
=
Integer
.
numberOfLeadingZeros
(
n
)
+
1
;
i
<
Integer
.
SIZE
;
i
++)
{
sum
*=
pow
+
1
;
pow
*=
pow
;
if
((
n
<<
i
)
<
0
)
{
pow
*=
31
;
sum
=
sum
*
31
+
1
;
}
}
return
pow
+
sum
*
(
element
==
null
?
0
:
element
.
hashCode
());
}
@Override
public
boolean
equals
(
Object
o
)
{
if
(
o
==
this
)
return
true
;
if
(
o
instanceof
CopiesList
)
{
CopiesList
<?>
other
=
(
CopiesList
<?>)
o
;
return
n
==
other
.
n
&&
(
n
==
0
||
eq
(
element
,
other
.
element
));
}
if
(!(
o
instanceof
List
))
return
false
;
int
remaining
=
n
;
E
e
=
element
;
Iterator
<?>
itr
=
((
List
<?>)
o
).
iterator
();
if
(
e
==
null
)
{
while
(
itr
.
hasNext
()
&&
remaining
--
>
0
)
{
if
(
itr
.
next
()
!=
null
)
return
false
;
}
}
else
{
while
(
itr
.
hasNext
()
&&
remaining
--
>
0
)
{
if
(!
e
.
equals
(
itr
.
next
()))
return
false
;
}
}
return
remaining
==
0
&&
!
itr
.
hasNext
();
}
// Override default methods in Collection
@Override
public
Stream
<
E
>
stream
()
{
...
...
test/java/util/Collections/NCopies.java
浏览文件 @
58c0e728
/*
* Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2005,
2018,
Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
...
...
@@ -82,6 +82,56 @@ public class NCopies {
checkEmpty
(
x
.
subList
(
x
.
size
()/
2
,
x
.
size
()/
2
));
}
private
static
<
T
>
List
<
T
>
referenceNCopies
(
int
n
,
T
o
)
{
// A simplest correct implementation of nCopies to compare with the actual optimized implementation
return
new
AbstractList
<
T
>()
{
public
int
size
()
{
return
n
;
}
public
T
get
(
int
index
)
{
check
(
0
<=
index
&&
index
<
n
,
"Index is incorrect"
);
return
o
;
}
};
}
private
static
void
checkHashCode
()
{
int
[]
sizes
=
{
0
,
1
,
2
,
3
,
5
,
10
,
31
,
32
,
100
,
1000
};
String
[]
elements
=
{
null
,
"non-null"
};
for
(
int
size
:
sizes
)
{
for
(
String
element
:
elements
)
{
int
expectedHashCode
=
referenceNCopies
(
size
,
element
).
hashCode
();
int
actualHashCode
=
Collections
.
nCopies
(
size
,
element
).
hashCode
();
check
(
expectedHashCode
==
actualHashCode
,
"Collections.nCopies("
+
size
+
", "
+
element
+
").hashCode()"
);
}
}
}
private
static
void
checkEquals
()
{
int
[][]
sizePairs
=
{{
0
,
0
},
{
0
,
1
},
{
1
,
0
},
{
1
,
1
},
{
1
,
2
},
{
2
,
1
}};
String
[]
elements
=
{
null
,
"non-null"
};
for
(
int
[]
pair
:
sizePairs
)
{
for
(
String
element
:
elements
)
{
boolean
equal
=
pair
[
0
]
==
pair
[
1
];
String
msg
=
"["
+
pair
[
0
]
+
", "
+
element
+
"] <=> ["
+
pair
[
1
]
+
", "
+
element
+
"]"
;
check
(
equal
==
Collections
.
nCopies
(
pair
[
0
],
element
).
equals
(
Collections
.
nCopies
(
pair
[
1
],
element
)),
msg
);
check
(
equal
==
Collections
.
nCopies
(
pair
[
0
],
element
).
equals
(
referenceNCopies
(
pair
[
1
],
element
)),
msg
);
check
(
equal
==
referenceNCopies
(
pair
[
0
],
element
).
equals
(
Collections
.
nCopies
(
pair
[
1
],
element
)),
msg
);
}
}
List
<
String
>
nulls
=
Collections
.
nCopies
(
10
,
null
);
List
<
String
>
nonNulls
=
Collections
.
nCopies
(
10
,
"non-null"
);
List
<
String
>
nullsButOne
=
new
ArrayList
<>(
nulls
);
nullsButOne
.
set
(
9
,
"non-null"
);
List
<
String
>
nonNullsButOne
=
new
ArrayList
<>(
nonNulls
);
nonNullsButOne
.
set
(
9
,
null
);
check
(!
nulls
.
equals
(
nonNulls
));
check
(!
nulls
.
equals
(
nullsButOne
));
check
(!
nulls
.
equals
(
nonNullsButOne
));
check
(!
nonNulls
.
equals
(
nonNullsButOne
));
check
(
Collections
.
nCopies
(
0
,
null
).
equals
(
Collections
.
nCopies
(
0
,
"non-null"
)));
}
public
static
void
main
(
String
[]
args
)
{
try
{
List
<
String
>
empty
=
Collections
.
nCopies
(
0
,
"foo"
);
...
...
@@ -92,6 +142,10 @@ public class NCopies {
check
(
foos
.
size
()
==
42
);
checkFoos
(
foos
.
subList
(
foos
.
size
()/
2
,
foos
.
size
()-
1
));
checkHashCode
();
checkEquals
();
}
catch
(
Throwable
t
)
{
unexpected
(
t
);
}
System
.
out
.
printf
(
"%nPassed = %d, failed = %d%n%n"
,
passed
,
failed
);
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录