JavaDay19—p184-p199—集合——remove和contains底层调用equals方法(equals有时要重写)

1、什么是集合?有什么用?

数组其实就是一个集合。集合实际上就是一个容器。可以来容纳其它类型的数据。

1.1.集合为什么说在开发中使用较多?

集合是一个容器,是一个载体,可以一次容纳多个对象。

  •   在实际开发中,假设连接数据库,数据库当中有10条记录,
      那么假设把这10条记录查询出来,在java程序中会将10条数据封装成10个java对象,
      然后将10个java对象放到某一个集合当中,
      将集合传到前端,然后遍历集合,将一个数据一个数据展现出来。
    
1.2、集合不能直接存储基本数据类型,另外集合也不能直接存储java对象,

集合当中存储的都是java对象的内存地址。(或者说集合中存储的是引用。)

  •   list.add(100); //自动装箱Integer
      注意:
      	集合在java中本身是一个容器,是一个对象。
      	集合中任何时候存储的都是“引用”。
    
1.3、在java中每一个不同的集合,底层会对应不同的数据结构。往不同的集合中

存储元素,等于将数据放到了不同的数据结构当中。

  • 什么是数据结构?

  •   数据存储的结构就是数据结构。不同的数据结构,数据存储方式不同。例如:
      数组、二叉树、链表、哈希表...
      以上这些都是常见的数据结构。
    
      你使用不同的集合等同于使用了不同的数据结构。
    
  • java中你需要掌握的不是精通数据结构。java中已经将数据结构实现了,已经写好了这些常用的集合类,你只需要掌握怎么用?在什么情况下选择哪一种合适的集合去使用即可。

    new ArrayList(); 创建一个集合,底层是数组。
    new LinkedList(); 创建一个集合对象,底层是链表。
    new TreeSet(); 创建一个集合对象,底层是二叉树。
    .....
    
1.4、集合在java JDK中哪个包下?
	java.util.*;
	所有的集合类和集合接口都在java.util包下。
1.5、为了让大家掌握集合这块的内容,最好能将集合的继承结构图背会!!!
  • Collection
    在这里插入图片描述
  • Map
    在这里插入图片描述
1.6、在java中集合分为两大类:
  •   一类是单个方式存储元素:
      单个方式存储元素,这一类集合中超级父接口:java.util.Collection;
    
  •   一类是以键值对儿的方式存储元素
      	以键值对的方式存储元素,这一类集合中超级父接口:java.util.Map;
    
1.7.Collection常用方法
  • xx.add(Object e);//加入集合元素
  • xx.size();集合大小
  • xx.clear();//清空
  • xx.contains(Object e);//测试集合中是否包含e
  • xx.remove(Object e);//从集合中移除e
1.8.获取迭代器—与—重新获取迭代器
  •   Iterator i1=xx.iterator();//获取迭代器
    
注意:当集合发生改变时,eg:xx.add(Object e)、xx.remove(Object e);必须重新获取迭代器,否则报错
2、总结重点:
  • 一:把集合继承结构图背会。

  • 二:把Collection接口中常用方法测试几遍。

  • 三:把迭代器弄明白。

  • 四:Collection接口中的remove方法和contains方法底层都会调用equals,

3.案例程序
注意分析,重写equals的部分。

执行结果:
在这里插入图片描述

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

public class SetTest {
    public static void main(String[] args) {
        Collection c1=new ArrayList();

        for (int i=0;i<10;i++){
            c1.add(i);  /**向集合添加元素**/

        }

        Object[] obj1=c1.toArray(); /****集合中的元素返回存储到数组**/
        System.out.print("c1.toArray()数组输出元素:");
        for (int i=0;i<c1.size();i++){
            System.out.print(obj1[i]+",");
        }

        System.out.println();
        System.out.println("c1.size():"+c1.size()); /***集合的大小**/
        System.out.println("c1.contains():"+c1.contains(1));/***是否包含元素1**/

        c1.remove(1);  /*****移除元素1***/
        System.out.println("c1.contains():"+c1.contains(1));/***是否包含元素1**/
        System.out.println("c1.size():"+c1.size()); /***集合的大小**/
        System.out.println("c1.isEmpty():"+c1.isEmpty());/***集合是否为空**/

        System.out.print("迭代器Iterator的i1.hasNext()、i1.next()输出元素:");
        Iterator i1=c1.iterator();
        while (i1.hasNext()){  /**先判断下一个是否还有?*****/
            Object obj2=i1.next();/****返回下一个元素****/
            System.out.print(obj2+",");/**输出*/
        }
        System.out.println();


        /*****Collection接口中的remove方法和contains方法底层都会调用equals,需要重写equals方法****/


        User u1=new User("jack");
        User u2=new User("jack");

        /***注意此处添加的是u1**/
        c1.add(u1);

 /**1、*//******重写equals方法,是为了让contains在调用底层equals时,比较对象的内容,而不是比较对象的内存地址*
         *执行c1.contains(u2)时,它会因为u1和u2内容相同,而返回true
         * 如果不重写equals就会返回false
         * */
        System.out.println("重写equals方法,After c1.add(u1),c1.contains(u2)?:"+c1.contains(u2));/**返回true*/

/**2、*//***调用迭代器,输出集合中的元素,String类型的对象,需要在该类中重写toString()方法**/
        System.out.print("迭代器Iterator的i2.hasNext()、i2.next()输出元素:");
        Iterator i2=c1.iterator();
        while (i2.hasNext()){  /**先判断下一个是否还有?*****/
            Object obj2=i2.next();/****返回下一个元素****/
            System.out.print(obj2+",");/**输出*/
        }
        System.out.println();

/**3、*//******重写equals方法,也让remove在调用底层equals时,删除内容相同的对象,而不是按内存地址删除对象
         * 所以c1.remove可以删除对象u1,因为两者内容相同
         * **/
        c1.remove(u2);
        System.out.print("重写equals方法,After c1.remove(u2),迭代器Iterator的i3.hasNext()、i3.next()输出元素:");
        Iterator i3=c1.iterator();
        while (i3.hasNext()){  /**先判断下一个是否还有?*****/
            Object obj2=i3.next();/****返回下一个元素****/
            System.out.print(obj2+",");/**输出*/
        }
        System.out.println();

        c1.clear();/***清空集合**/
        System.out.println("c1.isEmpty():"+c1.isEmpty());/***集合是否为空**/

    }
}

class User{
    private String name;

    public User() {
    }
    public User(String name) {
        this.name = name;
    }

    /**1、重写equals方法*/
    public boolean equals(Object obj){
        if (null==obj || !(obj instanceof User)){
            return false;
        }
        if (obj==this)
            return true;

        return ((User) obj).name.equals(this.name);
    }
    /**2、重写toString()方法*/
    public String toString(){
        return this.name;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值