黑马程序员技术交流社区
标题:
关于集合问题
[打印本页]
作者:
张华廷
时间:
2012-6-26 17:47
标题:
关于集合问题
import java.util.*;
class Demo
{
public static void main(String[] args)
{
HashSet<Person> hs=new HashSet<Person>();
Person p1=Person.newPerson("zhangsan01",20);
Person p2=Person.newPerson("zhangsan02",20);//传入的对象相同了,被覆盖了
Person p3=Person.newPerson("zhangsan04",20);
Person p4=Person.newPerson("zhangsan03",25);
hs.add(p1);
hs.add(p2);
hs.add(p3);
hs.add(p4);
Iterator<Person> it=hs.iterator();
while (it.hasNext())
{
Person p=it.next();
System.out.println(p.getName()+"::"+p.getAge());
}
}
}
class Person
{
private String name;
private int age;
//创建对象池 用于存储Person对象
private static HashSet<Person> objectPool=new HashSet<Person>();
public Person(String name,int age)
{
this.name=name;
this.age=age;
}
public String getName()
{
return name;
}
public int getAge()
{
return age;
}
//定义方法,用于创建Person对象
public static Person newPerson(String name,int age)
{
for (Person p:objectPool )
{
//如果对象已经在对象池中存在,则直接返回该对象
if(p.name.equals(name)&&p.age==age)
return p;
}
//如果该对象不存在,则创建新对象,并将该对象添加到对象池中
Person p=new Person(name,age);
objectPool.add(p);
return p;
}
}
结果:
zhangsan02::20
zhangsan01::20
zhangsan04::20
zhangsan03::25
顺序的问题怎么会发生变化?怎么按传入的对象打印?
作者:
车风波
时间:
2012-6-26 18:10
HashSet使用对象的hashcode排序,顺序不是先add()在前。
作者:
张华廷
时间:
2012-6-26 18:19
HashSet是用一张哈希表做数据存储,它是无序的,可以随机访问
作者:
。_Smileヾ淡莣
时间:
2012-6-26 22:24
hashset 中是由hashcode与equals进行比较的,先比较对象在比较内容;是因为有了这两个所以就有了哈希表;这两个方法Object也有;
在hashcode中的这两个方法你可以使用Object也可以使用自己的方法;
作者:
孙浩迪
时间:
2012-6-27 01:34
为什么HashSet查找效率提高了。
知道了HashSet的add机制后,查找的道理一样。直接根据数据的散列码和散列表的数组大小计算除余后,就得到了所在数组的位置,然后再查找链表中是否有这个数据即可。
查找的代价也就是在链表中,但是真正一条链表中的数据很少,有的甚至没有。几乎没有什么迭代的代价可言了。所以散列表的查找效率建立在散列单元所指向的链表中的数据要少 。
hashCode方法必须与equals方法必须兼容
如果我们自己定义了一个类,想对这个类的大量对象组织成散列表结构便于查找。有一点一定要注意:就是hashCode方法必须与equals方法向兼容。
Java代码:
//hashCode与equals方法的兼容
public class Employee{
public int id;
public String name="";
//相同id对象具有相同散列码
public int hashCode(){
return id;
}
//equals必须比较id
public boolean equals(Employee x){
if(this.id==x.id) return true;
else return false;
}
}
为什么要这样,因为HashSet不允许相同元素(equals==ture)同时存在在结构中。假如employeeX(1111,“张三”)和employee(1111,"李四"),而Employee.equals比较的是name。这样的话,employeeX和employeeY的equals不相等。它们会根据相同的散列码1111加入到同一个散列单元所指向的列表中。这种情况多了,链表的数据将很庞大,散列冲突将非常严重,查找效率会大幅度的降低。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2