Java 集合类学习之Collection

一、数组和集合的区别与联系


package com.fish.collection;
/*
 
数组: 存储同一种数据类型的集合容器.
数组的特点:
1. 只能存储同一种数据类型的数据。
2. 一旦初始化,长度固定。 
3. 数组中的元素与元素之间的内存地址是连续的。
注意: Object类型的数组可以存储任意类型的数据。 
 
 需求: 收集班级同学的兴趣爱好。
 
 数组存储兴趣爱好:
 String[] arr= new String[1000];
 
 
 
 */
    public class Demo1 {
        public static void main(String[] args) {
            Object[] arr = new Object[10];
            arr[1] = "abc";
            arr[2] = 'a';
            arr[3]  = 12;
    }
}


二、集合方法

package com.fish.collection;
import java.util.ArrayList;
import java.util.Collection;
/*

集合:集合是存储对象数据的集合容器。
 
集合比数组的优势:
1. 集合可以存储任意类型的对象数据,数组只能存储同一种数据类型的数据。
2. 集合的长度是会发生变化的,数组的长度是固定的。
 
-------| Collection  单例集合的跟接口。 
 ----------| List  如果是实现了List接口的集合类,具备的特点: 有序,可重复。
 ----------| Set   如果是实现了Set接口的集合类,具备特点: 无序,不可重复。
Collection接口中的方法:
        增加
            add(E e)  添加成功返回true,添加 失败返回false.
            addAll(Collection c)  把一个集合 的元素添加到另外一个集合中去。
        删除
            clear() 
            remove(Object o) 
            removeAll(Collection  c) 
            retainAll(Collection  c) 
        查看
            size() 
        判断
            isEmpty() 
            contains(Object o) 
            containsAll(Collection<?> c) 
        迭代
            toArray() 
            iterator() 
*/

 
public class Demo2 {
    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("李四");
        c2.add("王朝");
        c.addAll(c2); // 把c2的元素的添加到c集合 中去。 [张三, 李四, 王五, 赵六, 张三, 李四, 王朝]
        /*
         删除方法:
        c.clear(); //clear()清空集合中的元素
        System.out.println("删除成功吗?"+c.remove("张三"));  // remove 指定集合中的元素删除,删除成功返回true,删除失败返回false.
        c.removeAll(c2); //删除c集合中与c2的交集元素。c2集合不会发生变化
        c.retainAll(c2); //保留c集合与c2的交集元素,其他的元素一并删除。c2集合不会发生变化
        */
        System.out.println("查看元素个数:"+c.size());
        System.out.println("集合的元素:"+ c);
    }
}


package com.fish.collection;
import java.util.ArrayList;
import java.util.Collection;

/*
    判断
    isEmpty() 
    contains(Object o) 
    containsAll(Collection<?> c)
*/


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;
        }
    }
    
    class Dog{
    
    }
    
    public class Demo3 {
        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 c = new ArrayList();
            c.add(new Person(110,"狗娃"));
            c.add(new Person(119,"狗剩"));
            c.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("c集合有包含c2集合中的所有元素吗?"+ c.containsAll(c2)); //调用的是传入对象的equal方法
            
            //如果在现实生活中,只要***编号一致,那么就为同一个人。
            
             System.out.println("存在该元素吗?"+c.contains(new Person(120,"陈铁蛋"))); // 其实contains方法内部是依赖于equals方法进行比较的。
            System.out.println("集合的元素:"+ c);
        }
}



package com.fish.collection;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
/*
迭代
toArray()  把集合中的元素全部 存储到一个Object的数组中返回。
*/
public class Demo4 {
    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 c = new ArrayList();
        c.add(new Person(110,"狗娃"));
        c.add(new Person(119,"狗剩"));
        c.add(new Person(120,"铁蛋"));
        Object[] arr = c.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);
            }
        }
    }
}


package com.fish.collection;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
/*
------| Collection 单例集合的根接口
----------| List  如果是实现了 List接口的集合类,该集合类具备 的特点: 有序、可重复。
----------| Set   如果是实现了Set接口的集合类,该集合具备的特点: 无序,不可 重复。
 
Collection---迭代的方法:
toArray() 
iterator()
迭代器的作用:就是用于抓取集合中的元素。
迭代器的方法:
hasNext()   问是否有元素可遍历。如果有元素可以遍历,返回true,否则返回false 。
          
 next()    获取元素...
    
        
 remove()  移除迭代器最后一次返回 的元素。
NoSuchElementException 没有元素的异常。 
出现的原因: 没有元素可以被迭代了。。。
 */
 
 
public class Demo5 {
    public static void main(String[] args) {
        Collection c = new ArrayList();
        c.add("狗娃");
        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);
    }
}


练习

package com.fish.collelction;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.Scanner;
/*
 
作业2:使用集合实现注册登陆功能,
第一步: 提示用户选择功能, A(注册)  B(登陆) 。 要求: 功能选择 的时候要忽略大小写。
注册:
1. 提示用户输入注册的账号(数字)与密码,如果输入账号已经存在集合中,提示用户重新输入。 注册完毕之后,把集合中的所有用户信息打印出来。(使用:toArrry()方法)
登陆: 
提示用户输入登陆的账号与密码,如果账号与密码这个用户已经存在集合中,那么登陆成功,否则登陆失败。
 
 
 
 */
//用户
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 Demo1 {
    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);
    }
}


总结:

1、遍历一个容器判断元素释放满足某个条件的问题,一般都用标志位来解决

2、要回到前面的代码,要用到循环

3、每一个方法写一个功能,这样很清晰


package com.fish.collelction;

interface  Money{
        public void makeMoney();
}


class Worker implements Money{
        @Override
        public void makeMoney() {
            System.out.println("工人在赚钱...");
        }
}


class Student implements Money{
        @Override
        public void makeMoney() {
        // TODO Auto-generated method stub
        }
}
    
    
public class Demo3 {
    public static void main(String[] args) {
        Money  m = test();
        m.makeMoney();
    }
    public static Money test(){  #test方法的是一个接口,而不是一个具体的实现,这样的目的是为了后期维护方便
        return new Worker();
    }
}


本文出自 “小鱼的博客” 博客,谢绝转载!

你可能感兴趣的:(ja)