关于Collection接口声明中方法的使用

1、为什么要使用集合?

面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,就对对象进行存储,集合就是存储对象最常用的方式。集合只用于存储对象,集合长度是可变的,集合可以存储不同类型的变量。

2、关注各种方法的使用

①其中add()方法中的参数类型为Object类型,方便接受各种不同数据类型的数据。

②值的注意的是contains()方法,当其中参数为自定义对象时,需要在自定义类中重写equals()方法,因为contains()方法中是通过equals()方法比较的对象内容,在其他参数传入是,例如int等基本数据类型会自动装箱为包装类,而包装类中已经重写了equals()方法,同样传入的String类型数据对象也在String类中重写了equals()方法,所以,在自定义类中需要将equals()对象重写,否则会默认比较地址,从而产生不符合预期的操作结果。

Person类:

package com.maweirdos.java0517;

import java.util.Objects;

/**
 * @author MaWeirdos
 * @create 2022-05-17 10:44
 */
public class Person {
    private String name;
    private int age;

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

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Person person = (Person) o;
        return age == person.age &&
                Objects.equals(name, person.name);
    }


}

测试类:

 @Test
    public void test(){
        Collection coll = new ArrayList();
        coll.add(123);
        coll.add("李明");
        coll.add(new String("Tom"));
        coll.add(new Person("jim",12));

        boolean s1 = coll.contains(new Person("jim",12));
        System.out.println(s1);
    }

若Person类中没有重写equals()方法,则打印s1则会显示false,重写equals()方法后,s1打印结果为true。

③asList()方法也是值得注意的点:

为什么使用asList()将需要转换的数组作为 asList 方法的参数,再判断其size大小得到的不是我们想要的答案?

        asList() 方法的参数必须是对象或者对象数组,而原生的基本数据类型不是对象——这也正是包装类出现的一个主要原因。当传入一个原生数据类型数组时,asList 的真正得到的参数就不是数组中的元素,而是数组对象本身!此时List 的唯一元素就是这个数组。

为什么asList不支持动态扩容?

        asList 方法后面,有这样一个内部类也叫 ArrayList,更重要的是在这个内部类中有一个被声明为 final 的数组 a,所有传入的元素都会被保存在这个数组a中。到此,谜底揭晓了: asList 方法返回的确实是一个 ArrayList ,但这个 ArrayList 并不是java.util.ArrayList,而是 java.util.Arrays的一个内部类。这个内部类用一个 final 数组来保存元素,因此用 asList 方法产生的 ArrayList是不可修改大小的。

④iterator接口,一个专门用来遍历集合元素的接口

首先问题:为什么创建Collection对象后可以直接调用iterator()方法?答:集合中已经实现了iterator接口,例如在ArrayList集合中继承了AbstractList,其中AbstractList中实现了iterator接口。

iterator中的hasNext() 和 next()可以通过指针理解,默认游标都在集合元素之前,类似于在头指针位置。两个联合使用来遍历集合元素:

 while(iterator.hasNext()){
            //next():①指针下移 ②将下移以后集合位置上的元素返回
            System.out.println(iterator.next());
        }

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值