1.HashSet
HashSet 底层数据结构是哈希表. HashSet 不是线程安全的 集合元素可以是 null
哈希表:是一个元素为链表的数组,综合了数组和链表的优点 (像新华字典一样) (JDK1.7之前)
HashSet 保证元素唯一性是靠元素重写hashCode()和equals()方法来保证的,如果不重写则无法保证。
public class MyTest {
public static void main(String[] args) {
HashSet<Student> set = new HashSet<>();
set.add(new Student("张三",23));
set.add(new Student("张三", 23));
set.add(new Student("李四", 24));
set.add(new Student("王五", 25));
set.add(new Student("赵六", 26));
set.add(new Student("张三", 233));
set.add(new Student("田七", 23));
set.add(new Student("吴八", 23));
for (Student student : set) {
System.out.println(student.getName()+"=="+student.getAge());
}
}
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 int hashCode() {
//张三 20 + 30*11 =50
//张三 20 + 30*11 =50
//李四 10 + 24*11 34
//赵六 24 + 10*11 34
return name.hashCode()+age*11;
}
@Override
public boolean equals(Object obj) {
System.out.println(this+"==="+obj);
if (this == obj) {
return true;
}
if (!(obj instanceof Student)) {
return false;
}
Student student = (Student) obj;
return this.name.equals(student.name) && this.age == student.age;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
2.LinkedHashSet
数据结构 有两个 链表和哈希表
链表保证有序 哈希表保证元素唯一
A:LinkedHashSet的概述: 元素有序 , 并且唯一
B:案例演示: LinkedHashSet的特点
public class MyTest2 {
public static void main(String[] args) {
LinkedHashSet<Integer> set = new LinkedHashSet<>();
set.add(10);
set.add(20);
set.add(30);
set.add(40);
set.add(50);
set.add(60);
set.add(70);
set.add(80);
for (Integer integer : set) {
System.out.println(integer);
}
3.TreeSet
A: TreeSet集合的特点: 元素唯一,并且可以对元素进行排序
排序:
a: 自然排序
b: 使用比较器排序
到底使用的是哪一种的排序取决于,构造方法.
注意:使用TreeSet集合进行元素的自然排序,那么对元素有要求,要求这个元素
必须实现Comparable接口 否则无法进行自然排序
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 String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
@Override
public int compareTo(Student student) {
//比较逻辑,
//按照姓名的长度来排序
int num = this.name.length() - student.name.length();
//当姓名长度一样时,还得比较姓名的内容
int num2 = num == 0 ? this.name.compareTo(student.name) : num;
//当姓名的长度和内容一样时,害得比较姓名是否一样
int num3 = num2 == 0 ? this.age - student.age : num2;
return num3;
}
}
public class MyTest {
public static void main(String[] args) {
TreeSet<Student> set = new TreeSet<>();
set.add(new Student("赵六", 26));
set.add(new Student("赵六", 26));
set.add(new Student("赵六", 26));
set.add(new Student("赵六", 26));
set.add(new Student("赵六", 260));
set.add(new Student("赵六2", 26));
set.add(new Student("张三2222", 233));
set.add(new Student("田七", 230));
set.add(new Student("吴八222", 2313));
set.add(new Student("张三22", 23));
set.add(new Student("张三222", 23));
set.add(new Student("李四11111111", 24));
set.add(new Student("王五", 20));
for (Student student : set) {
System.out.println(student);
}
}
}
案例演示:登陆演示:
public class LoginUI {
public static void main(String[] args) {
//1.当用户输入的类型,不正确时,程序不能挂掉,得提示用户输入的类型不正确,请重新输入
//2.登录只给3次机会,还得提示剩余次数
//3.对用户名进行正则检验 用户名名的规则 6-16字母大小写都可以 密码 6-16位数字
Scanner sc = new Scanner(System.in);
UserDao userDao = new UserDaoImpl();
while (true) {
System.out.println("请选择 1 注册 2 登录 3 退出");
//获取用户输入的选项,来做处理
boolean a = sc.hasNextInt();
if (a) {
int num = sc.nextInt();
sc = new Scanner(System.in);
switch (num) {
case 1: //注册
User user = new User();
for (int i = 1; i != 0; i++) {
String regx = "[a-zA-Z]{6,16}";
System.out.println("请输入你的用户名");
String username = sc.nextLine();
boolean c = username.matches(regx);
if (!c) {
System.out.println("用户名格式为6-16位大小写字母,请重新输入!");
} else {
user.setUsername(username);
break;
}
}
for (int i = 1; i != 0; i++) {
String regx1 = "[0-9]{6,16}";
System.out.println("请输入你的密码");
String password = sc.nextLine();
boolean d = password.matches(regx1);
if (!d) {
System.out.println("密码格式为6-16位数字,请重新输入!");
} else {
user.setPassword(password);
break;
}
}
//调用注册功能
userDao.register(user);
System.out.println("注册成功!");
break;
case 2: //登录
for (int i = 3; i >= 0; i--) {
System.out.println("请输入你的用户名");
String username2 = sc.nextLine();
System.out.println("请输入你的密码");
String password2 = sc.nextLine();
//调用登录功能
boolean b = userDao.login(username2, password2);
if (b) {
System.out.println("登录成功");
System.out.println("要玩游戏吗?y/n");
while (true) {
String str = sc.nextLine();
if (str.equalsIgnoreCase("y")) {
GuessNumber.playGame();
System.out.println("还要玩吗?y/n");
} else {
System.exit(0);
}
}
} else {
if (i == 0) {
System.out.println("你的用户已经锁定,请明天重试.");
System.exit(0);
break;
} else {
System.out.println("用户名或密码错误,请重写输入。你还有" + i + "次机会");
}
}
}
break;
case 3://退出
default:
System.exit(0);
break;
}
} else {
System.out.println("你输入的类型不正确,请重新输入");
}
}
}
}
public interface UserDao {
//注册功能
public abstract void register(User user);
//登录功能
public abstract boolean login(String username, String password);
}
public class UserDaoImpl implements UserDao {
static ArrayList<User> list = new ArrayList<>();
@Override
public void register(User user) {
list.add(user);
}
@Override
public boolean login(String username, String password) {
//比对用户名和密码是否正确
boolean flag = false;
for (User user : list) {
if (user.getUsername().equals(username) && user.getPassword().equals(password)) {
flag = true;
break;
}
}
return flag;
}
}
public class User {
private String username;
private String password;
public User() {
}
public User(String username, String password) {
this.username = username;
this.password = password;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
public class GuessNumber {
public static void playGame(){
Random random = new Random();
int num= random.nextInt(100)+1;
Scanner sc = new Scanner(System.in);
while (true){
System.out.println("请输入一个数字 1----100");
int guessNumber = sc.nextInt();
if (guessNumber > num) {
System.out.println("猜大了");
} else if (guessNumber < num) {
System.out.println("猜小了");
} else if (guessNumber == num) {
System.out.println("恭喜你猜对了");
break;
}
}
}