`
m635674608
  • 浏览: 5043640 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

Hashset as HashMap add方法

    博客分类:
  • java
 
阅读更多
public class MapTest {
 public static void main(String[] args) {
  Map m =new HashMap();
  m.put("1", 2);
  Object i  = m.get("1");
  System.out.println(m.put("1", 3));
  System.out.println(m.get("1"));
  
  Set set = new HashSet();
  System.out.println(set.add("5"));
  System.out.println(set.add("5"));
  
  List li = new ArrayList();
  set.add("6");
  System.out.println(set.add("6"));
  System.out.println("----set size ---  "+set.size());

  结果:

2
3
true
false
false
----set size ---  2

先看hashset的构造方法

    private transient HashMap<E,Object> map;

    // Dummy value to associate with an Object in the backing Map
    private static final Object PRESENT = new Object();

    /**
     * Constructs a new, empty set; the backing <tt>HashMap</tt> instance has
     * default initial capacity (16) and load factor (0.75).
     */
    public HashSet() {
	map = new HashMap<E,Object>();
    }

    /**
     * Constructs a new set containing the elements in the specified
     * collection.  The <tt>HashMap</tt> is created with default load factor
     * (0.75) and an initial capacity sufficient to contain the elements in
     * the specified collection.
     *
     * @param c the collection whose elements are to be placed into this set
     * @throws NullPointerException if the specified collection is null
     */
    public HashSet(Collection<? extends E> c) {
	map = new HashMap<E,Object>(Math.max((int) (c.size()/.75f) + 1, 16));
	addAll(c);
    }

    /**
     * Constructs a new, empty set; the backing <tt>HashMap</tt> instance has
     * the specified initial capacity and the specified load factor.
     *
     * @param      initialCapacity   the initial capacity of the hash map
     * @param      loadFactor        the load factor of the hash map
     * @throws     IllegalArgumentException if the initial capacity is less
     *             than zero, or if the load factor is nonpositive
     */
    public HashSet(int initialCapacity, float loadFactor) {
	map = new HashMap<E,Object>(initialCapacity, loadFactor);
    }

    /**
     * Constructs a new, empty set; the backing <tt>HashMap</tt> instance has
     * the specified initial capacity and default load factor (0.75).
     *
     * @param      initialCapacity   the initial capacity of the hash table
     * @throws     IllegalArgumentException if the initial capacity is less
     *             than zero
     */
    public HashSet(int initialCapacity) {
	map = new HashMap<E,Object>(initialCapacity);
    }

    /**
     * Constructs a new, empty linked hash set.  (This package private
     * constructor is only used by LinkedHashSet.) The backing
     * HashMap instance is a LinkedHashMap with the specified initial
     * capacity and the specified load factor.
     *
     * @param      initialCapacity   the initial capacity of the hash map
     * @param      loadFactor        the load factor of the hash map
     * @param      dummy             ignored (distinguishes this
     *             constructor from other int, float constructor.)
     * @throws     IllegalArgumentException if the initial capacity is less
     *             than zero, or if the load factor is nonpositive
     */
    HashSet(int initialCapacity, float loadFactor, boolean dummy) {
	map = new LinkedHashMap<E,Object>(initialCapacity, loadFactor);
    }

   可以看出hashset其实就是hashMap

 在看看add方法

 

   public boolean add(E e) {
	return map.put(e, PRESENT)==null;
    }

 调用的是hashmap的add方法在看看hshmap的put方法

   public V put(K key, V value) {
        if (key == null)
            return putForNullKey(value);
        int hash = hash(key.hashCode());//根据hash算法算出该key在table数组中的位置
        int i = indexFor(hash, table.length);//推算出hash值在table的大概位置
        for (Entry<K,V> e = table[i]; e != null; e = e.next) {
            Object k;
            //根据key的hashcode 判断出 在table数组中i位置中的Entry链表的key是否是一样的
            if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
                V oldValue = e.value;
                e.value = value;//如果是一样的。就替换前面相同key的value,System.out.println(m.get("1"));所以为3
                e.recordAccess(this);
                return oldValue;//返回前面key的value值。所以System.out.println(m.put("1", 3));为2
                /* 因为set里面的value是PRESENT 当set相同的key时,返回前面key的value,也就PRESENT ,
                  System.out.println(set.add("6")); PRESENT == null 为false
                   public boolean add(E e) {
                    private static final Object PRESENT = new Object();
             return map.put(e, PRESENT)==null;//PRESENT是个常量
                    }
                */
            }
        }
        modCount++;
        addEntry(hash, key, value, i);
        return null;//当第一次的返回的为空,所以当set方法第一次添加一个key时。返回的为map.put(e, PRESENT)==null为true
    }

  

分享到:
评论

相关推荐

    Java中HashSet和HashMap的区别_动力节点Java学院整理

    需要注意的是,在使用HashSet和HashMap时,需要重写equals()和hashCode()方法,以确保对象的唯一性。如果没有重写这两个方法,将会使用这个方法的默认实现,从而可能导致错误的结果。 HashSet和HashMap是两个不同的...

    1.HashSet和HashMap遍历.md

    自己写的例子,关于HashSet遍历和HashMap遍历的. 感谢大家参考

    treemap treeset hashset hashmap 简要介绍

    在Java编程语言中,集合框架提供了多种数据结构来存储和操作数据,其中`TreeMap`、`TreeSet`、`HashSet`以及`HashMap`是最常用的数据结构之一。这些集合类各自有着独特的特性和应用场景,下面将对它们进行详细介绍。...

    HashSet和HashMap的区别_动力节点Java学院整理

    HashSet实现了Set接口,它不允许集合中有重复的值,当我们提到HashSet时,第一件事情就是在将对象存储在HashSet之前,要先确保对象重写equals()和hashCode()方法,这样才能比较对象的值是否相等,以确保set中没有...

    ArrayList-HashSet-HashMap.zip_ABC_arraylist_hashmap_学生 信息 txt

    编写一个查询类,输入学生学号,若该生在数据文件(test.txt)中存在,在JTextArea中显示该生信息 若该生在数据文件(test.txt)中不存在,显示”查无此人”,可反复查找.在输出中,能显示该生的总成绩和平均成绩,将显示结果...

    Java集合框架源码剖析:HashSet 和 HashMap

     之所以把HashSet和HashMap放在一起讲解,是因为二者在Java里有着相同的实现,前者仅仅是对后者做了一层包装,也是说HashSet里面有一个HashMap(适配器模式)。因此本文将重点分析HashMap。  HashMap实现了Map...

    HashMap与HashTable和HashSet的区别

    ### HashMap与HashTable和HashSet的区别 #### 一、概述 在Java集合框架中,`HashMap`, `HashTable` 和 `HashSet` 是三个重要的数据结构,它们分别实现了`Map`接口和`Set`接口,提供了不同的功能来满足不同的编程...

    HashSet的实现原理

    这种实现方式让HashSet的操作非常简单高效,因为HashSet的大部分操作,包括添加元素、删除元素、检查元素是否存在等,都是直接调用HashMap的相关方法来完成的。 首先,我们来详细了解一下HashSet的基本概念和结构。...

    java 中HashMap、HashSet、TreeMap、TreeSet判断元素相同的几种方法比较

    因此,HashSet判断元素是否重复的方式与HashMap类似:首先计算元素的哈希值,然后通过equals()方法检查是否存在相同的元素。 **TreeMap** TreeMap是一个有序的键值对存储结构,它根据键的自然顺序或者自定义比较器...

    Java HashMap类详解

    HashSet 和 HashMap 之间有很多相似之处,对于 HashSet 而言,系统采用 Hash 算法决定集合元素的存储位置,这样可以保证能快速存、取集合元素;对于 HashMap 而言,系统 key-value 当成一个整体进行处理,系统总是...

    JavaHashSet和HashMap源码剖析编程开发技术

    4. **HashSet的添加操作**:HashSet.add()方法实际上调用了HashMap的put()方法,当添加新元素时,会先计算元素的哈希值,然后在HashMap中查找对应位置,如果该位置为空或者存在元素但equals()返回false,则添加成功...

    HashMap底层实现原理HashMap与HashTable区别HashMap与HashSet区别.docx

    因此,HashSet的插入和查找速度与HashMap相当,但由于HashSet不需要存储值,所以它的空间效率略高于HashMap。 在使用HashMap时,需要注意的是,如果自定义的键类没有重写equals()和hashCode()方法,可能会导致哈希...

    深入arraylist,linkedlist,hashmap,hashset源码(2012/3/18)

    `add()`、`contains()`和`remove()`方法是HashSet的关键,它们的行为与HashMap的相应方法紧密相关。 至于"Hashmap同步问题",在多线程环境下,如果不进行适当的同步控制,HashMap不是线程安全的。这意味着在并发...

    HashSet详解和使用示例_动力节点Java学院整理

    HashSet通过调用HashMap的方法来完成添加、删除、查找等操作。HashMap提供了快速定位元素的能力,使得HashSet具有高效的查找性能。 ### 源码解析(基于JDK 1.6.0_45) 在JDK 1.6版本的HashSet源码中,可以看到一个...

    Data-Structure:简单的数据结构,包括HashSet,HashMap,Heap,Red-Black Tree等

    在给定的标题和描述中,提到了几种关键的数据结构:HashSet、HashMap、Heap(堆)以及Red-Black Tree(红黑树)。下面将对这些数据结构及其在C++中的实现进行详细解释。 1. **HashSet**: HashSet是基于哈希表实现...

    hashset类的使用

    上面的示例程序创建了一个HashSet对象,并通过add方法添加了几个字符串元素。然后使用contains方法检查HashSet中是否包含特定字符串。我们还演示了remove方法来删除一个元素,使用size方法获取了HashSet中元素的数量...

    HashMap 和 HashSet的区别

    - 使用`add()`方法向HashSet添加元素。 - 使用`put()`方法将键值对添加到HashMap。 了解这些差异后,可以根据实际需求选择适合的数据结构。例如,如果只需要存储不重复的元素,且不关心元素的顺序,可以选择...

    hashmap面试题_hashmap_

    HashSet基于HashMap实现,每个元素作为HashMap的一个键,值为null。因此,HashSet的操作性能也依赖于HashMap。 六、HashMap在JVM内存中的表现 HashMap占用的内存包括数组和Entry对象,Entry对象包含键值对和指向下...

Global site tag (gtag.js) - Google Analytics