由于LinkedHashMap/Set保持Collection中的条目顺序,因此它会导致性能稍低.我想知道为什么会这样.
我有以下代码:
private static class Node {
public LinkedHashSet<String> s = new LinkedHashSet<String>();
public Node(String s) {
this.s.add(s);
}
}
public static void main(String[] args) {
LinkedHashSet<Node> set1 = new LinkedHashSet<Node>();
set1.add(new Node("foo"));
LinkedHashSet<Node> set2 = new LinkedHashSet<Node>(set1);
LinkedHashSet<String> modifyingSet = new LinkedHashSet<String>();
modifyingSet.add("modifying foo");
for(Node n : set2) {
n.s = new LinkedHashSet<String>(modifyingSet);
break;
}
if (compare(set1, set2)) {
System.out.println("Equal");
} else {
System.out.println("Not Equal");
}
return;
}
private static boolean compare(LinkedHashSet<Node> h1, LinkedHashSet<Node> h2) {
Iterator<Node> h1i = h1.iterator(); …Run Code Online (Sandbox Code Playgroud) 也许我很挑剔,但在javadoc中有关于LinkedHashSet实现的以下信息:
此实现与HashSet的不同之处在于它维护了一个贯穿其所有条目的双向链表.
我在LinkedHashSet类中找不到任何双链表.有人可以帮忙吗?
在以下代码中,如果参数为{1,3,2},则在while循环中,i为1,3,2.
我已经在使用LinkedHashSet,为什么订单不是1,2,3?我还需要做什么才能按升序进行迭代?
无法在o(log n)时间内使用TreeSet它add, remove, contains().
public static void iterate(int[] num) {
LinkedHashSet<Integer> set = new LinkedHashSet<Integer>();
for (int i : num) {
set.add(i);
}
Iterator<Integer> iter = set.iterator();
while (iter.hasNext()) {
// WHY IS i THE SAME ORDER AS INSERATION ORDER, NOT ASSENDING ORDER?
int i = iter.next();
}
}
Run Code Online (Sandbox Code Playgroud) 我在GWT中有以下实体
@JsType(namespace = "my.entities")
public class MyEntity {
private Set<String> texts;
public Set<String> getTexts(){
if(this.texts==null)
this.texts=new LinkedHashSet<String>();
return this.texts;
}
public void setTexts(Set<String> texts){
this.texts=texts;
}
}
Run Code Online (Sandbox Code Playgroud)
当我myEntityVar.getTexts()用Java语言调用时,返回的对象是HashSet。似乎jsinterop将HashSet的java实现转换为JavaScript。但是如何使用JavaScript创建新的HashSet myEntityVar.setTexts(texts)呢?我为“文本”参数尝试了一个数组,但这不起作用。因此,我需要以某种方式在JavaScript中使用HashSet。但是,我不知道在哪里找到它。任何的想法?
我使用LinkedHashSet删除重复的条目.但对于以下自定义模型,Set仍保留重复条目.请帮我找到错误.覆盖equals方法有什么问题吗?对于您的类型信息,我只在他们的电话,类型和状态相同时处理两个节点等于.
public class BlockNode {
public int id;
public int type;
public int status;
public String phone;
public String date;
public String content;
@Override
public boolean equals(Object o) {
return this.toString().equals(((BlockNode)o).toString());
}
@Override
public String toString() {
return "number:" + phone + " type:" + type + " status:" + status + "\n";
}
}
Run Code Online (Sandbox Code Playgroud) 我有两个自定义对象集(LinkedHashSet),它们覆盖了hashCode()和equals()方法.
比较这两个集合时,即使哈希码相同,equal()方法也会失败.
System.out.println("cmContacts.equals(cm2Contacts):" + cmContacts.equals(cm2Contacts));
System.out.println("cm2Contacts.equals(cmContacts):" + cm2Contacts.equals(cmContacts));
System.out.println("compare hash codes:" + ( cm2Contacts.hashCode() == cmContacts.hashCode() ) );
Run Code Online (Sandbox Code Playgroud)
返回:
cmContacts.equals(cm2Contacts):假
cm2Contacts.equals(cmContacts):假
比较哈希码:true
根据文档,如果哈希码相同,则equals方法应该返回true.
集合的哈希码被定义为集合中元素的哈希码的总和,其中空元素的哈希码被定义为零.这确保了s1.equals(s2)意味着对于任何两个集合s1和s2的s1.hashCode()== s2.hashCode(),如Object.hashCode()的常规协定所要求的那样.
https://docs.oracle.com/javase/7/docs/api/java/util/Set.html#equals(java.lang.Object)
任何想法为什么会这样?