`
lvwenwen
  • 浏览: 955417 次
  • 性别: Icon_minigender_1
  • 来自: 魔都
社区版块
存档分类
最新评论

理解HashSet

阅读更多

一、新建一个类Userfromboss ,其中有id和name属性,都是String类型的

二、写一个函数:

 @Test
 public void test(){
  String a ="123";
  String b ="123";
  Set<String> set = new HashSet<String>();
  
  set.add(a);
  set.add(b);
  System.out.println(set.size());
  
  Set<Userfromboss> set1 = new HashSet<Userfromboss>();
  Userfromboss u1 = new Userfromboss();
  Userfromboss u2 = new Userfromboss();
  u1.setId("1");
  u1.setName("zhangsan");
  u2.setId("1");
  u2.setName("zhangsan");
  set1.add(u1);
  set1.add(u2);
  System.out.println(set1.size());
 }
 打印结果为1,2。结果并不相同

三、修改Userfromboss ,重写这个类的equals和hashcode两个函数

 @Override
 public boolean equals(Object obj) {
  // TODO Auto-generated method stub
  return this.getId().equals(((Userfromboss)obj).getId())&&this.getName().equals(((Userfromboss)obj).getName());
 }

 @Override
 public int hashCode() {
  // TODO Auto-generated method stub
  return 1;
 }

四。再回去打印一下,发现已经是1,1了

五。任意删掉一个重写的函数,打印结果是1,2

六。结论:hashset是同时比较equals和hashcode两个函数的。。同时打开String的源码。可以看到equals和hashcode两个函数如下:

 public boolean equals(Object anObject) {
 if (this == anObject) {
     return true;
 }
 if (anObject instanceof String) {
     String anotherString = (String)anObject;
     int n = count;
     if (n == anotherString.count) {
  char v1[] = value;
  char v2[] = anotherString.value;
  int i = offset;
  int j = anotherString.offset;
  while (n-- != 0) {
      if (v1[i++] != v2[j++])
   return false;
  }
  return true;
     }
 }
 return false;
   }

 

    public int hashCode() {
 int h = hash;
 if (h == 0) {
     int off = offset;
     char val[] = value;
     int len = count;

            for (int i = 0; i < len; i++) {
                h = 31*h + val[off++];
            }
            hash = h;
        }
        return h;
    }

下次重新这两个函数的时候,不要自己重写了,要仿照string类的两个方法来重写哦。O(∩_∩)O~
 
分享到:
评论

相关推荐

    java 利用HashSet删除学生

    在Java编程中,HashSet是一个非常重要的集合类,它继承自AbstractSet并实现了Set接口。HashSet不包含重复元素,也不保持...通过理解HashSet的工作原理和其提供的方法,能够更好地优化我们的代码,提高程序的执行效率。

    Java面试题 从源码角度分析HashSet实现原理

    HashSet实现原理分析 ...通过源码分析,我们可以更好地理解HashSet的实现原理,提高自己的编程能力和技术水平。同时,通过HashSet的实现机理,我们可以更好地理解Java集合框架的设计理念和实现机理。

    MyHashSet.java

    深入理解HashSet的底层实现,从无到有实现了HashSet,定义自己的数据结构。

    HashSet去重

    #### 五、深入理解`HashSet`去重 - **`hashCode`算法**:`HashSet`通过计算对象的`hashCode`来确定其在内部哈希表中的位置。如果两个对象的`hashCode`相同,还需要进一步通过`equals`方法判断这两个对象是否真正...

    HashSet类的用法.pdf

    ### HashSet类的用法 #### 一、概述 `HashSet`是Java集合框架的一部分,它实现了`Set`接口。`HashSet`不允许重复的元素,并且不保证元素的顺序。...希望这些内容能帮助读者更好地理解和使用`HashSet`。

    CustomSet.zip

    这个自定义版本通常是为了学习和理解HashSet的底层工作原理而创建的,或者是为了满足特定的性能或功能需求。 HashSet在Java中的核心原理基于哈希表,也称为散列表,它的内部由HashMap实现。哈希表通过计算元素的...

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

    在实际使用中,理解这些特性可以帮助我们更好地利用HashSet,例如在需要快速查找不重复元素的场景下,或者在单线程环境中,HashSet是一个非常实用的选择。然而,在多线程环境下,为了保证线程安全,可以使用`...

    java从零基础到精通的整个详细笔记

    3. HashSet与HashMap:掌握哈希表的工作原理,理解HashSet与HashMap的插入、查找效率。 4. HashMap与HashTable:对比两者的异同,了解线程安全的问题。 5. Iterator:遍历集合对象,理解迭代器的remove()方法。 六...

    JAVA试题大全

    2. Set接口:理解HashSet和TreeSet的实现原理,掌握元素的唯一性与排序规则。 3. Map接口:熟悉HashMap和TreeMap,了解键值对的存储方式及查询效率。 4. 集合操作:学会集合的遍历、添加、删除、查找等基本操作。 ...

    JAVA题目

    - Set接口:理解HashSet和TreeSet的区别,掌握元素的唯一性和排序规则。 - Map接口:学习HashMap、TreeMap和LinkedHashMap的用法,理解键值对的概念。 6. **IO流** - 字节流和字符流:理解输入流和输出流的概念...

    排序之HashSet和TreeSet的区别

    总的来说,理解`HashSet`和`TreeSet`的底层实现和特性,可以帮助开发者根据具体需求做出明智的选择。在实际编程中,除了考虑性能,还需要考虑代码的可读性、可维护性和一致性。同时,源码阅读也是提升技能的好方法,...

    Java基础加强_ArrayList_HashSet的比较及Hashcode分析

    在Java编程语言中,ArrayList和HashSet是两种常用的集合类,它们各自有其特性和应用场景。在实际开发中,理解它们的差异以及如何有效地利用它们是非常重要的。本篇将深入探讨ArrayList与HashSet的区别,并分析...

    集合类HashSet

    在Java编程语言中,集合类是用于存储一组不重复元素的数据结构。HashSet是其中的一种,它属于集合框架的一部分,提供了一种基于哈希表实现的...通过观看相关视频和实践操作,可以加深对HashSet的理解,提升编程能力。

    treemap treeset hashset hashmap 简要介绍

    在Java编程语言中,集合框架提供了多种数据结构来存储和操作数据,其中`TreeMap`、`TreeSet`、`HashSet`以及`HashMap`是最常用的数据结构之一。...正确理解并使用这些集合类,可以极大地提高程序的效率和可读性。

    c++用vector实现HashSet

    在C++编程中,HashSet是一种常用的集合数据结构,它提供了存储唯一对象的功能,类似...这种方法虽然可能效率较低,但在某些特定场景下,例如教学、理解数据结构原理或者在资源有限的环境中,它可能会是一个有用的实践。

    集合的概念及应用和HashSet保证数据不重复的原理

    同时,源码分析也能帮助我们理解HashMap的扩容机制,以及为什么即使两个对象的hashCode相同,它们仍然可以在HashSet中区分(因为equals()方法的正确实现)。 工具在学习和使用集合框架时也扮演着重要角色。例如,...

    由HashSet谈重用

    此外,`HashSet`的实现还展示了如何通过简单的数据结构(如`HashMap`)来构建复杂的集合类型,这对于理解和学习Java集合框架非常重要。 综上所述,面向对象编程中的重用不仅仅局限于继承,还包括组合等多种方式。...

    HashSet和TreeSet.doc

    HashSet 和 TreeSet 是 Java 中两种常用的 Set 集合实现,它们都继承自 Set 接口,但实现方式和特性上存在显著差异。...在实际应用中,理解这些集合的工作原理和特性,可以帮助我们更好地设计和优化代码。

    HashSet和TreeSet_围墙之外

    在编程实践中,理解它们的区别和应用场景至关重要。 HashSet是基于HashMap实现的,它不保证元素的顺序,允许有null值,但不允许有重复元素。HashSet内部通过哈希函数来定位元素,因此它的插入、删除和查找操作通常...

    通过实例学习Java集合框架HashSet

    通过实例学习Java集合框架HashSet,可以帮助开发者更好地理解和使用HashSet,提高编程效率和代码质量。本文将通过实例代码详细介绍HashSet的使用和特点,帮助读者更好地掌握HashSet的使用。 一、元素不能重复 ...

Global site tag (gtag.js) - Google Analytics