飞道的博客

Java回顾(六)Set集合

437人阅读  评论(0)

1、Set集合

1.1、Object中的hascode值

默认情况下,不同对象的hascode值是不相同的,除非之前已经把hascode值重写了。
不同的英文单词的hascode值是不相同的,但两个不同的中文字符返回的hascode值有些确是相同的,原因是因为String里面重写了Object中的这个hascode方法。

public class SetTest {
    public static void main(String[] args) {
        //hasCode返回值是int类型
        System.out.println("hello".hashCode()); //99162322
        System.out.println("hws".hashCode());  //99162322
        System.out.println("hws".hashCode());  //103748
        System.out.println("=============");
        System.out.println("重地".hashCode());  //1179395
        System.out.println("通话".hashCode());  //1179395
        System.out.println("=============");
        System.out.println("电话".hashCode()); //965960
        System.out.println("手机".hashCode()); //806479
    }
}

1.2、HasSet集合的概述和特点

1.2.1、HasSet集合的特点

  • 底层的数据结构是哈希表
  • 没有索引,所以不能用普通的for循环进行遍历
  • 对集合的迭代顺序不做任何保证,也就是不保证存储和取出的元素顺序一致
  • 不包含重复元素

1.2.2、HasSet集合简单测试

public static void main(String[] args) {
        HashSet<String> hashSet = new HashSet<>();
        hashSet.add("hello");
        hashSet.add("hws");
        hashSet.add("world");

        hashSet.add("hws");
        for (String s : hashSet) {
            System.out.println(s);
        }
    }

1.2.3、哈希表的存储

  • (JDK8之前),底层是依赖于hashCode()和equals(),这两个方法的。

1.2.4、HashSet集合存储学生对象并遍历

需求:创建一个存储学生对象的集合,存储多个学生对象,遍历该集合
要求:学生对象的成员变量值相同,我们就认为是同一个对象
实现:

  • 1、定义学生类
  • 2、调用学生类创建对象
  • 3、创建HashSet<>集合,括号里面放Student
  • 4、将学生类加入集合中
  • 5、用增强for遍历HashSet集合(这一步写完后,还是可以添加重复的Student)
  • 6、在Student方法中重写HashCode和equals方法(用IDEA自动生成即可,右键>generate>从上往下第五个)
public class HashSetStudentTest {
    public static void main(String[] args) {
        Student student1 = new Student("hws", 20);
        Student student2 = new Student("xjp", 100);
        Student student3 = new Student("xjp", 100);

        HashSet<Student> hashSet = new HashSet<>();
        hashSet.add(student1);
        hashSet.add(student2);
        hashSet.add(student3);

        for (Student hs : hashSet) {
            System.out.println(hs.getName() + "-->" + hs.getAge());
        }
    }
}

1.2.5、LinkedHashSet集合

LinkedHashSet集合底层是 哈希表+链表,可以保障取出数据的顺序(主要是通过链表来实现的),由于是Set集合,所以不能有重复元素的存在。

1.2.6、TreeSet集合的特点


1.2.7、自然排序Comparable的使用

  • 存储学生的对象并遍历。创建TreeSet集合使用无参构造方法
  • 要求:按照年龄从小到大排序,年龄相同的时候,按照姓名的字母顺序排序

Student类中对compareTo进行重写,然后再写TreeSet

public class Student implements Comparable<Student>


1.2.8、比较器Comparable的使用

1.3 案例

1.3.1 案例一

需求:用Treeset集合存储多个学生信息(姓名,语文成绩,数学成绩)要求:并遍历该集合要求:按照总分从高到低出现

public class TreeSetDemoTest {
    public static void main(String[] args) {
        TreeSet<Student> ts = new TreeSet<>(new Comparator<Student>() {
            @Override
            public int compare(Student s1, Student s2) {
                //主要条件
                int num = s2.getSum() - s1.getSum();
                //次要条件
                return num == 0 ? s1.getName().compareTo(s2.getName()) : num;
            }
        });

        Student s1 = new Student("hws", 110, 120);
        Student s2 = new Student("diaochan", 90, 79);
        Student s3 = new Student("lvbu", 100, 89);

        ts.add(s1);
        ts.add(s2);
        ts.add(s3);

        for (Student s : ts) {
            System.out.println(s.getName() + " " + s.getSum());
        }
    }
}

1.3.2 案例二

需求:编写一个程序,获取10个1-20之间的随机数,要求随机数不能重复,并在控制台输出


转载:https://blog.csdn.net/hongweisong666/article/details/105382357
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场