Java集合类——HashSet

来源:互联网 发布:win10禁用windows键 编辑:程序博客网 时间:2024/06/05 19:19

HashSet实现了Set接口,Set中不能记住元素的添加顺序,不允许包含相同的元素,如果试图把两个相同的元素加入到Set中,将会添加失败,add()方法返回false,新元素也不会加入集合中。

HashSetSet的一个实现类,因为是按照Hash算法来存储元素,所以在查找和存取上有很好的性能。HashSet的特点:

|-不能保证元素的排列顺序;

|-HashSet不是同步的,如果有多个线程要访问一个HashSet,需要进行同步操作;

|-HashSet中元素的值可以是null

HashSet的底层实现机制是HashMap:

public HashSet() {

         map = new HashMap<>();

     }

   当执行add()方法时,HashSet的元素放在HashMapKey中,HashMap的值统一是PRESENTPRESENT的定义方式如下:

private static final Object PRESENT = new Object();

add()方法的实现如下:

public boolean add(E e) {

             return map.put(e, PRESENT)==null;

     }

HashMap调用put()方法时,遇到重复的Key值会覆盖,用新的value替换旧的value,而HashSet的元素保存在Key中,重复的元素被覆盖,所以HashSet的元素是不会重复的。

   需要注意,如果重写了equals()方法,就必须同时重写hashCode()方法,使得两个对象使用equals()方法比较返回true时,两个对象的hashCode值也相同。

   如果两个对象通过equals()方法返回true,但两个对象的hashCode值不同,这时HashSet将会把这两个对象保存在Hash表的不同位置,使这两个对象都添加成功。

   如果两个对象的hashCode()方法返回的hashCode值相同,但通过equals()方法比较反悔了false,这时,因为两个对象HashCode值相同,HashSet试图把两个对象保存在同一位置,但又不行,所以实际上会在这个位置上使用链式结构来保存多个对象。

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 文件在lr中打开后找不到了怎么办 手机安装软件成功屏幕上没有怎么办 脸过敏发红痒怎么办用什么药膏 脸上又红又肿又痒怎么办 宝宝把皮革咬烂吃掉了怎么办 自动档皮革挡把防尘套烂了怎么办 pu包用酒精擦坏了怎么办 白色的面料被84弄黄了怎么办 要账的人赖在家不走怎么办 两塔吊的安全距离不够2米怎么办 腿上被蚊子咬后留下的黑疤怎么办 携程订的酒店酒店一直没确认怎么办 客斤的无窗挨着厨房怎么办 餐桌和墙紧挨着容易脏怎么办 vivo手机被设置成英文该怎么办 电脑开机后显示英文字该怎么办? 看到文言文就不会翻译该怎么办呢 房间楼层太高闷热不通风怎么办 对方全责不理赔没有财产怎么办啊 买二手房过户后发现房顶漏水怎么办 钻石绣的钻两个粘在一起怎么办 开修理部的一天不干活都着急怎么办 调好的车漆时间长了有点稠怎么办 下滤鱼缸下水管声音大怎么办 家里水管不开水龙头就总是响怎么办 生完儿子后腹股沟特黑怎么办 因盗窃罪出狱数额较大还不起怎么办 司法拍卖房原房主拒绝搬离怎么办 wps卡了没反应没有保存怎么办 微信扫描支付环境有风险怎么办 手机安装东西突然要扫描很久怎么办 我惹朋友真的很生气了怎么办 买了保险后又犯杀人罪 保险怎么办 水瓶盖了拧歪了打不开怎么办 刚买的老干妈盖子打不开怎么办? 门冬胰岛素的盖子转不动怎么办 diy做的蝴蝶结上的歪了怎么办 电脑显示电源已接通未充电怎么办 微博账号被锁无法登录怎么办 惠头条登录过两个账号被锁了怎么办 被两个月大的小狗咬破皮了怎么办