Collection:
|-- List:元素是有序的,元素可以重复。因为该集合体系有索引
|-- ArrayList:底层的数据结构使用的是数组结构 特点:查询快,增删改慢,线程不同步
|-- LinkedList:底层的数据结构使用的是链表数据结构 特点:查询慢,增删改快
|-- Vector:底层的数据结构使用的是数组结构 特点:线程同步,被ArrayList替代了
|-- Set:元素是无序的,元素不可以重复
|-- HashSet:底层的数据结构使用的是哈希表
|-- TreeSet:底层的数据结构使用的是二叉树,可以对set集合中的元素排序(排序的两种方式)
hashcode:
我们观察下列代码的运行结果
结果为Demo@512ddf17 其中512ddf17就是hashcode
hashcode就是通过hash函数得来的(通俗来说,就是通过某一种算法得到的)代表元素在hash表中对应的位置
为什么会有hashcode?
当我们向set集合中插入对象时,如何判别该集合中是否存在该对象?
不考虑性能的情况下,我们调用equals方法来逐个进行比较当然可以。但是如果集合中已经存在大量数据的话,效率必然是一个问题。此时hashcode方法的作用就体现出来了。当集合要添加新的对象时,先引入这个对象的hashcode方法获取hashcode值。如果不存在相同的hashcode值就直接存入。如果存在再调用equals,这样实际调用equals方法的次数就大大降低了(假如hash表中有1、2、3、4、5、6、7、8个位置,存第一个数,hashcode为1,该数就放在hash表中1的位置,存到80个数字,hash表中8个位置会有很多数字了,1中可能有10个数字,存81个数字时,他先查hashcode值对应的位置,假设为1,那么就有10个数字和他的hashcode相同,他只需要跟这10个数字相比较(equals))
HashSet :
论证HashSet集合判断元素是否重复是先比较Hashcode,再调用equals:
如下图所示,注释掉hashcode方法和equals方法,因为对象的地址值不同,相同名字和年龄对象是可以插入到hashset中。但是当我们重写了hashCode方法和equals方法后。相同名字和年龄的对象就被过滤掉了
TreeSet:
排序第一种方式:让元素自身具备比较性,实现Comparable接口,覆盖compareTo方法。
运行代码,提示如下错误信息。(TreeSet会对元素进行排序,我们需要实现Comparable接口让对象具有比较性)
这里我们重写compareTo方法(如果compareTo方法),compare方法返回0则代表两个元素完全一样。因此我们不单单要判断主要条件还需要判断次要条件。
TreeSet中的二叉树:
TreeSet的底层数据结构使用的是二叉树,那么二叉树是如何对集合进行排序的呢?
采用二叉树的中序遍历(详情可参考明哥之前的二叉树笔记)
排序第二种方式:定义比较器,将比较器对象作为参数传递给TreeSet集合的构造函数。
比较器:定义一个类,实现Comparator接口,覆盖compare方法
将比较器传入TreeSet集合的构造函数中。两种排序都在的时候,以比较器为主
网友评论