HashSet 方法使用总结

HashSet 方法使用总结

HashSet类,是存在于java.util包中的类 。同时也被称为集合,该容器中只能存储不重复的对象。底层是由HashMap来存储的,因为HashSet不能重复,你知道HashMap的键不能重复就明白了这一个原理了,所以对于HashMap很熟悉的话对于HashSet就能够很快的知道底层实现。

  • HashSet是set接口的实现类,也是我们最常用的set集合
  • 储存的是无序,唯一的对象。遍历可能是有序,可能是无序的
  • 由于是无序的所以每组数据都没有索引,很多list可用的方法他都没有
  • 凡是需要通过索引来进行操作的方法都没有,所以也不能使用普通for循环来进行遍历,只有加强型for和迭代器两种遍历方法
  • HashSet的元素不能重复
  • HashSet中允许有NULL值

注意:

向Set中添加的数据,其所在的类一定要重写hashCode()和equals()方法,
以实现对象相等规则,即“相等的对象必须具有相等的散列码”

HashSet常用方法:

  1. add(Object obj):向Set集合中添加元素,添加成功返回true,否则返回false。
    add()如果此 set 中尚未包含指定元素,则添加指定元素。如果此Set没有包含满足(e==null ? e2==null : e.equals(e2)) 的e2时,则将e2添加到Set中,否则不添加且返回false。由于底层使用HashMap的put方法将key = e,value=PRESENT构建成key-value键值对,当此e存在于HashMap的key中,则value将会覆盖原有value,但是key保持不变,所以如果将一个已经存在的e元素添加中HashSet中,新添加的元素是不会保存到HashMap中,所以这就满足了HashSet中元素不会重复的特性。
  2. size():返回此set中的元素的数量(set的容量)。底层实际调用HashMap的size()方法返回Entry的数量,就得到该Set中元素的个数,即HashMap容器的大小。
  3. remove(Object obj): 删除Set集合中的元素,删除成功返回true,否则返回false。remove()如果指定元素存在于此 set 中,则将其移除。底层使用HashMap的remove方法删除指定的Entry。
  4. isEmpty():isEmpty()判断HashSet()集合是否为空,如果此set不包含任何元素,则返回true。 底层实际调用HashMap的isEmpty()判断该HashSet是否为空。
  5. clear(): 移除此Set中的所有元素。clear()从此 set 中移除所有元素。底层调用HashMap的clear方法清除所有的Entry。
  6. == iterator()==:iterator()方法 返回对此set中元素进行迭代的迭代器。返回元素的顺序并不是特定的。底层实际调用底层HashMap的keySet来返回所有的key。 可见HashSet中的元素,只是存放在了底层HashMap的key上, value使用一个static final的Object对象标识。
  7. contains(Object o):contains(),判断某个元素是否存在于HashSet()中,存在返回true,否则返回false。更加确切的讲应该是要满足这种关系才能返回true:(o==null ? e==null : o.equals(e))。底层调用containsKey判断HashMap的key值是否为空。

HashSet遍历

迭代遍历

Set<String> set = new HashSet<String>();
Iterator<String> it = set.iterator();
while (it.hasNext()) {
  String str = it.next();
  System.out.println(str);
}

增强for循环遍历

for (String str : set) {
      System.out.println(str);
}

使用示例:

public class NewsHashSet {
public static void main(String[] args) {
    News news = new News(1, "北京终于放晴了!", "新闻社");
    News news2 = new News(2, "香港回归纪念日", "人民新闻");
    News news3 = new News(3, "假奶粉事件曝光", "人民新闻网");
    
    //创建HashSet集合,储存无序,唯一的数据
    //HashSet是是使用equals来进行对象对比,确定数据是唯一的
    //如果两个数据的对象是一致的,那么HashSet将会把这两个合并,只储存一个空间
    HashSet<News> set = new HashSet<News>();
    set.add(news);
    set.add(news2);
    set.add(news3);
    
    //由于HashSet储存数据都是无序的,所以不能用get(i);来获取具体对象
    //所以我们必须通过遍历来得到HashSet的各个数据,由于是没有索引的
    //所以不能使用普通类型的for来遍历它
    //HashSet只能通过增强型for和迭代器来遍历它
    
    //增强型for
    for(News n : set){
        System.out.println(n.getID()+"\t"+n.getLitter()+"\t"+n.getAuthor());
    }
    System.out.println("*****************************************");
    //迭代器
    Iterator<News> it = set.iterator();
    while (it.hasNext()) {
        News n = it.next();
        System.out.println(n.getID()+"\t"+n.getLitter()+"\t"+n.getAuthor());
    }
    
    //set的各种方法
    //set增加
    set.add(null);
    
    //删除
    set.remove(news);
    
    //对比查找
    set.contains(news);
    
    //清空集合
    set.clear();
    
    //获取长度
    set.size();
    
    }
}
  • 3
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值