javaSE 笔记 哈希值 + HashSet + LinkedHashSet + TreeSet
Set集合概述
不包含重复元素的集合
没有带索引的方法,所以不能用普通for循环遍历
Set是接口,所以需要实现类,HashSet就是其中一个,它由哈希表(是极为HashMap实例)支持。对集合的迭代顺序不做保证。
哈希值
是JDK根据对象的地址或者字符串或者数字算出来的int类型的数值
Object类 中有方法可以返回对象的哈希值: public int hashCode(); 返回对象的哈希码值
默认情况下,不同对象的哈希值不同,默认指的是Objcet类下的hashCode()方法,但要是重写了该方法,不通对象的哈希值可以相同
比如视频中的例子"重地".hashCode() 和 "通话".hashCode()
HashSet集合添加一个元素的过程:
这边需要注意的是,即使依据Hash值计算出来的位置中,有与新存入元素的Hash值相同的元素,也需要进一步比较内容,有点符合上面
的例子,重地和通话的,毕竟他们哈希值相同,但是内容不同。
最后说 HashSet集合存储元素,为了保证元素唯一性,需要重写hashCode()和equals(),不太懂,后续待看
哈希表
JDK8以前,底层采用数组+链表实现,是一个元素为链表的数组,整个存储流程看黑马视频P242
主要是数组中每个位置存的是链表,这样的话每个位置就能存多个元素了,对应上面说的,根据Hash值计算出位置后,还得比较不同的元素
JDK8之后,长度比较长的时候,底层实现了优化,具体待看
HashSet集合存储学生对象并遍历
其他的都差不多,关键是最后,当存储相同对象的时候,希望是不存储,但实际是存储的,最后是需要在学生类中重写hashCode()方法
和equals(),重写方式也是自动生成即可。。
LinkedHashSet集合概述和特点
哈希表和链表实现的Set接口,具有可预测的迭代次序。哈希表保证不重复,链表保证次序(元素的存储和取出顺序一致)。
TreeSet集合
1.元素有序,这里的顺序不是指存储和取出的顺序,而是按照一定的规则进行排序,具体排序方式取决于构造方法。或者说是看你重写的方法或者是比较器
TreeSet():无参构造,根据元素的自然排序进行排序
Treeset(Comparator comparator):根据指定的比较器进行排序
2.没有带索引的方法,不能使用普通for循环遍历
3.由于是Set()集合,所以不包含重复元素的集合
注意:集合存储的是引用类型,所以TreeSet< int >要改为TreeSet< Integer >
自然排序Comparable的使用
创建TreeSet集合使用无参构造方法
这里注意如果集合里想要存放的是学生,那么他本身是没有实现Comparable接口的,因此是不会自动排序的。但是前面一节课集合里存放的是Integer却是可以的,大概是因为Integer实现了这个接口。因此在定义学生类的时候,我们要让学生类实现Comparable接口,并且重写它的方法,compareTo(Student s),注意返回的值,1,-1,0代表的大小排序是不一样的。之后在向集合的对象中用add方法添加学生对象时,每添加一个对象,就会跟之前的对象进行比较,并且自动排序。
比较器Comparator的使用
创建对象时调用的是TreeSet的有参构造,参数应该是一个实现Comparator接口的类对象,可以直接用new,另外要重写compare()方法。之后只要创建对象,添加到集合中,就可以自动排序了。