------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------
ArrayList
ArrayList:是List的子类,也是数组结构。
特点:1.长度可变;2.线程不同步;3.是作为替代了Vector出现的;4.看到是List集合形式,就知道可以有重复元素,并且可以实现增删改查四个功能。
通过代码的演示来了解ArrayList:
HashSet
HashSet:是Set集合的子类,哈希表结构。
特点:1.不允许存储重复元素,因为会发生查找的不确定性;2.不保证存入和取出顺序一致;3.查询效率非常高。
HashSet集合取出元素的方法只有一个:迭代器。
用简单的一段代码来展现一下HashSet:
分别介绍完ArrayList和HashSet之后,再看一下他们的区别:
ArrayList:1.有序,存入数据和取出数据一致;2.有索引,所以保证有序;3.允许重复元素;
HashSet:1.不保证顺序;2.不允许重复元素。
在学习HashSet时,存储元素时接触到了hash表和hash算法以及hashCode()。对于这这三个知识点进行一下说明。
1.hash算法:因为HashSet中不允许重复元素,所以在存储时就会算出每个元素固定的位置或叫做角标。那么算的方法就叫做hash算法:
method(element){
index = ascii % 10;
return index;
}
2.Hash表:用于存储元素和哈希值对应关系的容器称之为哈希表。
3.hashCode():hash算法功能本身在堆底层就是哈希表结构,计算对象在该结构存放的地址。这个方法就叫做hashCode()。
在运用hashSet时,会遇到一个问题,哈希冲突。首先解释一下,何为哈希冲突:
当哈希算法算出两个元素的值相同时,这样的情况就叫做哈希冲突。
那么遇到这种问题,如何解决呢?冲突后,对元素进行进一步的判断。判断元素的内容:
哈希表在判断元素是否相同,一句hashCode()方法,如果哈希冲突(哈希值相同),再判断元素的equals方法。如果equals返回true,表示来两个元素相同,不进行存储;返回false,表示两个元素不同,进行存储。
以上列的Student对象为实例,用代码来体现具体的实现步骤:
HashSet就是通过hashCode()和equals两种方法来保证结构唯一性:
HashCode是为了根据元素自身的特点确定哈希值;equals方法是为了解决哈希值的冲突。这样以来就完全是实现元素唯一性。
在此还要强调一下hashCode方法一个重要的作用:
当一个对象被存储进hashSet集合中以后,就不能修改这个对象中的那些参与计算哈希值的字段了。否则,对象修改后的哈希值与最初存储进hashSet集合中的哈希值不同。这种情况下,即便在contains方法使用该对象的当前引用作为参数去hashSet集合中检索对象,也将返回找不到对象的结果,导致无法从HashSet集合中单独删除当前对象,从而造成内存泄漏。