为什么Set及子类中没有提供随机取元素的方法

在List中提供了get等方法来实现随机取在容器中的元素,但是,为什么在Set中没有提供呢,如果要在Set及子类中实现随机读取元素,该怎么操作,不可能自己去遍历或将Set存到List中去吧。

1.可以用Set的一下两个方法获取可以随机访问的数组:
[quote] Object[] toArray()
返回一个包含 set 中所有元素的数组。
T[]
toArray(T[] a)
返回一个包含 set 中所有元素的数组;返回数组的运行时类型是指定数组的类型。
[/quote]
2.可以继承HashSet,使用复合数据结构:
[code="java"]

import java.util.ArrayList;
import java.util.HashSet;

public class ArraySet extends HashSet {

private static final long serialVersionUID = -7548294595221509577L;
private ArrayList<E> list = new ArrayList<E>();

/**
 * @param index
 * @return
 * @see java.util.ArrayList#get(int)
 */
public E get(int index) {
    return list.get(index);
}

@Override
public boolean add(E o) {
    if (super.add(o)) {
        list.add(o);
        return true;
    } else
        return false;
}

@Override
public boolean remove(Object o) {
    if (super.remove(o)) {
        list.remove(o);
        return true;
    } else
        return false;
}

@Override
public void clear() {
    super.clear();
    list.clear();
}

}
[/code]
自己抉择吧

你直接佛纳甘set取出来循环放进list里面不就行了吗?

List是一个集合呀,里面有很多元素,怎么知道你去哪个呀?所以要遍历呀

例如 List list = new ArrayList();
list.set...
list.set.....

   for(int i =0;i<list.size();i++){
      System.out.println(list[i]);

}

以HashSet为例,源码中有这么几行代码

[code="java"]
private transient HashMap map;

// Dummy value to associate with an Object in the backing Map
private static final Object PRESENT = new Object();

/**
 * Constructs a new, empty set; the backing <tt>HashMap</tt> instance has
 * default initial capacity (16) and load factor (0.75).
 */
public HashSet() {
map = new HashMap<E,Object>();
}

public boolean add(E e) {
return map.put(e, PRESENT)==null;
}

[/code]

可以明显看出,HashSet的本质是一个Map,Map的key就是HashSet加入的值,Map的value都是PRESENT(Object的实例)。Map是怎么存储的?HashMap是随机存储的,只能通过key来get,没有顺序遍历。

而List的本质是一个数组,当然可以通过get(index)获取

如果还不是很清楚,建议看看List ArrayList LinkedList Set HashSet TreeSet 的源码,也不要被源码吓到,很简单的,我都看懂了 :D

set是一个集合,集合就是一堆东西的意思,set中的东西是不重复的,即使你放了两个一样的东西,set只会保留一个;set是不能随机存取的,而且set的顺序是不固定的,读的顺序跟你存的顺序也是不同的,这是由set的性质决定的。而list是链表的意思,存取的顺序是固定的,所以可以随机读。如果要随机存取,那就用list吧。