java基础

java基础-day15-集合和Object

2021-06-27  本文已影响0人  触手不可及

集合和Object

1. 集合

1.1 为什么要使用集合
在这之前,能够处理大量数据的唯一方式是数组存储,和对应数组的一系列方法。
数组操作的弊端:
    1. 【数据类型一致化】 --> 会导致数组处理的数据类型相对单一,不同情况下需要处理的数据时不一样。
    2. 【数组容量确定】 --> 会导致数组操作的不便性,不管是数据的扩容还是数据的缩容,都会导致大量的内存空间浪费和时间浪费。
    3. 【方法太少】 --> 会导致数组操作方式过程繁琐,并且方法普适性过差。程序猿开发效率过低。
    
这就是集合解决的问题
    1. 【数据类型一致化】 --> 集合中使用泛型来解决数据类型一致化问题,第一满足数据多样性,第二约束之后一致化。
    2. 【容量可变】 --> 集合存储数据容量可以发生变化。可增可减,润物细无声。
    3. 【方法要抄】 --> 集合配套方法众多,基本样式 增删改查。
1.2 集合结构简述
interface Collection<E> 
    Java中所有集合的总接口,规定了集合的基本操作方法和继承的其他接口。
--| interface List<E> 特征: 有序,可重复
----| class ArrayList<E> 可变长数组【常用】 
----| class LinkedList<E> 底层是一个双向链表结构【常用】
----| class Vector<E> 【线程安全】可变长数组,JDK1.0产物,效率较低
    
--| interface Set<E>
    特征: 无序,不可重复
----| class HashSet<E> 底层存储数据的结构是一个【哈希表】,存储效率和查询效率极
                       高
----| class TreeSet<E> 底层存储数据的结构是一个【二叉树】
1.3 集合常用方法
Collection<E> 常用方法
增
    boolean add(E e);
        在集合中添加当前集合要求数据类型数据
    boolean addAll(Collection<? extends E> c);
        在集合中添加另一个集合对象,要求传入参数集合中保存的数据类型是E类型本身或
        者E类型的子类对象。
        
删
    remove(Object obj);
        删除集合中的指定元素。
    removeAll(Collection<?> c);
        删除两个集合的交集,要求传入参数集合中保存数据类型不限制。
    retainAll(Collection<?> c);
        保留两个集合的交集。要求传入参数集合中保存数据类型不限制。
    clear();
        清空整个集合元素。
查
    int size();
        有效元素个数
    boolean isEmpty();
        判断当前集合是否为空,如果为空返回true
    boolean contains(Object obj);
        判断传入参数是否在当前集合中存在
    boolean containsAll(Collection<?> c);
        判断传入参数集合是不是当前集合的子集合
    Object[] toArray();
        返回集合中所有元素的Object数组
【补充知识点 泛型的上限】
<? extends E>
?
    通配符
extends 
    继承
E
    泛型占位符

? extends E
    E ==> Animal
    Dog extends Animal
    SingleDog extends Animal
    Cat extends Animal      

? extends E 是约束当前数据类型上限,要求数据类型是E类型本身,或者是E类型的子类
1.4 Iterator 迭代器
1.4.1 迭代器图例
迭代器图例.png
1.4.2 迭代器涉及到的方法
interface Iterator<E> 接口

通过集合对象获取迭代器对象 Iterator<E> 接口实现类对象
    Iterator<E> iterator();

Iterator<E> 接口中常用方法
    boolean hasNext();
        是否可以提取当前迭代器指向元素
    E next();
        获取迭代器指向元素,并且指向下一个元素
        1. 取出元素 2. 跳转到下一个元素
    void remove();
        坑
        【注意】
            1. remove方法有且只能删除通过next方法获取到的元素
            2. remove方法如果需要调用,前面必须有next方法,并且是隔壁老王关
            系。中间不能再用其他的remove

2. Object类

