【javase复习】## day7 集合Collection ##

集合

为什么要引入集合?

数组:
①只能存储一种类型的数据
②一旦初始化,长度固定。
③元素之间地址连续。

集合: 存储对象数据的容器

优点: 长度会发生变化,对象数据类型任意

————-Collection 集合的根接口
—————————-Set 无序不可重复
—————————-List 有序可重复

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() 

注意 这里判断两个元素是否相同都是用对象的equals方法。输出的时候自然是用对象的toString方法,所以要添加自定义类的时候要重写对象的equals方法,一般重写了equals方法,也要重写Hashcode()方法。

但是equals方法并不是里面应用equals方法,只是一个java的规范

重点学习一下两个迭代方法!

1、toArray()方法,返回一个Object[] 数组
从中取出的变量值能用Object变量接受,如果要用到其他类型的属性,则需要进行类型强转。

举个例子:




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




然后练笔写了一个模仿登录的小程序- -

class User{
    String name;
    String password;
    public User(String name , String password){
        this.name = name;
        this.password= password;

    }

}


public class ccc {
    public static void main(String[] args) {
        Scanner s= new Scanner(System.in);
        Collection c = new ArrayList();
        while(true){
            System.out.println("请选择功能");
            System.out.println("A注册    B登录");


            String msg=s.next();

            if(msg.equalsIgnoreCase("A")){
                System.out.println("注册账号!请输入账号和密码:");
                String a = s.next();
                String b = s.next();
                c.add(new User(a,b));
                System.out.println("注册成功!");
            }

            else if(msg.equalsIgnoreCase("B")){
                System.out.println("用户登录!请输入账号和密码:");
                String a = s.next();
                String b = s.next();
                Object[] objbuf= c.toArray();

                for(int i= 0; i<objbuf.length; i++){
                    User u =(User)objbuf[i];
                    if(a.equals(u.name)&&b.equals(u.password)){
                        System.out.println("登录成功啦!!");
                        break;
                    }
                    if(i==objbuf.length-1)
                        System.out.println("用户名或者密码错误,请重试!");
                }



            }

            else{
                System.out.println("输入有误,请重新输入");
            }

        }
    }
}

可以看出要迭代出容器中的所有元素很麻烦。。。要用Object数组接受,然后迭代数组再强转。。。

引出一个迭代方法!!!

2、 Iterator();迭代方法!!

Iterator()方法: 返回一个迭代器。是一个接口类型
迭代器: 用于抓取集合中的元素 , 获取迭代器的时候,迭代器中有一个指针指向容器中的第一个元素

    Collection c = new ArrayList();
    Iterator it = c.iterator();

这里写图片描述

看到迭代器只有3个方法。

hasNext就不说了吧。。。显而易见。。

每次用next();方法就会抓取一个元素,但是容器中的元素并不会减少,如果抓完了。再抓,就会抛出一个NoSuchElementException异常

每次用remove()方法,就会删除上一次用next返回的元素!!

    public static void main(String[] args) {
        Collection c = new ArrayList();
        c.add("周锦岚");
        c.add("骆溢");
        c.add("大白痴");
        Iterator it = c.iterator();     //获取迭代器
        System.out.println(it.next());   //获取第一个元素
        System.out.println(it.next());   //获取第二个元素
        System.out.println(c);            //打印所有元素   验证next()不删除,只是移动指针
        System.out.println(it.next());     //获取第三个元素
        it.remove();                    // 删除上一次用next返回的元素
        System.out.println(c);           // 再次打印所有元素,验证remove()删除了上一次next返回的元素
        System.out.println(it.next());    // 抓取到头了,抛出异常
    }


结果



周锦岚
骆溢
[周锦岚, 骆溢, 大白痴]
大白痴
[周锦岚, 骆溢]
Exception in thread "main" java.util.NoSuchElementException
    at java.util.ArrayList$Itr.next(ArrayList.java:854)
    at cn.qqq.main(qqq.java:20)



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值