Java------HashSet

原创 2012年03月24日 23:43:17
android培训java培训、期待与您交流!
 
       看了视频关于HashSet的讲解。首先了解到了,在collection容器中有set和list接口,然后再Set下主要包括了HashSet;List包括了ArrayList和LinkedList;
       Set:中的元素呢不能有重复的。并且无序;
       List:它里面的元素可重复但是有序;
     在hashSet中,为了实现set中不能有重复的元素这个条件。引进了hashCode方法,这个方法效率比,把每一个拿出来进行比较要高很多。就说老师讲的,说如果现在在HashSet中有1000个元素,假设不用这个算法,那么在进行add的时候,就必须把里面的每个元素拿出来和要插入的进行比较,如果equals了那就不进行插入,否则一直进行下去等把10000个元素全部进行了一遍比较后都没有equals的就插入进去。但是这样的话,对于一个简单的插入操作的效率影响就太大了点。如果我们在插入的时候,把每一个元素的hashcode按照给定的要求计算出来后,在集合里把区域分段。在某一个范围内的我们就放在同一个区域内,这样在进行add方法的时候我们就只需要在这个区域内进行比较就可以了,不用在那么逐个比较了,效率上相应就提高了许多。
视频里讲解的代码中,把对象存进HashSet中,然后针对这个集合中对象在进行修改:
Collection c1 = new HashSet();  
ReflectPoint p1 = new ReflectPoint(3,3);
ReflectPoint p2 = new ReflectPoint(5,5);
ReflectPoint p3 = new ReflectPoint(3,3);
c.add(p1);
c.add(p2);
c.add(p3);
p1.y = 7;
c.remove(p1);
System.out.println(c.size());
        这里面ReflectPoint是自定义的类,里面的hashCode和equals方法已经重写了,都是根据两个参数进行变化的。
        这个代码运行的结果是2,老师在这里讲解的时候,说p1因为y的变化导致hashCode变化了,所以在c进行remove的时候其实已经找不到p1了,就说p1并没有remove掉。我开始有点疑惑,说怎么会这样,但是后来我就想了想,首先hashCode变化的时候是按照区域进行变化的,现在这个y变化了,那么就说这个p1就已经不再这个区域了,然而在进行remove的时候它是在原本的那个区域内进行remove的那么当然找不到真正的p1了,由此c并没有变化,所以是输出是2。归根结底是hashCode和集合的区域在里面作怪呢。
       再者在进行删除的时候按照remove方法的定义是说在集合中找和传进来的数据进行比较,这个比较利用equals方法,在一般应用的时候我们如果不复写Object的equals方法,那我们比较的时候就直接使用的是object的方法了。对于对象这样的比较,显然就比较蹩脚了,因此我们要复写这个方法,但是在复写这个方法的时候有必要把hashCode方法同样的复写。主要是有这样一个规定:两个object 如果 equals() 相等,他们的hashcode也相等;如果不一同复写,equals()比较两个对象相等,但hashcode是产生的不等,在使用集合类索引就会出问题。

android培训java培训、期待与您交流!

相关文章推荐

java 利用HashSet删除学生

  • 2010年06月21日 15:25
  • 59KB
  • 下载

【java学习笔记】HashSet

Set: 里面存放的元素是无序的,不能重复的。 Set不能通过下标来获取指定的元素,因为是无序的,所以没有下标 常用的实现类: HashSet使用散列算法实现Set集合 哈希 hashCode和e...
  • Apolo_
  • Apolo_
  • 2016年03月07日 09:35
  • 130

【Java学习笔记】Hashset判断自定义对象是否重复

昨天去面试,考官问了一个关于Java的容器Hashset的问题,是说在加入自定义的对象时,如何设置对象的某一个属性为关键属性,即该属性相同则不能添加,该属性不同则可以添加。用Java编程还是太少,之前...

JAVA基础再回首(十七)——Set集合、增强for、HashSet类、LinkedHashSet类、TreeSet类、二叉树、Comparator 排序

JAVA基础再回首(十七)——Set集合、增强for、HashSet类、LinkedHashSet类、TreeSet类、二叉树、Comparator 排序 版权声明:转载必须注明本文转自程序员杜鹏...
  • m366917
  • m366917
  • 2016年08月21日 17:43
  • 1377

Java集合HashSet-ArrayList-HashMap的线程同步控制方法和区别

Collections类中提供了多个synchronizedXxx,该方法返回指定集合对象对应的同步对象,从而可以解决多线程并发访问集合时的线程安全问题.    正如Java中常用的集合框架推荐使用...

java中HashSet中的去重以及容量扩增原理

首先需要明白java中HastSet实际上是用散列表实现的,散列表的大小默认大小为16(也叫散列表元的数量),加载因子为0,75(下面会解释什么是加载因子)。 去重原理:当hashset a...

JAVA数据结构之HashSet和TreeSet总结

Set接口 Set不允许包含相同的元素,如果试图把两个相同元素加入同一个集合中,add方法返回false。 Set判断两个对象相同不是使用==运算符,而是根据equals方法。也就是说,只要两个对象用...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java------HashSet
举报原因:
原因补充:

(最多只允许输入30个字)