java hash class_Java HashSet class

Java HashSet类实现Set接口,该接口由哈希表(实际上是null元素。

1. HashSet Hierarchy

HashSet类扩展了实现Set接口的AbstractSet类。 Set接口以层次结构顺序继承Collection和Iterable接口。public class HashSet extends AbstractSet

implements Set, Cloneable, Serializable

{

//implementation

}48280924d8e5b90688293b39f1239b38.pngHashSet Hierarchy

2. HashSet Features它实现了Set接口。

HashSet中不允许重复的值。

HashSet中允许一个NULL元素。

它是无序集合,并且不保证集合的迭代顺序。

此类为基本操作(添加,删除,包含和调整大小)提供恒定的时间性能。

HashSet不同步。 如果多个线程同时访问哈希集,并且至少有一个线程修改了哈希集,则必须在外部对其进行同步。

使用Collections.synchronizedSet(new HashSet())方法获取同步的哈希集。

此类的迭代器方法返回的迭代器是fail-fast并且如果在创建迭代器后的任何时候以任何方式修改集合(除非通过迭代器自己的remove()方法remove() ,则可能会抛出ConcurrentModificationException 。

HashSet还实现了Searlizable和Cloneable接口。

2.1. Initial Capacity

初始容量表示创建哈希集时(在支持HashMap中)的存储桶数。 如果当前大小已满,则存储桶数将自动增加。

默认初始容量为16 。 我们可以通过在构造函数HashSet(int initialCapacity)传递默认容量来覆盖此默认容量。

2.2. Load Factor

负载因子是在自动增加HashSet容量之前允许其充满的度量。 默认负载系数为0.75 。

这称为threshold ,等于(DEFAULT_LOAD_FACTOR * DEFAULT_INITIAL_CAPACITY)。 当HashSet元素计数超过此阈值时,将调整HashSet的大小,并且新容量将是先前容量的两倍。

使用默认HashSet时,内部容量为16,负载系数为0.75。 当表格中有12个元素时,存储桶数将自动增加。

3. HashSet Constructors

HashSet具有四种类型的构造函数:HashSet():使用默认初始容量(16)和负载因子(0.75)初始化默认的HashSet实例。

HashSet(int capacity):使用指定的容量和负载因子(0.75)初始化HashSet。

HashSet(int Capacity,float loadFactor):使用指定的初始容量和负载因子初始化HashSet。

HashSet(Collection c):使用与指定collection相同的元素初始化HashSet。

4. HashSet Methodspublic boolean add(E e) :如果指定的元素不存在,则将其添加到Set中。 此方法在内部使用equals()方法检查重复项。 如果元素重复,则元素被拒绝,并且不替换值。

public void clear() :从哈希集中删除所有元素。

public boolean contains(Object o) :如果哈希集包含指定的元素othrweise false ,则返回false 。

public boolean isEmpty() :如果哈希集不包含任何元素,则返回true ,否则返回false 。

public int size() :返回哈希集中的元素数量。

public Iterator iterator() :返回对此哈希集中的元素的迭代器。 从迭代器返回的元素没有特定的顺序。

public boolean remove(Object o) :从哈希集中删除指定的元素(如果存在)并返回true ,否则返回false 。

public boolean removeAll(Collection c) :删除哈希集中属于指定集合的​​所有元素。

public Object clone() :返回哈希集的浅表副本。

public Spliterator spliterator() :在此哈希集中的元素上创建后绑定和故障快速的Spliterator。

5. Java HashSet Example

5.1. HashSet add, remove, iterator example//1. Create HashSet

HashSet hashSet = new HashSet<>();

//2. Add elements to HashSet

hashSet.add("A");

hashSet.add("B");

hashSet.add("C");

hashSet.add("D");

hashSet.add("E");

System.out.println(hashSet);

//3. Check if element exists

boolean found = hashSet.contains("A"); //true

System.out.println(found);

//4. Remove an element

hashSet.remove("D");

//5. Iterate over values

Iterator itr = hashSet.iterator();

while(itr.hasNext())

{

String value = itr.next();

System.out.println("Value: " + value);

}

Program Output.[A, B, C, D, E]

true

Value: A

Value: B

Value: C

Value: E

5.2. Convert HashSet to Array Example

Java示例,使用toArrray()方法将哈希集转换为array 。HashSet hashSet = new HashSet<>();

hashSet.add("A");

hashSet.add("B");

hashSet.add("C");

hashSet.add("D");

hashSet.add("E");

String[] values = new String[hashSet.size()];

hashSet.toArray(values);

System.out.println(Arrays.toString(values));

Program Output.[A, B, C, D, E]

5.3. Convert HashSet to ArrayList ExampleHashSet hashSet = new HashSet<>();

hashSet.add("A");

hashSet.add("B");

hashSet.add("C");

hashSet.add("D");

hashSet.add("E");

List valuesList = hashSet.stream().collect(Collectors.toList());

System.out.println(valuesList);

Program Output.[A, B, C, D, E]

6. HashSet Usecases

HashSet非常类似于ArrayList类。 此外,它还会限制重复值。 因此,当我们有一个只需要存储不同元素的需求时,我们可以选择HashSet。

HashSet的现实用例可以存储流中的数据,其中流可能包含重复的记录,而我们只对不同的记录感兴趣。

另一个用例是在给定的句子中找到不同的单词。

7. Java HashSet PerformanceHashSet类为基本操作(添加,删除,包含和大小)提供了O(1)的恒定时间性能 ,假设哈希函数将元素正确分散在存储桶中。

对此集合进行迭代需要的时间与HashSet实例的大小(元素的数量)加上后备HashMap实例的“容量”(存储桶的数量)之和成比例。 因此,如果迭代性能很重要,则不要将初始容量设置得过高(或负载因子过低),这一点非常重要。

8. Conclusion

从上面的讨论中可以明显看出,在我们要处理重复记录的情况下,HashSet是非常有用的集合类。 它为基本操作提供了可预测的性能。

在评论中向我发送与HashSet in Java有关的问题。

Reference:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值