我不确定是否有问题java.util.concurrent.ConcurrentSkipListSet
?我正在尝试将一些对象添加到 ConcurrentSkipListSet (由我自己的比较器维护的顺序)。添加后,我改变了一些对象的状态。我更改的属性包括比较器中使用的属性。现在,当我尝试删除一些对象时,它失败了。该对象不会从 ConcurrentSkipListSet 中删除,并且remove(Object)
返回 false。
如果我用 TreeSet 替换 ConcurrentSkipListSet 我看不到这种行为。
不确定我是否在这里做一些愚蠢的事情或遗漏了什么:(。这是一个示例代码片段。
public class TreeVsSkip {
static TreeSet ts = new TreeSet(new Comparator(){
@Override
public int compare(Object o1, Object o2) {
if(((Emp)o1).empid == ((Emp)o2).empid){
return 0;
}
if(((Emp)o1).empid > ((Emp)o2).empid){
return 1;
}
return -1;
}
});
static ConcurrentSkipListSet<Emp> csls = new ConcurrentSkipListSet(new Comparator(){
@Override
public int compare(Object o1, Object o2) {
if(((Emp)o1).empid == ((Emp)o2).empid){
return 0;
}
if(((Emp)o1).empid > ((Emp)o2).empid){
return 1;
}
return -1;
}
});
public static void main(String ...strings ){
System.out.println("Testing Tree...");
Emp e1 = new Emp(1,"abc");
ts.add(e1);
ts.add(new Emp(2,"pqr"));
ts.add(new Emp(3,"xyz"));
System.out.println(ts);
e1.setName("test");
e1.setId(8);
System.out.println(ts);
ts.remove(new Emp(3,"xyz"));
System.out.println(ts);
System.out.println("Testing ConcurrentSkipSet...");
e1.setName("abc");
e1.setId(1);
csls.add(e1);
csls.add(new Emp(2,"pqr"));
csls.add(new Emp(3,"xyz"));
System.out.println(csls);
e1.setName("test");
e1.setId(8);
System.out.println(csls);
System.out.println(csls.remove(new Emp(3,"xyz")));
System.out.println(csls);
}
static class Emp {
int empid;
String name;
Emp(int id, String n){
empid = id;
name = n;
}
void setName(String pname){
name = pname;
}
void setId(int pID){
empid = pID;
}
public String toString(){
return "EmpId:"+empid+"Name:"+name;
}
}
}
输出如下所示:
Testing Tree...
[EmpId:1Name:abc, EmpId:2Name:pqr, EmpId:3Name:xyz]
[EmpId:8Name:test, EmpId:2Name:pqr, EmpId:3Name:xyz]
[EmpId:8Name:test, EmpId:2Name:pqr]
Testing ConcurrentSkipSet...
[EmpId:1Name:abc, EmpId:2Name:pqr, EmpId:3Name:xyz]
[EmpId:8Name:test, EmpId:2Name:pqr, EmpId:3Name:xyz]
false
[EmpId:8Name:test, EmpId:2Name:pqr, EmpId:3Name:xyz]
请注意,此行为并不一致。有时元素会被删除。
我在 OS X 版本 10.11.6 上使用 java 版本“1.8.0_131”。
为破旧的代码道歉。赶紧煮好了。
谢谢。