ArrayList与HashSet比较及HashCode分析

 

ArrayList与HashSet比较

ArrayList是一种有顺序的集合

HashSet通过比较两个对象是否相等,相同则不加入HashSet集合,不允许重复。如何比较? HashSet集合对象中必须重写equals()方法和hashCode()方法

HashCode分析

目的提高hash集合中查找元素的效率,这种方法将集合分成若干个存储区域,每个对象可以计算出一个哈希码。将哈希码分组,每组分别对应某个存储区域,根据一个对象的哈希码就可以确定该对象应该存储在哪个区域。

HashSet就是采用哈希算法存取对象的集合,内部采用对某个数字n取余的方式对哈希码进行分组和划分对象的存储区域。

Object类中定义了一个hashCode()方法来返回每个Java对象的哈希码,当从HashSet集合中查找某个对象时,Java系统首先调用对象的hashCode()方法来获取该对象的哈希码,然后根据哈希码找到相应的存储区域,最后

取出该存储区域的每个元素与该对象进行equals()方法比较。这样就不用遍历集合中的所有元素就可以得到结论。

HashSet集合具有很好的对象检索性能,但是HashSet集合存储对象的效率要低。

public static void main(String[] args) {
		// TODO Auto-generated method stub
		Collection collections = new HashSet();

		ReflectTest2 r1 = new ReflectTest2(3, 3);
		ReflectTest2 r2 = new ReflectTest2(5, 5);
		ReflectTest2 r3 = new ReflectTest2(3, 3);

		collections.add(r1);
		collections.add(r2);
		collections.add(r3);
		collections.add(r1);
		// !!!如果对象已经存储到了hashSet集合中,就不要再修改对象参与hashCode计算的属性的值
		// 如果改掉r1属性y的值,hashSet函数将执行不了该对象方法
         	r1.y = 2;
		collections.remove(r1);

		// 如果让r1,r3属于同一个对象,必须在ReflectTest2中重写equals()方法和hashcode()方法
		// hashcode()方法使r1,r3的哈希码也相等
		// 如不是hashSet集合。根本没必要
		// 在ReflectTest2类中重写equals()方法和hashCode()方法后结果为2.否则是3
        	System.out.println(collections.size());
	}
public class ReflectTest2 {
	private int x;
	public int y;
//重写equals()和hashcode()方法
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + x;
		result = prime * result + y;
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		ReflectTest2 other = (ReflectTest2) obj;
		if (x != other.x)
			return false;
		if (y != other.y)
			return false;
		return true;
	}

}

PS:如果对象已经存储到了hashSet集合中,就不要再修改该对象参与hashCode计算的属性的值。改变后该对象将产生一个新的哈希码,例子中的collections.remove(r1);语句将不能执行成功,造成内存泄露!!!!

				
时间: 2024-11-18 07:59:46

ArrayList与HashSet比较及HashCode分析的相关文章

java基础巩固系列(五):ArrayList与HashSet的比较,以及HashCode分析

首先,我们需要知道的是ArrayList和HashSet类都在java.util包中,都是实现了Collection的类,Collection是一个标准. 然后,我们介绍下这两个类之间的区别: 1.ArrayList:相当于一个动态的数组,是一组有序的集合,当对象被添加到ArrayList时,对象会先找到第一个空缺的地方.这里有一点需要记得:放进去的是对象的引用,不是对象本身.然后,放入第二个对象,如果和第一个相同的话,依然按照顺序存放进去.也就是说,在这个有序集合里,每有一个对象就会放入一个引

ArrayList_HashSet的比较及Hashcode分析

ArrayList_HashSet的比较及Hashcode分析 hashCode()方法的作用   public static void main(String[] args) { Collection collection = new HashSet<>(); ReflectPoint pt1 = new ReflectPoint(3, 3); ReflectPoint pt2 = new ReflectPoint(5, 5); ReflectPoint pt3 = new ReflectP

java-通过 HashMap、HashSet 的源码分析其 Hash 存储机制

通过 HashMap.HashSet 的源码分析其 Hash 存储机制 集合和引用 就像引用类型的数组一样,当我们把 Java 对象放入数组之时,并非真正的把 Java 对象放入数组中.仅仅是把对象的引用放入数组中,每一个数组元素都是一个引用变量. 实际上,HashSet 和 HashMap 之间有非常多相似之处,对于 HashSet 而言.系统採用 Hash 算法决定集合元素的存储位置,这样能够保证能高速存.取集合元素:对于 HashMap 而言.系统 key-value 当成一个总体进行处理

Java集合:HashSet的源码分析

Java集合---HashSet的源码分析 一.  HashSet概述: HashSet实现Set接口,由哈希表(实际上是一个HashMap实例)支持.它不保证set 的迭代顺序:特别是它不保证该顺序恒久不变.此类允许使用null元素. 二.  HashSet的实现: 对于HashSet而言,它是基于HashMap实现的,HashSet底层使用HashMap来保存所有元素,因此HashSet 的实现比较简单,相关HashSet的操作,基本上都是直接调用底层HashMap的相关方法来完成, Has

安卓 ArrayList,LinkedList,HashSet,Vector,TreeSet的区别和使用

java的集合就那么几种 总体为:List,Set,Map (都是接口由其子类去实现具体的方法) ArrayList,LinkedList,Vector都属于List List:元素是有顺序的,元素可以重复因为每个元素有自己的角标(索引)  |-- ArrayList:底层的数据结构是数组结构,特点是:查询很快,增 删 稍微慢点,线程不同步 |-- LinkedList:底层使用的是链表数据结构,特点是:增 删很快,查询慢. |--Vector:底层是数组数据结构,线程同步,被ArrayList

Java自学-集合框架 ArrayList和HashSet的区别

Java ArrayList和HashSet的区别 示例 1 : 是否有顺序 ArrayList: 有顺序 HashSet: 无顺序 HashSet的具体顺序,既不是按照插入顺序,也不是按照hashcode的顺序. 以下是HasetSet源代码中的部分注释 /** * It makes no guarantees as to the iteration order of the set; * in particular, it does not guarantee that the order

Java 集合系列 07 List总结(LinkedList, ArrayList等使用场景和性能分析)

java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java 集合系列 04 LinkedList详细介绍(源码解析)和使用示例 Java 集合系列 05 Vector详细介绍(源码解析)和使用示例 Java 集合系列 06 Stack详细介绍(源码解析)和使用示例 Java 集合系列 07 List总结(LinkedList, ArrayList等使用场景和

(转)Java 集合系列08之 List总结(LinkedList, ArrayList等使用场景和性能分析)

概要 前面,我们学完了List的全部内容(ArrayList, LinkedList, Vector, Stack). Java 集合系列03之 ArrayList详细介绍(源码解析)和使用示例 Java 集合系列04之 fail-fast总结(通过ArrayList来说明fail-fast的原理.解决办法) Java 集合系列05之 LinkedList详细介绍(源码解析)和使用示例 Java 集合系列06之 Vector详细介绍(源码解析)和使用示例 Java 集合系列07之 Stack详细

【转】Java如何克隆集合——深度拷贝ArrayList和HashSet

原文网址:http://blog.csdn.net/cool_sti/article/details/21658521 原英文链接:http://javarevisited.blogspot.hk/2014/03/how-to-clone-collection-in-java-deep-copy-vs-shallow.html 程序员通常会误用集合类(如List.Set.ArrayList.HashSet)所提供的拷贝构造函数或其它方法来完成集合的拷贝.值得记住的一点是,Java中集合提供的拷贝