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与TreeSet学习总结

集合hashSet与TreeSet(仅就成员元素为自定义类型)总结如下: 1、hashSet 为保证hashSet集合中的自定义成员元素的唯一性(或不可重复性),自定义成员元素所属的类一定要重写O...
  • kedor
  • kedor
  • 2016-02-12 22:26
  • 152

JDK1.8源码学习之HashSet.java

jdk1.8源码学习之HashSet.java package java.util; import java.io.InvalidObjectException; public class Ha...

我是如何成为一名python大咖的?

人生苦短,都说必须python,那么我分享下我是如何从小白成为Python资深开发者的吧。2014年我大学刚毕业..

Java中的HashSet

Java中的HashSet (2010-01-14 16:31:44) 转载▼     (1) 为啥要用HahSet?      假如我们现在想...

java源码解读之HashSet------jdk 1.7

今天来看下HashSet,跟LinkedHashMap一样跟HashMap关系很大,不同的是HashSet不是继承HashMap,而是把HashMap作为一个属性使用。相当于只是使用HashMap的k...

Java数据类型 | HashSet详解

HashSet 的实现: 对于 HashSet 而言,它是基于 HashMap 实现的,HashSet 底层采用 HashMap 来保存所有元素,因此 HashSet 的实现比较简单,查看 Hash...

Java:Map与HashMap,Hashtable,HashSet比较

HashMap和Hashtable两个类都实现了Map接口,二者保存K-V对(key-value对);HashSet则实现了Set接口,性质类似于集合。 HashTable和HashMap区别 第一,...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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