java基础学习15(Collection、迭代器)

Collection

所有集合的顶层接口,不能被实例化。

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

集合与数组相比存在的优势?

  • 相对数组而言集合并没有长度限制
  • 相对数组而言集合并没有类型限制

Collection中常用的函数
增加
add(E e) 添加成功返回true,添加 失败返回false.
addAll(Collection c) 把一个集合的元素添加到另外一个集合中去。

class Person{
    private String name;
    private String cardId;

    public Person() {
    }

    public Person(String cardId,String name) {
        this.name = name;
        this.cardId = cardId;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getCardId() {
        return cardId;
    }

    public void setCardId(String cardId) {
        this.cardId = cardId;
    }

    @Override
    public String toString() {
        return "id:"+this.cardId+",name:"+this.name;
    }
}

public class Test {

    public static void main(String[] args)  {
        Collection c1 = new ArrayList();
        c1.add(new Person("1","张三"));
        c1.add(new Person("2","李四"));
        c1.add(new Person("3","王二"));
        boolean res = c1.add(new Person("4","麻子"));
        System.out.println(res);

        Iterator iterator = c1.iterator();
        while (iterator.hasNext()){
            System.out.println(iterator.next());
        }

        System.out.println("======================================");
        Collection c2 = new ArrayList();
        c2.addAll(c1);
        c2.add(new Person("5","大刀王五"));
        Iterator iterator2 = c2.iterator();
        while (iterator2.hasNext()){
            System.out.println(iterator2.next());
        }
    }
}
结果如下:
true
id:1,name:张三
id:2,name:李四
id:3,name:王二
id:4,name:麻子
======================================
id:1,name:张三
id:2,name:李四
id:3,name:王二
id:4,name:麻子
id:5,name:大刀王五

删除
clear() 从此集合中删除所有元素
remove(Object o) 从该集合中删除指定元素的单个实例(如果存在)
removeAll(Collection c) 删除两个集合的交集元素
retainAll(Collection c) 保留两个集合的交集元素,其他的元素一并删除。

class Person{
    private String name;
    private String cardId;

    public Person() {
    }

    public Person(String cardId,String name) {
        this.name = name;
        this.cardId = cardId;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getCardId() {
        return cardId;
    }

    public void setCardId(String cardId) {
        this.cardId = cardId;
    }

    @Override
    public String toString() {
        return "id:"+this.cardId+",name:"+this.name;
    }
}

public class Test {

    public static void main(String[] args)  {
        Person p1 = new Person("1","张三");
        Person p2 = new Person("2","李四");
        Person p3 = new Person("3","王二");
        Person p4 = new Person("4","二狗");

        Collection c1 = new ArrayList();
        c1.add(p1);
        c1.add(p2);
        c1.add(p3);

        //clear
//        c1.clear();
//        System.out.println(c1.size());


        Collection c2 = new ArrayList();
        c2.add(p1);
        c2.add(p2);
        c2.add(p3);

        //执行remove
//      c2.remove(p3);


//       c2.removeAll(c1);

        //执行retainAll
        c2.add(p4);
        c2.retainAll(c1);
        
        Iterator i2 = c2.iterator();
        while (i2.hasNext()){
            System.out.println(i2.next());
        }
    }
}    

查看
size() 返回此集合中的元素数

判断
isEmpty() 如果此集合不包含元素,则返回 true
contains(Object o) 如果此集合包含指定的元素,则返回 true 。
containsAll(Collection<?> c) 如果此集合包含指定 集合中的所有元素,则返回true。

class Person{
    private String name;
    private String cardId;

    public Person() {
    }

    public Person(String cardId,String name) {
        this.name = name;
        this.cardId = cardId;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getCardId() {
        return cardId;
    }

    public void setCardId(String cardId) {
        this.cardId = cardId;
    }

    @Override
    public String toString() {
        return "id:"+this.cardId+",name:"+this.name;
    }
}

public class Test {

    public static void main(String[] args)  {
        Person p1 = new Person("1","张三");
        Person p2 = new Person("2","李四");
        Person p3 = new Person("3","王二");
        Person p4 = new Person("4","二狗");

        Collection c1 = new ArrayList();
        c1.add(p1);
        c1.add(p2);
        c1.add(p3);


        Collection c2 = new ArrayList();
        c2.add(p1);
        c2.add(p2);
        c2.add(p3);
        c2.add(p4);

        System.out.println(c2.contains(p4));//true
        System.out.println(c2.containsAll(c1));//true
    }
}    

调用contains时我们发现,重写了equals后下面代码访问true,不重写返回false,代码如下:

class Person{
    private String name;
    private String cardId;

    public Person() {
    }

    public Person(String cardId,String name) {
        this.name = name;
        this.cardId = cardId;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getCardId() {
        return cardId;
    }

    public void setCardId(String cardId) {
        this.cardId = cardId;
    }

    @Override
    public String toString() {
        return "id:"+this.cardId+",name:"+this.name;
    }

    @Override
    public boolean equals(Object obj) {
        Person p = (Person)obj;
        return p.cardId == this.cardId;
    }
}

public class Test {

    public static void main(String[] args)  {
        Person p1 = new Person("1","张三");
        Person p2 = new Person("2","李四");
        Person p3 = new Person("3","王二");
        Person p4 = new Person("4","二狗");

        Collection c1 = new ArrayList();
        c1.add(p1);
        c1.add(p2);
        c1.add(p3);


        System.out.println(c1.contains(new Person("4","二狗")));
    }

按住ctrl键点击contains进入List.class是一个接口,其中有的一个抽象方法 boolean contains(Object o);他实际上调用的contains方法是ArrayList类中重新的contains方法

 public boolean contains(Object o) {
        return indexOf(o) >= 0;
    }

点击indexOf进入ArrayList类中indexOf方法

    public int indexOf(Object o) {
        if (o == null) {
            for (int i = 0; i < size; i++)
                if (elementData[i]==null)
                    return i;
        } else {
            for (int i = 0; i < size; i++)
                if (o.equals(elementData[i]))
                    return i;
        }
        return -1;
    }

我们看到Object o会调用equals方法,但是Person中并没有重新equals方法,所以最后调用的是Object中的equals方法,我们知道Object的equals比较的是内存地址,所以当你重写了Person的equals与不重写该函数返回值在这中情况下肯定不是一样的

迭代
toArray() 返回一个包含此集合中所有元素的数组。
iterator() 返回此集合中的元素的迭代器。

迭代器

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

迭代器的方法:

  • hasNext() 问是否有元素可遍历。如果有元素可以遍历,返回true,否则返回false 。
  • next() 获取元素
  • remove() 移除迭代器最后一次返回 的元素。

使用时常见报错
NoSuchElementException 没有元素的异常,出现的原因: 没有元素可以被迭代了。

class Demo2 {

    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.println(arr[i]);
		}

        System.out.println("================================");

		//要求使用iterator迭代器遍历。
        Iterator it = c.iterator();  //返回一个迭代器    疑问:iterator()方法返回的是一个接口类型,为什么接口又可以调用方法可以使用呢?  iterator 实际 上返回的是iterator接口的实现类对象。
        //清空集合 的元素
        while(it.hasNext()){
            System.out.println(it.next());
            //it.remove();
        }
    }

}

迭代器的原理
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值