A collection that contains no duplicate elements
一个没有重复元素的Collection
这个集合代表了数学上的集合. 也就是说
- 一个
Set
里只有一个null
; -
Set
里不会有出现两个对象出现obj1.equals.(obj2)
在Collection的基础上 , 集合在 addd
, equals
hashcode
还有所有的构造方法上添加了额外的规范(构造方法必须生成一个符合定义的Set对象,这不是废话吗?不过这个确实不是废话,后面就知道了). 另外, Collection 中的其他方法, Set也显式声明了, 但并没有给这些声明的方法添加额外的约束,也就是说并没有这些方法的意义和Collection的是相同的(仅仅是为了方便).
注意:
- 禁止向Set把自身作为元素添加进去. 例如 :
set.add(set)
- 当易变的对象作为Set的元素时,应该充分考虑是不是可行的.因为 当Set里的元素的值发生了改变,即使影响了其
equals
方法时,Set并不会做出反应.请看例子:
Set<DemoObj> set = new HashSet<>();
DemoObj demo1 = new DemoObj(1);
DemoObj demo2 = new DemoObj(2);
DemoObj demoCopy2 = new DemoObj(2);
set.add(demo1);
set.add(demo2);
set.add(demoCopy2);
System.out.println(set.size());//2
demo1.id = 2;
System.out.println(set.size());//2
这下就知道为什么那句话不是废话了吧. 这个时候set里面的两个元素demo1.equals(demo2);
一些Set的实现类约束其插入的元素的合法性, 比如不能为null
,类型检查等等.. 如果插入一个非法的元素会抛出一个运行期异常, 查询一个非法的元素可能会抛出异常也可能会直接返回false
int size();
返回这个Set中的元素个数, 如果元素个数大于Integer.MAX_VALUE 就返回Integer.MAX_VALUE;
boolean isEmpty();
返回这个Set的元素个数是不是0
boolean contains(Object o);
判断Set是否含有对象o
Iterator<E> iterator();
返回一个非指定顺序的迭代器
Object[] toArray();
返回一个含有Set中所有元素的数组.记住返回值不是E[]而是Object[].使用时需要强转
<T> T[] toArray(T[] a);
返回一个数组b, 包含所有Set内的元素, b.length = max(a.length,set.size())
;
注意, 当a.length > set.size()时
b的前set.size个元素为set的元素, 其余为a数组中的后 a.length - set.size()
的元素. 也就是说, b为a的前set.size()
个元素被set的元素覆盖后的结果.
boolean add(E e);
将一个元素e添加进set.
如果e已经存在set里, 会返回false;
如果e是一个非法的元素,会抛出一个运行期异常;
boolean remove(Object o);
移除set中的对象o.成功移除返回true
; 如果set中不含有元素e使得e.equals(o)
, 那么返回false
.
boolean containsAll(Collection<?> c);
相当于对参数c进行一个遍历调用boolean contains(Object o);
boolean addAll(Collection<? extends E> c);
相当于对参数c进行一个遍历调用boolean add(E e);
boolean retainAll(Collection<?> c);
保留Collection下的元素,移除其余元素
boolean removeAll(Collection<?> c);
相当于对参数c进行一个遍历调用boolean remove(Object e);
void clear();
移除set中所有元素.
boolean equals(Object o);
判断两个集合包含的元素及其个数是否完全一致.
int hashCode();
返回Set中所有元素的hashCode总和.
default Spliterator<E> spliterator(){}
返回该set的并行迭代器Spliterator
网友评论