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
查看评论