zoukankan      html  css  js  c++  java
  • 遍历一个Set的方法只有一个:迭代器(interator)。

    Set-HashSet实现类:

    遍历一个Set的方法只有一个:迭代器(interator)。

    HashSet中元素是无序的(这个无序指的是数据的添加顺序和后来的排列顺序不同),而且元素不可重复。

    Object中除了有final()toString()equals(),还有hashCode()

    HashSet底层用的也是数组。

    当向数组中利用add(Object o)添加对象的时候,系统先找对象的hashCode

    int hc=o.hashCode(); 返回的hashCode为整数值。

    Int I=hc%n;n为数组的长度),取得余数后,利用余数向数组中相应的位置添加数据,以n6为例,如果I=0则放在数组a[0]位置,如果I=1,则放在数组a[1]位置。如果equals()返回的值为true,则说明数据重复。如果equals()返回的值为false,则再找其他的位置进行比较。这样的机制就导致两个相同的对象有可能重复地添加到数组中,因为他们的hashCode不同。

    如果我们能够使两个相同的对象具有相同hashcode,才能在equals()返回为真。

    在实例中,定义student对象时覆盖它的hashcode

    因为String类是自动覆盖的,所以当比较String类的对象的时候,就不会出现有两个相同的string对象的情况。

    现在,在大部分的JDK中,都已经要求覆盖了hashCode

    结论:如将自定义类用hashSet来添加对象,一定要覆盖hashcode()equals(),覆盖的原则是保证当两个对象hashcode返回相同的整数,而且equals()返回值为True

    如果偷懒,没有设定equals(),就会造成返回hashCode虽然结果相同,但在程序执行的过程中会多次地调用equals(),从而影响程序执行的效率。

     

    我们要保证相同对象的返回的hashCode一定相同,也要保证不相同的对象的hashCode尽可能不同(因为数组的边界性,hashCode还是可能相同的)。例子:

    public int hashCode(){

      return name.hashcode()+age;

    }

    这个例子保证了相同姓名和年龄的记录返回的hashCode是相同的。

     

    使用hashSet的优点:

    hashSet的底层是数组,其查询效率非常高。而且在增加和删除的时候由于运用的hashCode的比较开确定添加元素的位置,所以不存在元素的偏移,所以效率也非常高。因为hashSet查询和删除和增加元素的效率都非常高。

    但是hashSet增删的高效率是通过花费大量的空间换来的:因为空间越大,取余数相同的情况就越小。HashSet这种算法会建立许多无用的空间。

    使用hashSet接口时要注意,如果发生冲突,就会出现遍历整个数组的情况,这样就使得效率非常的低。

     

    练习:new一个hashset,插入employee对象,不允许重复,并且遍历出来。

  • 相关阅读:
    linkedLoop
    loopqueue
    expect 切换用户
    二叉树的实现
    栈的链表实现, 底层使用链表
    栈的数组实现
    RSA加密算法
    输入一个链表,反转链表后,输出链表的所有元素
    输入一个链表,输出该链表中倒数第k个结点
    ansible中include_tasks和import_tasks
  • 原文地址:https://www.cnblogs.com/borter/p/10744054.html
Copyright © 2011-2022 走看看