特点:
1、不包含重复元素的集合
2、没有带索引的方法,不能使用普通for循环遍历
HashSet对集合的迭代顺序不做保证
Setset = new HashSet (); set.add("java"); set.add("hello"); set.add("world"); set.add("hello"); System.out.println(set); Iterator it2 = set.iterator(); while(it2.hasNext()) { System.out.println(it2.next()); } System.out.println("------增强for循环------"); for(String s : set) { System.out.println(s); }
哈希值:是JDK根据对象的地址或字符串或者数字算出来的int类型的数值
Object类中的方法:public int hashCode();返回对象的哈希码值
同一个对象调用以上方法,所得到的哈希码值是一样的
默认情况下,不同对象的哈希值是不相同的
重写hashCode方法可以使不同对象的哈希值相同
HashSet集合概述及特点 特点:底层数据结构是哈希表
对集合的迭代顺序不做任何保证 , 不保证存入和取出的顺序一致
没有带索引的方法,所以不能使用普通for循环
不包含重复元素的集合
常见数据结构之哈希表JDK8之前,底层采用数组+链表实现,可以说是一个元素为链表的数组
JDK8之后,在长度比较长的时候,底层实现了优化
linkedHashSet集合概述及特点
特点:哈希表和链表实现的Set接口具有可预测的迭代次序
由链表保证元素次序
由哈希表保证元素的唯一性
TreeSet集合概述及特点
集合特点:
元素有序:这里的顺序不是指存储和取出的顺序,而是按照一定的规则进行排序,具体排序方式屈取决于构造方法
1、无参构造方法,根据元素的自然排序进行排序
2、TreeSet(Comparator comparator):是根据指定的比较器进行排序
没有带索引的方法,因此不能使用普通for循环进行遍历
由于是set集合因此不存在重复元素
如果泛型是Integer则自然顺序是从小到大进行排序
自然排序Comparable的使用
1、存储学生对象并遍历,创建TreeSet集合使用无参构造方法
2、要求:按年龄从小到大进行排序,年龄相同时,按字母的顺序进行排序
class Student implements Comparable{ //实现Comparable接口,才能进行遍历 String name; int age; public Student() { } public Student(String name , int age) { this.name = name; this.age = age; } @Override public int compareTo(Student o) { //需要对ComparaTo方法进行重写 // TODO Auto-generated method stub int num = this.age - o.age; int num1 = num == 0 ? this.name.compareTo(o.name):num; return num1; } } TreeSet stu1 = new TreeSet (); stu1.add(new Student("xiaohong", 19)); stu1.add(new Student("xiaogang", 20)); stu1.add(new Student("mingming", 18)); stu1.add(new Student("xiaoming" , 19)); for (Student stu3 : stu1) { System.out.println(stu3.name + " " + stu3.age); } 遍历结果是 mingming 18 xiaohong 19 xiaoming 19 xiaogang 20
总结:
用TreeSet集合存储自定义对象无参构造方法使用的是自然排序对元素进行排序的
自然排序,就是让元素所属的类实现Comparable接口,重写comparable方法
比较器排序Comparator的使用
1、存储学生对象并遍历,创建TreeSet集合使用带参构造方法
2、要求:按年龄从小到大进行排序,年龄相同时,按字母的顺序进行排序
TreeSetarr1 = new TreeSet (new Comparator () { @Override public int compare(Student o1, Student o2) { // TODO Auto-generated method stub int no = o1.age - o2.age; int no2 = no == 0 ? o1.name.compareTo(o2.name) : no; return no2; } }); //使用匿名内部类创建对象,在创建对象的同时对接口的方法进行重写 arr1.add(new Student("xiaohong", 19)); arr1.add(new Student("xiaogang", 20)); arr1.add(new Student("mingming", 18)); arr1.add(new Student("xiaoming" , 19)); for(Student st : arr1) { Student s1 = st; System.out.println(s1.name + " " + s1.age); }
自然排序和比较器排序的区别是自然排序需要学生类继承接口,比较器排序是通过创建匿名内部类的同时对接口的方法进行重写,不需要学生类继承接口
注意两种方法重写的方法名不一样,一个是compare 一个是 compareTo



