JAVA学习笔记------Sixteen(HashSet,LinkedHashSet)

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;
            }
        }

    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值