摘要:
上面的输出结果可能有点让人觉得意外,从输出的结果可知输出的内容已经重复了(有两个-3),但是因为HashSet把他们添加到了不同的地方,所以HashSet完全可以容纳两个相同的元素。
但是当我们试图删除count为-3的R对象的时候,HsahSet会计算出该对象的hsahCode值,从而找出该对象在集合中保存的位置,然后把此处的对象与count为-3的R对象通过equals()方法进行比较,如果相等就删除该对象-----HashSet只有第三个元素才满足该条件(第一个元素实际上是存的count值为5的R 对象对应的位置,所以第三个元素会被删除)。
因此在修改HashSet集合中的对象时,应该考虑到,修改有可能导致该对象与集合中的其他对象相等,从而导致HashSet无法准确访问该对象。
同样的情况也会发生在TreeSet中,如果向TreeSet中添加一个可变对象后,后面的程序修改了改可变对象的成员变量,这将导致与其他对象的大小顺序发生改变,但是TreeSet不会再次调整他们的顺序,甚至可能导致这两个对象通过compareTo(Object obj)方法比较返回0.下 阅读全文
摘要:
HashSet是Set接口的典型实现,HashSet按Hash算法来存储集合中的元素,因此具有很好的存取和查找性能。
它具有如下特点:
· 不能保证元素的排列顺序,顺序可能发生变化
· HashSet不是同步的
· 集合的元素值可以为null
· HashSet判断两个元素相等的标准是两个对象通过equals()方法比较相等,并且两个对象的hashCode()方法返回的值也相等
下面的程序提供了A、B、C三个类分别重写了equals()、hashCode()两个方法或者全部: 阅读全文
摘要:
在编程的时候,常常需要集中存放多个数据。我们可以使用数组来存放这些数据,但是数组有一个缺点:数组的长度是不可变的,数组的空间开辟太大会造成浪费,开辟的空间太小又不够用。这时候就可以使用集合了。
为了保存数量不确定的数据和保存具有映射关系的数据,Java提供了集合类。所有的集合类都在 java.util包下。
Java的集合类主要由两个接口派生出:Collection和Map.这两个接口又包含了一些子接口或者实现类。
下图是java 集合体系 阅读全文