Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openanolis
dragonwell11
提交
060fb30e
D
dragonwell11
项目概览
openanolis
/
dragonwell11
通知
7
Star
2
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
D
dragonwell11
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
060fb30e
编写于
8月 09, 2013
作者:
P
psandoz
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
8022326: Spliterator for values of j.u.c.ConcurrentSkipListMap does not report ORDERED
Reviewed-by: martin, chegar
上级
c083ff27
变更
3
显示空白变更内容
内联
并排
Showing
3 changed file
with
130 addition
and
62 deletion
+130
-62
jdk/src/share/classes/java/util/TreeMap.java
jdk/src/share/classes/java/util/TreeMap.java
+1
-6
jdk/src/share/classes/java/util/concurrent/ConcurrentSkipListMap.java
...e/classes/java/util/concurrent/ConcurrentSkipListMap.java
+27
-8
jdk/test/java/util/Spliterator/SpliteratorCharacteristics.java
...est/java/util/Spliterator/SpliteratorCharacteristics.java
+102
-48
未找到文件。
jdk/src/share/classes/java/util/TreeMap.java
浏览文件 @
060fb30e
...
@@ -2944,16 +2944,11 @@ public class TreeMap<K,V>
...
@@ -2944,16 +2944,11 @@ public class TreeMap<K,V>
@Override
@Override
public
Comparator
<
Map
.
Entry
<
K
,
V
>>
getComparator
()
{
public
Comparator
<
Map
.
Entry
<
K
,
V
>>
getComparator
()
{
// Since SORTED is reported and Map.Entry elements are not comparable
// Adapt or create a key-based comparator
// then a non-null comparator needs to be returned
if
(
tree
.
comparator
!=
null
)
{
if
(
tree
.
comparator
!=
null
)
{
// Adapt the existing non-null comparator to compare entries
// by key
return
Map
.
Entry
.
comparingByKey
(
tree
.
comparator
);
return
Map
.
Entry
.
comparingByKey
(
tree
.
comparator
);
}
}
else
{
else
{
// Return a comparator of entries by key, with K assumed to be
// of Comparable
return
(
Comparator
<
Map
.
Entry
<
K
,
V
>>
&
Serializable
)
(
e1
,
e2
)
->
{
return
(
Comparator
<
Map
.
Entry
<
K
,
V
>>
&
Serializable
)
(
e1
,
e2
)
->
{
@SuppressWarnings
(
"unchecked"
)
@SuppressWarnings
(
"unchecked"
)
Comparable
<?
super
K
>
k1
=
(
Comparable
<?
super
K
>)
e1
.
getKey
();
Comparable
<?
super
K
>
k1
=
(
Comparable
<?
super
K
>)
e1
.
getKey
();
...
...
jdk/src/share/classes/java/util/concurrent/ConcurrentSkipListMap.java
浏览文件 @
060fb30e
...
@@ -34,6 +34,7 @@
...
@@ -34,6 +34,7 @@
*/
*/
package
java.util.concurrent
;
package
java.util.concurrent
;
import
java.io.Serializable
;
import
java.util.AbstractCollection
;
import
java.util.AbstractCollection
;
import
java.util.AbstractMap
;
import
java.util.AbstractMap
;
import
java.util.AbstractSet
;
import
java.util.AbstractSet
;
...
@@ -44,11 +45,15 @@ import java.util.Comparator;
...
@@ -44,11 +45,15 @@ import java.util.Comparator;
import
java.util.Iterator
;
import
java.util.Iterator
;
import
java.util.List
;
import
java.util.List
;
import
java.util.Map
;
import
java.util.Map
;
import
java.util.NavigableMap
;
import
java.util.NavigableSet
;
import
java.util.NavigableSet
;
import
java.util.NoSuchElementException
;
import
java.util.NoSuchElementException
;
import
java.util.Set
;
import
java.util.Set
;
import
java.util.SortedMap
;
import
java.util.SortedMap
;
import
java.util.SortedSet
;
import
java.util.Spliterator
;
import
java.util.Spliterator
;
import
java.util.concurrent.ConcurrentMap
;
import
java.util.concurrent.ConcurrentNavigableMap
;
import
java.util.function.BiFunction
;
import
java.util.function.BiFunction
;
import
java.util.function.Consumer
;
import
java.util.function.Consumer
;
import
java.util.function.BiConsumer
;
import
java.util.function.BiConsumer
;
...
@@ -108,9 +113,7 @@ import java.util.function.Function;
...
@@ -108,9 +113,7 @@ import java.util.function.Function;
* @since 1.6
* @since 1.6
*/
*/
public
class
ConcurrentSkipListMap
<
K
,
V
>
extends
AbstractMap
<
K
,
V
>
public
class
ConcurrentSkipListMap
<
K
,
V
>
extends
AbstractMap
<
K
,
V
>
implements
ConcurrentNavigableMap
<
K
,
V
>,
implements
ConcurrentNavigableMap
<
K
,
V
>,
Cloneable
,
Serializable
{
Cloneable
,
java
.
io
.
Serializable
{
/*
/*
* This class implements a tree-like two-dimensionally linked skip
* This class implements a tree-like two-dimensionally linked skip
* list in which the index levels are represented in separate
* list in which the index levels are represented in separate
...
@@ -1412,6 +1415,8 @@ public class ConcurrentSkipListMap<K,V> extends AbstractMap<K,V>
...
@@ -1412,6 +1415,8 @@ public class ConcurrentSkipListMap<K,V> extends AbstractMap<K,V>
/**
/**
* Saves this map to a stream (that is, serializes it).
* Saves this map to a stream (that is, serializes it).
*
*
* @param s the stream
* @throws java.io.IOException if an I/O error occurs
* @serialData The key (Object) and value (Object) for each
* @serialData The key (Object) and value (Object) for each
* key-value mapping represented by the map, followed by
* key-value mapping represented by the map, followed by
* {@code null}. The key-value mappings are emitted in key-order
* {@code null}. The key-value mappings are emitted in key-order
...
@@ -1436,6 +1441,10 @@ public class ConcurrentSkipListMap<K,V> extends AbstractMap<K,V>
...
@@ -1436,6 +1441,10 @@ public class ConcurrentSkipListMap<K,V> extends AbstractMap<K,V>
/**
/**
* Reconstitutes this map from a stream (that is, deserializes it).
* Reconstitutes this map from a stream (that is, deserializes it).
* @param s the stream
* @throws ClassNotFoundException if the class of a serialized object
* could not be found
* @throws java.io.IOException if an I/O error occurs
*/
*/
@SuppressWarnings
(
"unchecked"
)
@SuppressWarnings
(
"unchecked"
)
private
void
readObject
(
final
java
.
io
.
ObjectInputStream
s
)
private
void
readObject
(
final
java
.
io
.
ObjectInputStream
s
)
...
@@ -2548,8 +2557,7 @@ public class ConcurrentSkipListMap<K,V> extends AbstractMap<K,V>
...
@@ -2548,8 +2557,7 @@ public class ConcurrentSkipListMap<K,V> extends AbstractMap<K,V>
* @serial include
* @serial include
*/
*/
static
final
class
SubMap
<
K
,
V
>
extends
AbstractMap
<
K
,
V
>
static
final
class
SubMap
<
K
,
V
>
extends
AbstractMap
<
K
,
V
>
implements
ConcurrentNavigableMap
<
K
,
V
>,
Cloneable
,
implements
ConcurrentNavigableMap
<
K
,
V
>,
Cloneable
,
Serializable
{
java
.
io
.
Serializable
{
private
static
final
long
serialVersionUID
=
-
7647078645895051609L
;
private
static
final
long
serialVersionUID
=
-
7647078645895051609L
;
/** Underlying map */
/** Underlying map */
...
@@ -3180,6 +3188,7 @@ public class ConcurrentSkipListMap<K,V> extends AbstractMap<K,V>
...
@@ -3180,6 +3188,7 @@ public class ConcurrentSkipListMap<K,V> extends AbstractMap<K,V>
public
long
estimateSize
()
{
public
long
estimateSize
()
{
return
Long
.
MAX_VALUE
;
return
Long
.
MAX_VALUE
;
}
}
}
}
final
class
SubMapValueIterator
extends
SubMapIter
<
V
>
{
final
class
SubMapValueIterator
extends
SubMapIter
<
V
>
{
...
@@ -3434,7 +3443,8 @@ public class ConcurrentSkipListMap<K,V> extends AbstractMap<K,V>
...
@@ -3434,7 +3443,8 @@ public class ConcurrentSkipListMap<K,V> extends AbstractMap<K,V>
}
}
public
int
characteristics
()
{
public
int
characteristics
()
{
return
Spliterator
.
CONCURRENT
|
Spliterator
.
NONNULL
;
return
Spliterator
.
CONCURRENT
|
Spliterator
.
ORDERED
|
Spliterator
.
NONNULL
;
}
}
}
}
...
@@ -3528,8 +3538,17 @@ public class ConcurrentSkipListMap<K,V> extends AbstractMap<K,V>
...
@@ -3528,8 +3538,17 @@ public class ConcurrentSkipListMap<K,V> extends AbstractMap<K,V>
}
}
public
final
Comparator
<
Map
.
Entry
<
K
,
V
>>
getComparator
()
{
public
final
Comparator
<
Map
.
Entry
<
K
,
V
>>
getComparator
()
{
return
comparator
==
null
?
null
:
// Adapt or create a key-based comparator
Map
.
Entry
.
comparingByKey
(
comparator
);
if
(
comparator
!=
null
)
{
return
Map
.
Entry
.
comparingByKey
(
comparator
);
}
else
{
return
(
Comparator
<
Map
.
Entry
<
K
,
V
>>
&
Serializable
)
(
e1
,
e2
)
->
{
@SuppressWarnings
(
"unchecked"
)
Comparable
<?
super
K
>
k1
=
(
Comparable
<?
super
K
>)
e1
.
getKey
();
return
k1
.
compareTo
(
e2
.
getKey
());
};
}
}
}
}
}
...
...
jdk/test/java/util/Spliterator/SpliteratorCharacteristics.java
浏览文件 @
060fb30e
...
@@ -23,7 +23,7 @@
...
@@ -23,7 +23,7 @@
/**
/**
* @test
* @test
* @bug 8020156 8020009
* @bug 8020156 8020009
8022326
* @run testng SpliteratorCharacteristics
* @run testng SpliteratorCharacteristics
*/
*/
...
@@ -32,79 +32,133 @@ import org.testng.annotations.Test;
...
@@ -32,79 +32,133 @@ import org.testng.annotations.Test;
import
java.util.Arrays
;
import
java.util.Arrays
;
import
java.util.Collection
;
import
java.util.Collection
;
import
java.util.Comparator
;
import
java.util.Comparator
;
import
java.util.Map
;
import
java.util.Set
;
import
java.util.SortedMap
;
import
java.util.SortedSet
;
import
java.util.Spliterator
;
import
java.util.Spliterator
;
import
java.util.TreeMap
;
import
java.util.TreeMap
;
import
java.util.TreeSet
;
import
java.util.TreeSet
;
import
java.util.concurrent.ConcurrentSkipListMap
;
import
java.util.concurrent.ConcurrentSkipListSet
;
import
static
org
.
testng
.
Assert
.*;
import
static
org
.
testng
.
Assert
.*;
@Test
@Test
public
class
SpliteratorCharacteristics
{
public
class
SpliteratorCharacteristics
{
public
void
testTreeMap
()
{
// TreeMap
TreeMap
<
Integer
,
String
>
tm
=
new
TreeMap
<>();
tm
.
put
(
1
,
"4"
);
tm
.
put
(
2
,
"3"
);
tm
.
put
(
3
,
"2"
);
tm
.
put
(
4
,
"1"
);
assertCharacteristics
(
tm
.
keySet
(),
public
void
testTreeMap
()
{
assertSortedMapCharacteristics
(
new
TreeMap
<>(),
Spliterator
.
SIZED
|
Spliterator
.
DISTINCT
|
Spliterator
.
SIZED
|
Spliterator
.
DISTINCT
|
Spliterator
.
SORTED
|
Spliterator
.
ORDERED
);
Spliterator
.
SORTED
|
Spliterator
.
ORDERED
);
assertNullComparator
(
tm
.
keySet
());
}
assertCharacteristics
(
tm
.
values
(),
Spliterator
.
SIZED
|
Spliterator
.
ORDERED
);
assertISEComparator
(
tm
.
values
());
assertCharacteristics
(
tm
.
entrySet
(),
public
void
testTreeMapWithComparator
()
{
assertSortedMapCharacteristics
(
new
TreeMap
<>(
Comparator
.
reverseOrder
()),
Spliterator
.
SIZED
|
Spliterator
.
DISTINCT
|
Spliterator
.
SIZED
|
Spliterator
.
DISTINCT
|
Spliterator
.
SORTED
|
Spliterator
.
ORDERED
);
Spliterator
.
SORTED
|
Spliterator
.
ORDERED
);
assertNotNullComparator
(
tm
.
entrySet
());
}
}
public
void
testTreeMapWithComparator
()
{
TreeMap
<
Integer
,
String
>
tm
=
new
TreeMap
<>(
Comparator
.<
Integer
>
reverseOrder
());
tm
.
put
(
1
,
"4"
);
tm
.
put
(
2
,
"3"
);
tm
.
put
(
3
,
"2"
);
tm
.
put
(
4
,
"1"
);
assertCharacteristics
(
tm
.
keySet
(),
// TreeSet
public
void
testTreeSet
()
{
assertSortedSetCharacteristics
(
new
TreeSet
<>(),
Spliterator
.
SIZED
|
Spliterator
.
DISTINCT
|
Spliterator
.
SIZED
|
Spliterator
.
DISTINCT
|
Spliterator
.
SORTED
|
Spliterator
.
ORDERED
);
Spliterator
.
SORTED
|
Spliterator
.
ORDERED
);
assertNotNullComparator
(
tm
.
keySet
());
}
assertCharacteristics
(
tm
.
values
(),
Spliterator
.
SIZED
|
Spliterator
.
ORDERED
);
assertISEComparator
(
tm
.
values
());
assertCharacteristics
(
tm
.
entrySet
(),
public
void
testTreeSetWithComparator
()
{
assertSortedSetCharacteristics
(
new
TreeSet
<>(
Comparator
.
reverseOrder
()),
Spliterator
.
SIZED
|
Spliterator
.
DISTINCT
|
Spliterator
.
SIZED
|
Spliterator
.
DISTINCT
|
Spliterator
.
SORTED
|
Spliterator
.
ORDERED
);
Spliterator
.
SORTED
|
Spliterator
.
ORDERED
);
assertNotNullComparator
(
tm
.
entrySet
());
}
}
public
void
testTreeSet
()
{
TreeSet
<
Integer
>
ts
=
new
TreeSet
<>();
ts
.
addAll
(
Arrays
.
asList
(
1
,
2
,
3
,
4
));
assertCharacteristics
(
ts
,
// ConcurrentSkipListMap
Spliterator
.
SIZED
|
Spliterator
.
DISTINCT
|
Spliterator
.
SORTED
|
Spliterator
.
ORDERED
);
public
void
testConcurrentSkipListMap
()
{
assertNullComparator
(
ts
);
assertSortedMapCharacteristics
(
new
ConcurrentSkipListMap
<>(),
Spliterator
.
CONCURRENT
|
Spliterator
.
NONNULL
|
Spliterator
.
DISTINCT
|
Spliterator
.
SORTED
|
Spliterator
.
ORDERED
);
}
}
public
void
testTreeSetWithComparator
()
{
public
void
testConcurrentSkipListMapWithComparator
()
{
TreeSet
<
Integer
>
ts
=
new
TreeSet
<>(
Comparator
.
reverseOrder
());
assertSortedMapCharacteristics
(
new
ConcurrentSkipListMap
<>(
Comparator
.<
Integer
>
reverseOrder
()),
ts
.
addAll
(
Arrays
.
asList
(
1
,
2
,
3
,
4
));
Spliterator
.
CONCURRENT
|
Spliterator
.
NONNULL
|
Spliterator
.
DISTINCT
|
Spliterator
.
SORTED
|
Spliterator
.
ORDERED
);
}
assertCharacteristics
(
ts
,
Spliterator
.
SIZED
|
Spliterator
.
DISTINCT
|
// ConcurrentSkipListSet
Spliterator
.
SORTED
|
Spliterator
.
ORDERED
);
assertNotNullComparator
(
ts
);
public
void
testConcurrentSkipListSet
()
{
assertSortedSetCharacteristics
(
new
ConcurrentSkipListSet
<>(),
Spliterator
.
CONCURRENT
|
Spliterator
.
NONNULL
|
Spliterator
.
DISTINCT
|
Spliterator
.
SORTED
|
Spliterator
.
ORDERED
);
}
}
public
void
testConcurrentSkipListSetWithComparator
()
{
assertSortedSetCharacteristics
(
new
ConcurrentSkipListSet
<>(
Comparator
.
reverseOrder
()),
Spliterator
.
CONCURRENT
|
Spliterator
.
NONNULL
|
Spliterator
.
DISTINCT
|
Spliterator
.
SORTED
|
Spliterator
.
ORDERED
);
}
//
void
assertSortedMapCharacteristics
(
SortedMap
<
Integer
,
String
>
m
,
int
keyCharacteristics
)
{
initMap
(
m
);
boolean
hasComparator
=
m
.
comparator
()
!=
null
;
Set
<
Integer
>
keys
=
m
.
keySet
();
assertCharacteristics
(
keys
,
keyCharacteristics
);
if
(
hasComparator
)
{
assertNotNullComparator
(
keys
);
}
else
{
assertNullComparator
(
keys
);
}
assertCharacteristics
(
m
.
values
(),
keyCharacteristics
&
~(
Spliterator
.
DISTINCT
|
Spliterator
.
SORTED
));
assertISEComparator
(
m
.
values
());
assertCharacteristics
(
m
.
entrySet
(),
keyCharacteristics
);
assertNotNullComparator
(
m
.
entrySet
());
}
void
assertSortedSetCharacteristics
(
SortedSet
<
Integer
>
s
,
int
keyCharacteristics
)
{
initSet
(
s
);
boolean
hasComparator
=
s
.
comparator
()
!=
null
;
assertCharacteristics
(
s
,
keyCharacteristics
);
if
(
hasComparator
)
{
assertNotNullComparator
(
s
);
}
else
{
assertNullComparator
(
s
);
}
}
void
initMap
(
Map
<
Integer
,
String
>
m
)
{
m
.
put
(
1
,
"4"
);
m
.
put
(
2
,
"3"
);
m
.
put
(
3
,
"2"
);
m
.
put
(
4
,
"1"
);
}
void
initSet
(
Set
<
Integer
>
s
)
{
s
.
addAll
(
Arrays
.
asList
(
1
,
2
,
3
,
4
));
}
void
assertCharacteristics
(
Collection
<?>
c
,
int
expectedCharacteristics
)
{
void
assertCharacteristics
(
Collection
<?>
c
,
int
expectedCharacteristics
)
{
assertCharacteristics
(
c
.
spliterator
(),
expectedCharacteristics
);
assertCharacteristics
(
c
.
spliterator
(),
expectedCharacteristics
);
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录