zoukankan      html  css  js  c++  java
  • HashSet

    构造方法

    由哈希表(实际上是一个 HashMap 实例)支持。它不保证 set 的迭代顺序;特别是它不保证该顺序恒久不变。此类允许使用 null 元素
    此实现不是同步的。如果多个线程同时访问一个哈希 set,而其中至少一个线程修改了该 set,那么它必须 保持外部同步。这通常是通过对自然封装该 set 的对象执行同步操作来完成的。如果不存在这样的对象,则应该使用 Collections.synchronizedSet 方法来“包装” set。最好在创建时完成这一操作,以防止对该 set 进行意外的不同步访问:
     
       Set s = Collections.synchronizedSet(new HashSet(...));

    构造一个新的空 set,其底层 HashMap 实例的默认初始容量是 16,加载因子是 0.75
    1. private transient HashMap<E,Object> map;
    2. public HashSet() {
    3. map = new HashMap<E,Object>();
    4. }

    有参数构造方法
    1. public HashSet(Collection<? extends E> c) {
    2. map = new HashMap<E,Object>(Math.max((int) (c.size()/.75f) + 1, 16));
    3. addAll(c);
    4. }

     构造一个新的空 set,其底层 HashMap 实例具有指定的初始容量和指定的加载因子
    1. public HashSet(int initialCapacity, float loadFactor) {
    2. map = new HashMap<E,Object>(initialCapacity, loadFactor);
    3. }
    构造一个新的空 set,其底层 HashMap 实例具有指定的初始容量和默认的加载因子(0.75)。 
    1. public HashSet(int initialCapacity) {
    2. map = new HashMap<E,Object>(initialCapacity);
    3. }

    方法

    返回对此 set 中元素进行迭代的迭代器。返回元素的顺序并不是特定的。
    1. public Iterator<E> iterator() {
    2. return map.keySet().iterator();
    3. }


    遍历

    1. Set<String> set = Collections.synchronizedSet(new HashSet<String>());
    2. set.add("111");
    3. set.add(null);
    4. set.add("222");
    5. set.add("222");
    6. set.add("333");
    7. // 遍历set
    8. Iterator<String> iterator = set.iterator();
    9. while(iterator.hasNext()){
    10. System.out.print(iterator.next()+" ");
    11. }
    12. //output null 222 333 111
    增强for循环也可遍历
    for (String string : set) {
                System.out.println(string);
            } 
     

    返回set大小,(实际是返回底层实现hashMap的大小)
    1. public int size() {
    2. return map.size();
    3. }

    1. //判断是否为空也是判断实现的map
    2. public boolean isEmpty() {
    3. return map.isEmpty();
    4. }

    重点到了》》

    set判断是否存在元素,是判断map 是否存在key,so,不能重复就可以理解了吧
    1. public boolean contains(Object o) {
    2. return map.containsKey(o);
    3. }

    set重复添加对象

    啦啦啦,又是重点,set 添加元素,放进map 的key,要是set重复添加对象怎么处理呢
    添加了会返回是否添加成功,so,我们打印下,
    map 中的PRESENT 是对象,空对象哟,看final
     private static final Object PRESENT = new Object();  
    1. public boolean add(E o) {
    2. return map.put(o, PRESENT)==null;
    3. }
    1. Set<String> set = Collections.synchronizedSet(new HashSet<String>());
    2. set.add("111");
    3. System.out.println(set.add("111"));
    4. //output false
    我们发现了什么,已经存在的话,再添加返回false,没有替换,只是不添加,减少了资源消耗,(
    这里涉及map 的添加,我们发现,map添加重复key时候,返回已经存在的key,对应值,so,没有添加,只有不存在重复才添加








  • 相关阅读:
    git .gitignore re-include
    excel 排名次
    ssh agent and ssh add for git Permission denied
    Git 仓库 清理 瘦身
    EF Core ThenInclude 2.0自动完成提示有误,坑了一下
    Entity Framework Core 导航属性 加载数据
    .net core mvc 模型绑定 之 json and urlencoded
    HttpClientHelper
    提示错误:“应为“providerInvariantName”参数的非空字符串。”
    关于.NET WebAPI 常见的跨域问题 解决清单
  • 原文地址:https://www.cnblogs.com/liubo6/p/4491184.html
Copyright © 2011-2022 走看看