hashset线程安全吗

六六 TOP1 2268

hashset并不是线程安全的,使用hashset需要对操作对象加锁,才能更好的保证线程安全。其实查看源代码发现HashSet内部维护数据的采用的是HashMap,根本原因是HashMap不是线程安全的类。导致了HashSet的非线程安全。

一、基本介绍

HashSet简单的理解就是HashSet对象中不能存储相同的数据,存储数据时是无序的。但是HashSet存储元素的顺序并不是按照存入时的顺序(和List显然不同) 是按照哈希值来存的所以取数据也是按照哈希值取得。存储是无序的这就和C++里的Set就不一样了C++里面的Set是有序的我认为这是在使用时候的主要区别。

二、常用方法

   类型     方法名        功能

  boolean   add(E e)      如果当前列表中不存在e, 则将e加入列表

  void      clear()         从列表中删除所有元素

  boolean  contains(Object j)  判断列表中是否有元素j

  Iterator<E> iterator()        得到当前列表的遍历器

  boolean  remove(Object j)  如果列表中存在元素j,则将其从列表中删除

  int     size()           得到列表中元素的个数

三、构造方法摘要

HashSet()

构造一个新的空 set,其底层 HashMap 实例的默认初始容量是 16,加载因子是 0.75。

HashSet(Collection<? extends E> c)

构造一个包含指定 collection 中的元素的新 set。

HashSet(int initialCapacity)

构造一个新的空 set,其底层 HashMap 实例具有指定的初始容量和默认的加载因子(0.75)。

HashSet(int initialCapacity, float loadFactor)

构造一个新的空 set,其底层 HashMap 实例具有指定的初始容量和指定的加载因子。

四、方法摘要

boolean add(E e)

如果此 set 中尚未包含指定元素,则添加指定元素。

void clear()

从此 set 中移除所有元素。

Object clone()

返回此 HashSet 实例的浅表副本:并没有复制这些元素本身。

boolean contains(Object o)

如果此 set 包含指定元素,则返回 true。

boolean isEmpty()

如果此 set 不包含任何元素,则返回 true。

Iterator<E> iterator()

返回对此 set 中元素进行迭代的迭代器。

boolean remove(Object o)

如果指定元素存在于此 set 中,则将其移除。

int size()

返回此 set 中的元素的数量(set 的容量)。

从类 java.util.AbstractSet 继承的方法

equals, hashCode, removeAll

从类 java.util.AbstractCollection 继承的方法

addAll, containsAll, retainAll, toArray, toArray, toString

从类 java.lang.Object 继承的方法

finalize, getClass, notify, notifyAll, wait, wait, wait

从接口 java.util.Set 继承的方法

addAll, containsAll, equals, hashCode, removeAll, retainAll, toArray, toArray


最后,推荐我们的管理工具给大家。

回复

我来回复
  • 暂无回复内容

注册PingCode 在线客服
站长微信
站长微信
电话联系

400-800-1024

工作日9:30-21:00在线

分享本页
返回顶部