3.Set
3.1 set集合概述,遍历
/*
Set集合的特点,没有重复元素,不含索引,不能用普通for循环
hashSet,迭代没有顺序
*/
public class Demo01Set {
public static void main(String[] args) {
Set<String> set=new HashSet<>();
set.add("hello");
set.add("world");
set.add("jaja");
set.add("jaja");
for(String i:set){
System.out.println(i);
}
}
}
3.2 哈希值
package demo08Set;
/*
哈希值:根据对象的地址,字符串或者数字信息得到的int类型的数值
通过重写可以使不同对象的hash值相同
*/
public class Demo02Hash {
public static void main(String[] args) {
Student stu=new Student("周杰伦",41);
Student stu2=new Student("周杰伦",41);
System.out.println(stu.hashCode());//764977973
System.out.println(stu.hashCode());//764977973
System.out.println(stu2.hashCode());//381259350
System.out.println("hello".hashCode());//99162322
System.out.println("world".hashCode());//113318802
System.out.println("你好".hashCode());//652829
System.out.println("马云".hashCode());//1245605
}
}
HashSet概述:
package demo08Set;
/*
hashSet是set的实现类
*/
import java.util.HashSet;
public class Demo03HashSet {
public static void main(String[] args) {
HashSet<String> hs=new HashSet<String>();
hs.add("hello");
hs.add("world");
hs.add("java");
hs.add("world");
for(String s:hs){
System.out.println(s);
}
}
}
/*
world
java
hello
*/
3.4 HashSet保证元素的唯一性
3.5 数据结构之哈希表
注:哈希表的初始长度是16
3.6 HashSet存储学生对象并遍历
package demo08Set;
/*
重复的对象可以被添加进去,所以要重写HashCode和Equals方法
*/
import java.util.HashSet;
public class Demo04HashSet {
public static void main(String[] args) {
Student s1=new Student("赵本山",66);
Student s2=new Student("宋小宝",36);
Student s3=new Student("小沈阳",33);
Student s4=new Student("小沈阳",33);
HashSet<Student> hs=new HashSet<Student>();
hs.add(s1);
hs.add(s2);
hs.add(s3);
hs.add(s4);
for(Student s:hs){
System.out.println(s.getAge()+"的"+s.getName()+"真猛");
}
}
}
3.7 LinkedHashSet 概述
package demo08Set;
/*
LinkedHashSet底层数据结构是链表和哈希表,添加内容不重复由哈希表保证,元素
有序由链表保证。
*/
import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
import java.util.LinkedList;
public class Demo05LinkedHashSet {
public static void main(String[] args) {
LinkedHashSet<String> lhs=new LinkedHashSet<String>();
lhs.add("杭电");
lhs.add("浙工大");
lhs.add("浙理工");
lhs.add("杭电");
for(String s:lhs){
System.out.println(s);
}
}
}
/*
杭电
浙工大
浙理工
*/
3.8 TreeSet概述
package demo08Set;
/*
会按一定的规则对存入的元素排序
*/
import java.util.TreeSet;
public class Demo06TreeSet {
public static void main(String[] args) {
TreeSet<Integer> ts=new TreeSet<Integer>();
ts.add(10);
ts.add(20);
ts.add(50);
ts.add(30);
ts.add(40);
ts.add(30);
for(int i:ts){
System.out.println(i);
}
}
}
/*
10
20
30
40
50
*/
3.9 自然排序Comparable的使用
package demo08Set;
import java.util.TreeSet;
public class Demo07Comparable {
public static void main(String[] args) {
//创建学生对象
Student s1=new Student("cangjingkong",41);
Student s2=new Student("jizemingbu",36);
Student s3=new Student("mingrihua",27);
Student s4=new Student("xidaoaili",27);
//创建TreeSet集合
TreeSet<Student> ts=new TreeSet<>();
//添加学生对象
ts.add(s1);
ts.add(s2);
ts.add(s3);
ts.add(s4);
//遍历
for(Student s:ts){
System.out.println(s.getAge()+"的"+s.getName()+"深受爱戴");
}
}
}
package demo08Set;
public class Student implements Comparable<Student> {
private String name;
private int age;
public Student() {
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public int compareTo(Student s) {
int num=s.age-this.age;//??this是s2,s是s1
int num2=num==0?this.name.compareTo(s.name):num;
return num2;
}
}
3.10 Comparator比较器的使用(TreeSet带参构造方法)
package demo08Set;
import java.util.Comparator;
import java.util.TreeSet;
public class Demo08Comparator {
public static void main(String[] args) {
//创建TreeSet集合
TreeSet<Student> ts=new TreeSet<Student>(new Comparator<Student>() {
@Override
public int compare(Student s1, Student s2) {
int num=s1.getAge()-s2.getAge();//s1是this,s2是s
int num2=num==0?s1.getName().compareTo(s2.getName()):num;
return num2;
}
});
//创建学生对象
Student s1=new Student("cangjingkong",41);
Student s2=new Student("jizemingbu",36);
Student s3=new Student("mingrihua",27);
Student s4=new Student("xidaoaili",27);
Student s5=new Student("xidaoaili",27);
//添加学生对象
ts.add(s1);
ts.add(s2);
ts.add(s3);
ts.add(s4);
ts.add(s5);
//遍历
for(Student s:ts){
System.out.println(s.getAge()+"的"+s.getName()+"深受爱戴");
}
}
}
/*
27的mingrihua深受爱戴
27的xidaoaili深受爱戴
36的jizemingbu深受爱戴
41的cangjingkong深受爱戴
*/
package demo08Set;
public class Student {
private String name;
private int age;
public Student() {
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Student student = (Student) o;
if (age != student.age) return false;
return name != null ? name.equals(student.name) : student.name == null;
}
@Override
public int hashCode() {
int result = name != null ? name.hashCode() : 0;
result = 31 * result + age;
return result;
}
}
3.11 Comparable实现成绩排序
package demo09TreeSet;
import java.util.TreeSet;
public class Demo01TreeSet {
public static void main(String[] args) {
TreeSet<Student> ts=new TreeSet<>();
Student s1=new Student("杨幂",97,88);
Student s2=new Student("佟丽娅",99,87);
Student s3=new Student("刘亦菲",98,95);
Student s4=new Student("张天爱",99,94);
Student s5=new Student("西瓜妹",99,94);
ts.add(s1);
ts.add(s2);
ts.add(s3);
ts.add(s4);
ts.add(s5);
for(Student s:ts){
System.out.println(s.getName()+"这次考试语文"+s.getChinese()+"数学"+s.getMath()+"总分"+s.getSum());
}
}
}
package demo09TreeSet;
public class Student implements Comparable<Student>{
private String name;
private int chinese;
private int math;
public Student() {
}
public Student(String name, int chinese, int math) {
this.name = name;
this.chinese = chinese;
this.math = math;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getChinese() {
return chinese;
}
public void setChinese(int chinese) {
this.chinese = chinese;
}
public int getMath() {
return math;
}
public void setMath(int math) {
this.math = math;
}
public int getSum(){
int sum=chinese+math;
return sum;
}
@Override
public int compareTo(Student s) {
int sum=s.getSum()-this.getSum();
int sum2=sum==0?s.chinese-this.chinese:sum;
int sum3=sum2==0?s.name.compareTo(this.name):sum2;
return sum3;
}
}
练习
1.不重复的随机数
package demo09TreeSet;
import java.util.*;
/*
产生10个不重复的随机数
1.建立Set集合
2.产生随机数存到集合里
3.遍历
*/
public class Demo02Random {
public static void main(String[] args) {
//Set<Integer> se=new HashSet<Integer>();//无序
Set<Integer> se=new TreeSet<>();
Random ra=new Random();
for (int i = 0; se.size()< 10; i++) {
int sum=ra.nextInt(20)+1;
se.add(sum);
}
for(Integer i:se){
System.out.println(i);
}
}
}