set集合特点:
不包含重复元素的集合
没有带索引的方法,所以不能使用for循环遍历
创建集合对象,使用Set接口的泛型实现类HashSet
HashSet对迭代的顺序不做任何保证(例如,添加的顺序时1,2,3输出可能是2,3,1)
哈希值是JDK根据对象的地址或者字符串或者数字,算出来的int类型的数值
Object类中有一个方法,hashCode(),可以获取对象的哈希值
hashCode的合同:
只要在执行java程序期间多次在同一个对象上调用它,hashCode返回的必须是相同的整数,前提是不修改equals比较中使用的信息,在同一应用程序的一次执行到另一次执行,该整数不需要保持一致
若两个对象根据equals方法相等,则这两个方法调用hashcode方法返回的值必须相等
若两个对象根据equals方法不相等,就必须返回不同的hashcode值
默认的不同的对象的哈希码是不同的:
通过方法重写,可以实现不同的对象的哈希值是相同的
HashSet特点:
底层数据结构是哈希表
对迭代顺序不做任何保证,也就是不保证放入和取出元素的顺序一致。
没有带索引的方法,所以不能使用for循环进行遍历
不包含重复的元素集合
HashSet集合存储学生对象
使用HashSet列表存储学生对象的时候出现了重复元素,是因为Student类没有重写equals和hashCode方法
重写完方法后:
LinkedHashSet特点:
哈希表和链表实现的Set接口,具有可预测的迭代次序
链表保证了元素的有序性,所以说元素的放入和取出顺序是一致的
由于哈希表保证元素的唯一,所以不会有重复的元素
TreeSet集合特点
元素有序,这里的顺序不是指存储和取出的顺序,而是按照一定的规则进行排序,具体排序方法取决于构造方法
TreeSet():无参构造方法根据元素的自然顺序进行排序
TreeSet(Comparator comparator):根据指定的比较器进行排序
没有带索引的方法,所以不能使用普遍的for循环遍历
由于是Set集合,所以不包含重复使用的集合
TreeSet使用无参构造,自然排序,且不包含重复添加的元素