HashSet的原理

  我们先看一下HashSet和TreeSet在整个集合框架中的位置。他们都实现了Set接口。他们之间的区别是:HashSet不能保证元素的顺序,TreeSet中的元素可以按照某个顺序排列。他们的元素都不能重复。

  先来看一下HashSet:

public static void main(String[] args) {
  Set<String> set = new HashSet<String>();
  set.add("张三");
  set.add("李四");
  set.add("王五");
  System.out.println(set);
  System.out.println(set.size());
  System.out.println(set.contains("张三"));
}

  打印输出的顺序是是: [李四, 张三, 王五],可以看出和存进去的顺序不一致。我们先看一下 Set<String> set = new HashSet<String>(),这行代码创建了一个HashSet,构造函数如下:

public HashSet() {
    map = new HashMap<>();
}

  可以看到实际上是创建了一个HashMap的对象。没错,HashSet底层就是一个HashMap。

  再来看一下这行代码:set.add("张三"),非常的简单,就是调用了一下HashMap的put方法对元素进行插入。

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

  这里的PERSENT是什么呢?继续顺藤摸瓜,原来就是一个普通的Object对象前面用static final修饰说明是不可变的。

private static final Object PRESENT = new Object();

  继续添加:set.add("李四");

  可以看出来HashMap的key分别为”张三”,”李四”,“王五”, 因为HashSet用不到value,他们的value都是一样的指向同一个地方。继续往下看:System.out.println(set.size());

public int size() {
    return map.size();
}

  也是调用的HashMap的size方法。

  System.out.println(set.contains("张三"));

public boolean contains(Object o) {
    return map.containsKey(o);
}

  同样调用的HashMap的contains方法。

原文地址:https://www.cnblogs.com/lbky/p/12117233.html

时间: 2024-11-14 22:46:34

HashSet的原理的相关文章

HashSet实现原理

1. HashSet概述 HashSet实现Set接口,由哈希表(实际上是一个HashMap实例)支持.它不保证set 的迭代顺序:特别是它不保证该顺序恒久不变.此类允许使用null元素. 2. HashSet的实现 如果不等,则添加到该数组索引对应的链表中. ------------------------------------------------------------------------------------------ Set的实现类的集合对象中不能够有重复元素,HashSe

Java HashSet工作原理及实现

1. 概述 This class implements the Set interface, backed by a hash table (actually a HashMap instance). It makes no guarantees as to the iteration order of the set; in particular, it does not guarantee that the order will remain constant over time. This

四.HashSet原理及实现学习总结

在上一篇博文(HashMap原理及实现学习总结)详细总结了HashMap的实现过程,对于HashSet而言,它是基于HashMap来实现的,底层采用HashMap来保存元素.所以如果对HashMap比较熟悉,那么HashSet的原理应该很好理解! 一.HsahSet概述 HashSet实现Set接口,由哈希表(实际上是一个HashMap实例)支持.它不保证set 的迭代顺序:特别是它不保证该顺序恒久不变.此类允许使用null元素. 1 public class HashSet<E> 2 ext

java该HashTable,HashMap和HashSet

同一时候我们也对HashSet和HashMap的核心方法hashcode进行了具体解释,见<探索equals()和hashCode()方法>. 万事俱备,那么以下我们就对基于hash算法的三个集合HashTable,HashSet和HashMap具体解释. 本文文件夹: 1. HashTable和HashMap的差别 2. HashSet和HashMap的差别 3. HashMap,HashSet工作原理 4. HashSet工作原理 5. 常见问题 1. HashTable和HashMap的

java中的HashTable,HashMap和HashSet

目录(?)[+] 上篇博客中我们详细的分析了java集合<java中Map,List与Set的区别>. 同时我们也对HashSet和HashMap的核心方法hashcode进行了详解,见<探索equals()和hashCode()方法>. 万事俱备,那么下面我们就对基于hash算法的三个集合HashTable,HashSet和HashMap详解. 本文目录: 1. HashTable和HashMap的区别 2. HashSet和HashMap的区别 3. HashMap,HashS

Java集合 -- HashSet 和 HashMap

HashSet 集合 HashMap 集合 HashSet集合 1.1 Set 接口的特点 Set体系的集合: A:存入集合的顺序和取出集合的顺序不一致 B:没有索引 C:存入集合的元素没有重复 1.2 HashSet 使用&唯一性原理 1.2.1 HashSet的使用 1.2.1.1 案例代码一: public class HashSetDemo2 { public static void main(String[] args) { //创建集合对象 HashSet<Student>

【转】HashSet的用法

原文网址:http://blog.csdn.net/aidesudi/article/details/4720201 Java代码 public class TestHashSet { public static void main(String [] agrs){ Set set = new HashSet(); //添加一个string数据 set.add("文本"); //添加一个整数数据 set.add(new Integer(5)); //添加一个付点数据 set.add(1

【转】Java 集合系列16之 HashSet详细介绍(源码解析)和使用示例--不错

原文网址:http://www.cnblogs.com/skywang12345/p/3311252.html 概要 这一章,我们对HashSet进行学习.我们先对HashSet有个整体认识,然后再学习它的源码,最后再通过实例来学会使用HashSet.内容包括:第1部分 HashSet介绍第2部分 HashSet数据结构第3部分 HashSet源码解析(基于JDK1.6.0_45)第4部分 HashSet遍历方式第5部分 HashSet示例 转载请注明出处:http://www.cnblogs.

(柯昌合)HashMap原理(柯昌合)

了解HashMap原理对于日后的缓存机制多少有些认识.在网络中也有很多方面的帖子,但是很多都是轻描淡写,很少有把握的比较准确的信息,在这里试着不妨说解一二. 对于HashMap主要以键值(key-value)的方式来体现,笼统的说就是采用key值的哈希算法来,外加取余最终获取索引,而这个索引可以认定是一种地址,既而把相应的value存储在地址指向内容中.这样说或许比较概念化,也可能复述不够清楚,来看列式更加清晰: int   hash=key.hashCode();//-------------