2.1 Object类到底是个啥
    Object类是Java中所有类的基类,Java中所有类都是Object类的直接子类或者间接子类。
    Java中万物皆对象 ==> 【Object】
    
    Object类内存在一些方法,这些方法可以提供给Java中所有类使用
    今天学习:
        String toString(); Alt + Shift + S
        boolean equals(Object obj); 【贼重要】
        int hashCode(); 【贼重要】
    
    和线程相关的方法:
        wait();
        notify();
        notifyAll();   
2.2 String toString()方法介绍
    是针对于当前类对象,指定数据内容作出String字符串返回。
    如果当前代码中对于当前类对象存在【字符串期望】,那么就会调用当前类内的toString方法。
    Arrays.toString(); ==> String 
    Thread线程 ==> toString [ThreadName, ThreadPriority, ThreadGroup]
    
    Eclipse: Alt + Shift + S ==> toString
    IDEA: Alt + insert ==> toString
2.3 equals方法
2.3.1 equals方法功能概述
equals方法
    public boolean equals(Object obj);
    通过类对象调用
        a.equals(b); 判断a对象和b对象是否是同一个对象。

在Object原码中equals方法比较原则
    原码中是将调用方法的对象和传入参数对象的空间首地址进行比较,地址一致,为同一个对象,地址不同是不同对象
    return (this == obj);
2.3.2 equals方法重写期望
/*                                                  
 *  我们期望以下两个对象是同一个对象,因为其中保存的数据内容是一致               
 *  But现在通过目前Object类内的equals方法进行比较判断,两个对象           
 *  非同一个对象,因为空间首地址不同                                
 */                                                 
                                                    
SingleDog singleDog6 = new SingleDog(6, "韦小宝", '男');
SingleDog singleDog7 = new SingleDog(6, "韦小宝", '男');
2.3.3 equals方法重写流程
1. 如果调用当前方法的对象和传入参数对象是同一个对象,也就是空间首地址一致,这里无需其他判断,直接返回true

2. 这里需要一个判定
    a. 当前传入参数对象不为null
    b. 当前传入参数对象和调用方法类对象为同一个类型对象。

3. 这里需要对比两个对象的数据内容是否一致。
@Override
public boolean equals(Object obj) {
    // 如果传入参数对象和调用方法对象空间首地址一致,那么为同一个对象
    if (this == obj) {
        return true;
    }
    
    /*
     * a. 当前传入参数对象不为null
     * b. 当前传入参数对象和调用方法类对象为同一个类型对象。
     * 
     * 对象 instanceof 类名
     *      该关键字判断左侧的对象是不是当前右侧类名的对象。
     */
    if (null == obj || !(obj instanceof SingleDog)) {
        return false;
    }
    
    /*
     * 以上两个条件已过,可以保证
     *      1. 当前比较的两个对象非同地址对象
     *      2. 当前两个对象是同数据类型对象
     * 
     * Object obj参数实际保存的数据类型是一个SingleDog类对象。
     */
    SingleDog temp = (SingleDog) obj;
    
    return this.id == temp.id
            /*
             * 1. String类型比较两个字符串是否一致,【一定要使用equals方法】String方法针对字符串比较
             * 方式对equals进行了重写操作,比较的是字符串内容
             * 2. 同名方法出现的情况下,不要慌!!!明确当前方法的调用者到底是那个对象,那个类!!!
             */
            && this.name.equals(temp.name)
            && this.gender == temp.gender;
}
2.4 hashCode方法
2.4.1 hashCode方法功能概述
    hashCode方法默认情况下是获取当前类对象在内存空间首地址的十进制展示方法。hashCode实际上是当前类对象在程序运行过程中的【唯一索引标记/身份证号】
    
Java中的规定:
    如果两个对象equals方法比较结果为true,强制要求这里两个对象的hashCode值一致!!!
2.4.2 hashCode重写
要求so easy
    Object工具类
    int Objects.hash(Object... args);
        ...不定长参数 这里要求参数类型是Object类型,个数不限
        传入参数形式:
            Objects.hash(name, age, gender);
            
            Object[] arr = {name, age, gender};
            Objects.hash(arr);
@Override
public int hashCode() {
    return Objects.hash(id, name, gender);
}
上一篇 下一篇

猜你喜欢

热点阅读