这是我写的博客,不知道能不能行啊 一、ArrayList ArrayList:是List的子类,也是数组结构。 特点:1.长度可变;2.线程不同步;3.是作为替代了Vector出现的;4.看到是List集合形式,就知道可以有重复元素,并且可以实现增删改查四个功能。 二、HashSet HashSet:是Set集合的子类,哈希表结构。 特点:1.不允许存储重复元素,因为会发生查找的不确定性;2.不保证存入和取出顺序一致;3.查询效率非常高。 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,表示两个元素不同,进行存储。 HashSet就是通过hashCode()和equals两种方法来保证结构唯一性: HashCode是为了根据元素自身的特点确定哈希值;equals方法是为了解决哈希值的冲突。这样以来就完全是实现元素唯一性。 在此还要强调一下hashCode方法一个重要的作用: 当一个对象被存储进hashSet集合中以后,就不能修改这个对象中的那些参与计算哈希值的字段了。否则,对象修改后的哈希值与最初存储进hashSet集合中的哈希值不同。这种情况下,即便在contains方法使用该对象的当前引用作为参数去hashSet集合中检索对象,也将返回找不到对象的结果,导致无法从HashSet集合中单独删除当前对象,从而造成内存泄漏。 |