标签:code new with hashcode stat 不能 包含 out 必须
Set集合,类似于一个罐子,程序可以把多个对象"丢进"Set集合,而Set集合通常不能记住每个元素的添加顺序.Set集合与Collection基本相同,没有提供任何额外的方法.实际上Set就是Collection,只是行为有所不同(Set不允许有重复元素)
Set集合不允许包含相同的元素,如果试图把两个相同的元素添加入同一个Set集合中,则添加操作失败,add()返回false,且新元素不会被加入.
上面介绍Set的通用知识,因此完全适合后面介绍的HashSet,TreeSet和EnumSet三个实现类,只是这三个实现类各有特色.
HashSet是Set接口的典型实现,大多数时候使用的Set集合时就是使用这个实现类.HashSet按Hash算法来存储集合中的元素,因此具有良好的存取和查找性能。
HashSet具有以下特点:
1.不能保证元素的排列顺序,顺序可能与添加顺序不同,顺序也有可能发生变化。
2.HashSet不是同步的,如果多个线程同时访问一个HashSet。假设有两个或者以上的线程同时修改了HashSet集合时,则必须通过代码来保证其同步。
3.集合元素可以是null.
当使用HashSet集合来存入一个元素时,HashSet会调用该对象的hashCode()方法来得到该对象的hashCode()值,然后根据该hashCode值决定该对象在HashSet中的存储位置。如果有两个元素通过equals()方法比较返回true,但是它们的hashCode()方法返回值不相等,HashSet将会把它们存入不同的位置,依然可以添加成功。
也就是说,HashSet集合判断两个元素相等的标准是两个对象通过equals()方法比较相等,并且两个对象的hashCode()方法返回值也相等。
示例代码:类A,B,C,分别重写了equals()方法,hashCode()方法这两个中的一个或者两个。
package com.j1803.collectionOfIterator; import java.util.HashSet; import java.util.Set; //类A重写了equals()方法,总是返回true,但没有重写hashCode()方法. class A{ @Override public boolean equals(Object obj){ return true; } } //类B重写了hashCode()方法,总是返回2,但没有重写equals()方法 class B{ @Override public int hashCode(){ return 2; } } //类C重写了equals()方法,总是返回true,重写了hashCode()方法,总是返回2 class C{ @Override public boolean equals(Object obj){ return true; } @Override public int hashCode(){ return 2; } } public class HashSetTest { public static void main(String[] args) { Set book=new HashSet(); HashSet books=new HashSet(); A a=new A(); B b=new B(); C c=new C(); books.add(a); books.add(a); books.add(b); books.add(b); books.add(c); books.add(c); System.out.println(books); } } [com.j1803.collectionOfIterator.B@2, com.j1803.collectionOfIterator.A@4554617c] Process finished with exit code 0
标签:code new with hashcode stat 不能 包含 out 必须
原文地址:https://www.cnblogs.com/shadow-shine/p/9710892.html