Set
不能存储重复元素,元素无序(指的是不按照添加的顺序,List集合是按照添加顺序存储的)
hashSet
注:源码底层是hashMap实现的,因为hashMap是双列的,其中键是不能重复的,而hashSet是单列集合,所以就将键单独运用,实现了我们的hashSet
add方法
注:hashset中添加元素时,使用的时map中的put方法,键是元素,而值则是一个常量,是一个object对象,如下:
hashSet添加元素时,如何判断元素是否已经存在(也就是判断hashMap的键是如何判断重复的)
add添加元素时,会先根据内容对象调用hashCode()方法计算出一个hash值(int类型),用计算出的哈希值作为标准来比较元素是否重复,效率高。但是,只用hash值比较是不安全的, 因为有些元素虽然内容不同,但是它们根据hashcode方法 (元素所属的类若重写了hashcode方法,则用重写的hashcode方法,若没有则使用object类的hashcode方法) 计算出的hash值是相同的(例“通话”与“种地”),为了避免,这时会调用equals方法对每个字符进行比较,只有hash值和内容都相同时,我们才会认定这两个元素重复,这时add方法就不会将其添加进set集合中
注:元素所属的类若重写了hashcode方法,则用重写的hashcode方法,若没有则使用object类的hashcode方法,object类中的hashcode()方法计算的hash值是由内存地址决定的,比较得是地址,而不是内容,所以我们如果要用集合对某个类的实例进行存储时,我们需要重写这个类的hashcode方法,通过内容计算hash值,这样set集合添加这个类的对象时,比较的就是内容而不是像object一样比较地址了,(举例:两个对象内容都相同,要存入set集合中,按道理它们是重复的,不能两个都添加,但是由于这个类没有重写hashcode方法,导致计算出的hash值不同,set集合add时就会把两个都添加进去)
注:我们自己定义的类中,重写hashcode方法时,idea会可以自动帮我们生成方法,且都是根据内容计算hash值,十分滴好用
TreeSet
元素不重复,且可以对元素进行指定方式的排序(是有序的)
存储的对象必须要实现Comparable接口
底层存储结构是二叉树(红黑树)
存储我们自定义的类对象时,类必须要实现comparable接口,重写compareTo方法。
如果对comparable接口不了解的友友,可以看下这篇哦~
https://blog.csdn.net/weixin_52394141/article/details/128907502
遍历方式
1.增强for循环
2.迭代器
Iterator类
Set集合总结:在java中可以存储一些单列不重复的元素,且需要排序时。