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
    评论
图像识别技术在病虫害检测中的应用是一个快速发展的领域,它结合了计算机视觉和机器学习算法来自动识别和分类植物上的病虫害。以下是这一技术的一些关键步骤和组成部分: 1. **数据收集**:首先需要收集大量的植物图像数据,这些数据包括健康植物的图像以及受不同病虫害影响的植物图像。 2. **图像预处理**:对收集到的图像进行处理,以提高后续分析的准确性。这可能包括调整亮度、对比度、去噪、裁剪、缩放等。 3. **特征提取**:从图像中提取有助于识别病虫害的特征。这些特征可能包括颜色、纹理、形状、边缘等。 4. **模型训练**:使用机器学习算法(如支持向量机、随机森林、卷积神经网络等)来训练模型。训练过程中,算法会学习如何根据提取的特征来识别不同的病虫害。 5. **模型验证和测试**:在独立的测试集上验证模型的性能,以确保其准确性和泛化能力。 6. **部署和应用**:将训练好的模型部署到实际的病虫害检测系统中,可以是移动应用、网页服务或集成到智能农业设备中。 7. **实时监测**:在实际应用中,系统可以实时接收植物图像,并快速给出病虫害的检测结果。 8. **持续学习**:随着时间的推移,系统可以不断学习新的病虫害样本,以提高其识别能力。 9. **用户界面**:为了方便用户使用,通常会有一个用户友好的界面,显示检测结果,并提供进一步的指导或建议。 这项技术的优势在于它可以快速、准确地识别出病虫害,甚至在早期阶段就能发现问题,从而及时采取措施。此外,它还可以减少对化学农药的依赖,支持可持续农业发展。随着技术的不断进步,图像识别在病虫害检测中的应用将越来越广泛。
引用中的内容是一个文件列表,其中包含了不同文件的权限和其他相关信息。其中,drwx------表示一个目录文件,并且只有属主拥有读、写和执行的权限,其他用户没有任何权限。引用中提到,文件权限由第2-4位表示属主权限,第5-7位表示同组用户权限,第8-10位表示其他用户权限。所以,drwx------表示只有属主具有读、写和执行的权限,其他用户没有任何权限。这种权限设置通常用来保护敏感的文件或目录,只有文件的属主可以对其进行操作,其他用户无法访问或修改。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [chmod 755的含义 及drwxr-xr-x 的含义【drwxr-xr-x改为drwx------】(sixteen day second)](https://blog.csdn.net/ZJX103RLF/article/details/89217917)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [apkdecompile-tool.tar.gz](https://download.csdn.net/download/jordanhgl/12116085)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值