我一直喜欢树木,它们很好,O(n*log(n))而且它们整洁.然而,我所知道的每一位软件工程师都有针对性地问我为什么会使用TreeSet.从CS背景来看,我认为你所使用的并不重要,而且我不想乱用哈希函数和桶(在这种情况下Java).
在这情况下,我应该使用HashSet过TreeSet?
如果每个对象添加到java.util.HashSet中以确定性的方式实现的Object.Equals()和是Object.hashCode(),是迭代顺序在HashSet的保证用于每加入相同组元素是相同的,而不管的他们被添加的顺序?
奖金问题:如果插入顺序相同怎么办?
(假设Sun JDK6具有相同的HashSet初始化.)
编辑:我原来的问题不明确.它不是关于HashSet的一般契约,而是Sun在JDK6中对HashSet的实现提供了关于确定性的保证.它本质上是非确定性的吗?什么影响其迭代器使用的顺序?
我知道HashMap 不保证订单.请考虑以下代码:
import java.util.HashMap;
import java.util.Map;
public class SandBox {
protected static class Book {
String name;
public Book(String name) {
this.name = name;
}
@Override
public String toString() {
return name;
}
}
protected static class MyThread extends Thread {
@Override
public void run() {
super.run();
final int n = 10;
Book[] books = new Book[n];
for (int i=0; i<n; i++)
books[i] = new Book("b" + i);
for (Book b : books)
System.out.print(b + ", ");
System.out.println();
HashMap<Book, …Run Code Online (Sandbox Code Playgroud)