美文网首页
我在上海乐字节学习Java基础第二十天(集合)

我在上海乐字节学习Java基础第二十天(集合)

作者: 天上的小仙女呀 | 来源:发表于2020-11-16 08:46 被阅读0次

    一、集合

    1、回顾数组: 存储同一种数据类型的集合容器
    数组的特点:只能存储同一种数据类型的数据;一旦初始化,长度固定;数组中的元素与元素之间的内存地址是连续的。
    注意: Object类型的数组可以存储任意类型的数据。

    `public class Demo20.1{
        public static void main(String[] args) {
            Object[] arr = new Object[10];
            arr[1] = "abc";
            arr[2] = 'a';
            arr[3] = 12;        
        }   
    }` 
    

    2、集合:集合是存储对象数据的集合容器。

    集合比数组的优势:
    ① 集合可以存储任意类型的对象数据,数组只能存储同一种数据类型的数据。
    ② 集合的长度是会发生变化的,数组的长度是固定的。

    3、Collection:单例集合的跟接口
    ① List:如果是实现了List接口的集合类,具备的特点:有序,可重复。
    ② Set:如果是实现了Set接口的集合类,具备特点:无序,不可重复。


    单例集合和双例集合

    4、Collection接口中的方法
    ① 增加
    ◆ add(object):添加成功返回true,添加 失败返回false
    ◆ addAll(Collection c):把一个集合的元素添加到另外一个集合中去
    ② 删除
    ◆ clear()
    ◆ remove(Object o)
    ◆ removeAll(Collection c)
    ◆ retainAll(Collection c)
    ③ 查看
    ◆ size()

    `import java.util.ArrayList;
    import java.util.Collection;
    
    public class Demo20.2{  
        public static void main(String[] args) {
            Collection c = new ArrayList();
            c.add("张三");
            c.add("李四");
            c.add("王五");
            System.out.println("添加成功吗?"+c.add("小六"));       
            //创建集合
            Collection c2 = new ArrayList();
            c2.add("张三");
            c2.add("李四");
            c.addAll(c2); // 把c2的元素的添加到c集合中去
            //删除方法
            //c.clear(); //clear()清空集合中的元素
            System.out.println("删除成功吗?"+c.remove("美美"));  // remove 指定集合中的元素删除,删除成功返回true,删除失败返回false.      
            c.removeAll(c2); //删除c集合中与c2的交集元素。      
            c.retainAll(c2); //保留c集合与c2的交集元素,其他的元素一并删除。
            System.out.println("查看元素个数:"+c.size()); 
            System.out.println("集合的元素:"+ c);        
        }   
    }` 
    

    ④ 判断
    ◆ isEmpty()
    ◆ contains(Object o)
    ◆ containsAll(Collection<?> c)

    `import java.util.ArrayList;
    import java.util.Collection;
    
    class Person{   
        int id;     
        String name;
        public Person(int id, String name) {
            this.id = id;
            this.name = name;
        }
        @Override
        public String toString() {
            return "{编号:"+this.id+" 姓名:"+ this.name+"}";
        }   
        @Override
        public boolean equals(Object obj) {
            Person p = (Person)obj;
            return this.id == p.id ;
        }   
        //java规范: 一般重写equlas方法我们都会重写hashCode方法的
        @Override
        public int hashCode() {
            return this.id;
        }   
    }
    public class Demo20.3{  
        public static void main(String[] args) {
            Collection c = new ArrayList();
            c.add("张三");
            c.add("李四");
            c.add("王五");
            System.out.println("判断集合是否为空元素:"+ c.isEmpty());
            System.out.println("判断集合中是否存在指定的元素:"+ c.contains("大宝"));
            
            //集合添加自定义的元素
            Collection c1 = new ArrayList();
            c1.add(new Person(110,"狗娃"));
            c1.add(new Person(119,"狗剩"));
            c1.add(new Person(120,"铁蛋"));               
            Collection c2 = new ArrayList();
            c2.add(new Person(110,"狗娃"));
            c2.add(new Person(119,"狗剩"));
            c2.add(new Person(104,"陈狗剩"));      
            System.out.println("c1集合有包含c2集合中的所有元素吗?"+ c1.containsAll(c2));      
            System.out.println("存在该元素吗?"+c1.contains(new Person(120,"陈铁蛋"))); // 其实contains方法内部是依赖于equals方法进行比较的。
            System.out.println("集合的元素:"+ c1);       
        }
    }` 
    

    ⑤ 迭代
    ◆ toArray()
    ◆ iterator()

    `import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.Collection;
    
    public class Demo20.4 { 
        public static void main(String[] args) {
            Collection c = new ArrayList();
            c.add("张三");
            c.add("李四");
            c.add("王五");
            Object[] arr = c.toArray(); //把集合中的元素全部存储到一个Object的数组中返回
            System.out.println("数组的元素:"+Arrays.toString(arr));
                    
            Collection c2 = new ArrayList();
            c2.add(new Person(110,"狗娃"));
            c2.add(new Person(119,"狗剩"));
            c2.add(new Person(120,"铁蛋"));
            Object[] arr = c2.toArray(); 
            //需求: 把编号是110的人信息输出
            for(int i = 0 ; i<arr.length ; i++){
                Person p = (Person) arr[i];  //从Object数组中取出的元素只能使用Object类型声明变量接收,如果需要其他的类型需要进行强制类型转换。
                if(p.id==110){
                    System.out.println(p);
                }
            }           
        }` 
    

    5、迭代器的作用:就是用于抓取集合中的元素。
    迭代器的方法:

    常用方法

    解释

    hasNext()

    是否有元素可遍历。如果有元素遍历,返回true,否则返回false

    next()

    获取当前指针指向的元素并返回当前元素,然后指针向西移动一个单位

    remove()

    移除迭代器最后一次返回的元素

    NoSuchElementException 没有元素的异常。
    出现的原因: 没有元素可以被迭代了

    `import java.util.ArrayList;
    import java.util.Collection;
    import java.util.Iterator;
    
    public class Demo20.5{  
        public static void main(String[] args) {
            Collection c = new ArrayList();
            c.add("狗娃");
            c.add("狗剩");
            c.add("铁蛋");    
            //遍历集合的元素------>方式一:可以使用toArray方法
            Object[] arr = c.toArray(); // toArray()把集合的元素存储到一个 Object的数组中返回
            for(int i = 0 ; i<arr.length ; i++){
                System.out.print(arr[i]+",");
            }   
                
            //遍历集合的元素------>方式二:使用iterator迭代器遍历
            Iterator it = c.iterator();  //返回一个迭代器    
            //疑问:iterator()方法返回的是一个接口类型,为什么接口又可以调用方法可以使用呢?
            //iterator实际上返回的是iterator接口的实现类对象。
            while(it.hasNext()){ // hasNext()是否有元素可以遍历
                System.out.println("元素:"+ it.next()); //获取元素
            }       
            it.next();
            it.next();
            it.remove();  //删除迭代器最后一次返回的元素。 
            //清空集合的元素
            while(it.hasNext()){
                it.next();
                it.remove();
            }       
            System.out.println("集合的元素:"+ c);        
        }   
    }` 
    
    

    6、小练习:使用集合实现注册登陆功能
    ① 提示用户选择功能, A(注册) B(登陆) 。 要求: 功能选择 的时候要忽略大小写。
    ② 注册提示用户输入注册的账号(数字)与密码,如果输入账号已经存在集合中,提示用户重新输入。 注册完毕之后,把集合中的所有用户信息打印出来。
    ③ 登陆提示用户输入登陆的账号与密码,如果账号与密码这个用户已经存在集合中,那么登陆成功,否则登陆失败。

    import java.util.ArrayList;
    import java.util.Collection;
    import java.util.Iterator;
    import java.util.Scanner;
    
    //用户
    class User{ 
        int id;  //账号   
        String password;  //密码
        public int getId() {
            return id;
        }
        public void setId(int id) {
            this.id = id;
        }
        public String getPassword() {
            return password;
        }
        public void setPassword(String password) {
            this.password = password;
        }
        public User(int id, String password) {
            this.id = id;
            this.password = password;
        }   
        @Override
        public boolean equals(Object obj) {
            User user = (User)obj;
            return this.id==user.id;
        }
        @Override
        public String toString() {
            return "{ 账号:"+this.id+" 密码:"+this.password+"}";
        }
    }
    public class Demo20.6 { 
        static Scanner scanner = new Scanner(System.in);    
        static Collection users = new ArrayList(); //使用该集合保存所有的用户信息
        public static void main(String[] args) {        
            while(true){
                System.out.println("请选择功能:A(注册)、B(登陆)");
                String option = scanner.next();
                if("a".equalsIgnoreCase(option)){
                    reg();              
                }else if("b".equalsIgnoreCase(option)){
                    login();                
                }else{
                    System.out.println("你的选择有误,请重新输入");
                }
            }   
        }
        public static void login() {
            System.out.println("请输入账号:");
            int id = scanner.nextInt();
            System.out.println("请输入密码:");
            String password = scanner.next();
            //判断集合的用户是否存在该用户名与密码
            //遍历集合的元素,查看是否存在该用户信息       
            boolean isLogin = false;    //定义变量用于记录是否登陆成功的信息  , 默认是没有登陆成功的
            Iterator it = users.iterator();
            while(it.hasNext()){
                User user = (User) it.next();
                if(user.id==id&&user.password.equals(password)){
                    //存在该用户信息,登陆成功...
                    isLogin = true;
                }
            }   
            if(isLogin==true){
                System.out.println("欢迎登陆...");
            }else{
                System.out.println("用户名或者密码错误,登陆失败...");
            }
        }
        public static void reg() {
            //110  , 220
            User user = null;
            while(true){
                    System.out.println("请输入账号:");
                    int id = scanner.nextInt();  //220 
                    user = new User(id,null);
                    if(users.contains(user)){  // contains底层依赖了equals方法。
                        //如果存在
                        System.out.println("该账号已经存在,请重新输入账号");
                    }else{
                        //不存在
                        break;
                    }
            }       
            System.out.println("请输入密码:");
            String password = scanner.next();
            user.setPassword(password);
            //把user对象保存到集合中
            users.add(user);
            System.out.println("注册成功!");
            System.out.println("当前注册的人员:"+users);
        }
    }
    

    相关文章

      网友评论

          本文标题:我在上海乐字节学习Java基础第二十天(集合)

          本文链接:https://www.haomeiwen.com/subject/tcrabktx.html