A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© qingxi1 中级黑马   /  2014-7-18 22:50  /  857 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

众所周知HashSet集合是无序,它是根据元素的哈希码(hashcode方法)、equals和集合本身的哈希因子进行排序的,那么如果我们在生成对象的哈希code时,经过统一的技术算,能不能实现,使用set集合有序的存储我们的元素,希望大牛普及一下这方面的知识啊

4 个回复

倒序浏览
话说,众所周知HashSet集合是无序的?难道我记错了……
回复 使用道具 举报
HashSet是无序,是因为 创建一个set集合时会 默认或由用户指定一个哈希因子,之后set集合会根据哈希因子对分块,  在之后往集合中存对象时,会获得对象的hashcode,并对这个hashcode进行计算,得出此hashcode应该放在此集合中的那个块上的那个位置,
所以查找时会获取对象的hashcode直接得出他的位置,根据这个位置取出此k对应的v,所以比较快
遍历时会从头遍历,所以无序。
好像是这样,
如果要有序的存储在set集合在中 就要对hashcode进行处理,但是如何处理、set集合在散列之后这么办,全都不知道啊
回复 使用道具 举报
wisely 发表于 2014-7-18 22:56
话说,众所周知HashSet集合是无序的?难道我记错了……

我确实记错了
回复 使用道具 举报
qingxi1 发表于 2014-7-18 23:09
HashSet是无序,是因为 创建一个set集合时会 默认或由用户指定一个哈希因子,之后set集合会根据哈希因子对 ...

让HashSet的实例化对象有序,应该需要先将存入对象的hashCode值设置为一样的,然后就可以了。
  1. import java.util.*;
  2. class Person{
  3.         private String name;
  4.         private int age;
  5.         Person(String name,int age){
  6.                 this.name=name;
  7.                 this.age=age;
  8.         }
  9.         public int hashCode(){
  10.                 return 12;
  11.         }
  12.         public boolean equals(Object obj){
  13.                 Person p=(Person)obj;
  14.                 return this.name.equals(p.name)&&this.age==p.age;
  15.         }
  16.         public String toString(){
  17.                 return name;
  18.         }
  19. }

  20. public class Sunday{
  21.         public static void main(String[] args) {
  22.                 HashSet<Person>  hs=new HashSet<Person>();
  23.                 hs.add(new Person("aa",10));
  24. //hs.add(new Person("bb",25));       //通过这句代码的位置,可以看出来,hs有序。
  25.                 hs.add(new Person("zz",50));
  26.                 hs.add(new Person("bb",25));
  27.                 for(Iterator it=hs.iterator();it.hasNext();){
  28.                         System.out.println(it.next());
  29.                 }
  30.         }
  31. }
复制代码


评分

参与人数 1技术分 +1 收起 理由
SyouRai_Tsk + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马