Java基础进阶集合-Collection接口

简介: Java基础进阶集合-Collection接口

关于java.util.Collection接口中常用的方法。


什么是集合?有什么用?


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

1、Collection中能存放什么元素?


没有使用“泛型”之前,Collection中可以存储Object的所有子类型


使用了“泛型”之后,Collection中只能存储某个具体的类型


集合后期学习“泛型”语法。目前先不用管。Collection中什么都能存,


只要是Object的子类型就行。(集合中不能直接存储基本数据类型,也不能存储


java对象,只能存储java对象的内存地址)


2、Collection中的常用方法


boolean add(Object e) 向元素中添加元素


int size() 获取集合中元素的个数


void clear() 清空集合


boolean contians(Object o) 判断当前集合中是否包含元素o,包含返回true,不包含返回false


boolean remove(Object o) 删除集合中的某个元素


boolean isEmpty() 判断该集合中元素的个数是否为0


Object[] toArray() 调用这个方法可以把集合转换成数组



示例代码01:


public class CollectionTest01 {
    public static void main(String[] args) {
        // 创建一个集合对象
        //Collection c = new Collection(); // 接口是抽象的,无法实例化。
        // 多态
        Collection c = new ArrayList();
        c.add(100);//java5新特性,实际上是放进去了对象的内存地址,自动装箱 Integer i = new Integer(100);
        c.add(new Object());
        c.add(new String());
        c.add(true);//自动装箱
        //查看集合里有几个元素
        System.out.println("集合中元素的个数是:" + c.size());
        //清空集合元素
        c.clear();
        System.out.println("集合中元素的个数是:" + c.size());
        //再次向集合中添加元素
        c.add("hello");//实际上存储的是hello字符串对象的内存地址
        c.add("world");
        c.add("绿巨人");
        c.add("浩克");
        c.add(1);
        System.out.println("集合中元素的个数是:" + c.size());
        //查看集合中是否包含该元素
        boolean flag = c.contains("绿巨人");
        System.out.println(flag);//true
        boolean flag2 = c.contains("绿巨人1");
        System.out.println(flag2);//false
        //删除部分集合元素
        c.remove(1);
        System.out.println("集合中元素的个数是:" + c.size());
        //判断集合是否为空
        boolean flag3 = c.isEmpty();
        System.out.println(flag3);//false
        c.clear();
        boolean flag4 = c.isEmpty();
        System.out.println(flag4);//true
        //往集合中添加元素
        c.add("abc");
        c.add("def");
        c.add(100);
        c.add("helloworld");
        c.add(new Student());
        //把集合中转换成数组
        Object[] obj = c.toArray();
        //把转换的数组进行遍历
        for(int i=0;i<obj.length;i++){
            Object o = obj[i];
            System.out.println(o);
//            System.out.println(0.toString());
        }
    }
}
class Student{
}


运行结果:


0a2653c851af460fa595bd959398a8f1.png


3、集合的遍历迭代:


2d65d23f6d4748949b924e4057485923.png


示例代码02:


public class CollectionTest02 {
    public static void main(String[] args) {
        //以下的遍历/迭代是所有Collection通用的一种方式
        //在map集合中不能用。在所有的Collection以及子类中使用
        //创建集合对象
        Collection c = new ArrayList();
        c.add("abc");
        c.add("def");
        c.add(100);
        c.add("helloworld");
        c.add(new Object());
        //对集合Collection进行遍历/迭代
        //第一步:获取集合对象的迭代器对象Iterator
        Iterator it = c.iterator();
        //第二步:通过以上获取的迭代器对象开始迭代/遍历集合
        /*
        * 以下两个方法是迭代器对象Iterator中的方法
        * boolean hasnext()如果仍有元素可以迭代,则返回true
        * Object next() 返回迭代的下一个元素
        * */
        while(it.hasNext()){
            Object o = it.next();
            System.out.println(o);
        }
    }
}


运行结果:


6de278e6d6694ce5bb08e7e842b7e74b.png


示例代码03:


public class CollectionTest03 {
    public static void main(String[] args) {
        //List存储有序可重复的元素,有序(存进去的顺序和取出来的顺序是一致的)
        Collection c1 = new ArrayList();
        c1.add(1);
        c1.add(3);
        c1.add(5);
        c1.add(7);
        c1.add(9);
        c1.add(1);
        Iterator it = c1.iterator();
        while(it.hasNext()){
            Object o = it.next();//存进去的是什么类型,取出的也是什么类型
             /*if(obj instanceof Integer){
                System.out.println("Integer类型");
            }*/
            // 只不过在输出的时候会转换成字符串。因为这里println会调用toString()方法。
            System.out.println(o);
        }
        //set存储无序不可重复的元素,无序(存进去的顺序和取出的顺序不一致)
        Collection c2 = new HashSet();
        c2.add(100);
        c2.add(50);
        c2.add(400);
        c2.add(300);
        c2.add(200);
        c2.add(600);
        c2.add(100);
        c2.add(300);
        Iterator it1 = c2.iterator();
        while(it1.hasNext()){
            Object o = it1.next();
            System.out.println(o);
        }
    }
}


运行结果:


12c3b7f3f8814309a195c64f051d4445.png


4、深入Collection集合的contains方法:


boolean contains(Object o)

判断集合中是否包含某个对象o、

如果包含返回true, 如果不包含返回false。

contains方法是用来判断集合中是否包含某个元素的方法,

那么它在底层是怎么判断集合中是否包含某个元素的呢?


调用了equals方法进行比对。

equals方法返回true,就表示包含这个元素。


示例代码04:


public class CollectionTest04 {
    public static void main(String[] args) {
        Collection c = new ArrayList();
        String s1 = new String("abc");
        c.add(s1);
        String s2 = new String("def");
        c.add(s2);
        String s3 = new String("abc");
        // c集合中是否包含x?结果猜测一下是true还是false?
        System.out.println(c.contains(s3));//判断集合中是否存在"abc" true
    }
}


5、测试contains方法 测试remove方法。

结论:存放在一个集合中的类型,一定要重写equals方法。


示例代码05:


public class CollectionTest05 {
    public static void main(String[] args) {
        Collection c = new ArrayList();
        User u1 =new User("jack");
        c.add(u1);
        // 没有重写equals之前:这个结果是false
        //System.out.println(c.contains(u2)); // false
        // 重写equals方法之后,比较的时候会比较name。
        User u2 = new User("jack");
        System.out.println(c.contains(u2));//true
        Collection cc = new ArrayList();
        String s1 = new String("jack");
        cc.add(s1);
        String s2 = new String("jack");
        c.remove(s2);//remove底层调用equals方法进行比较
        System.out.println(c.size());//0
    }
}
class User{
    private String name;
    public User() {
    }
    public User(String name) {
        this.name = name;
    }
    @Override
    // 重写equals方法
    // 将来调用equals方法的时候,一定是调用这个重写的equals方法。
    // 这个equals方法的比较原理是:只要姓名一样就表示同一个用户。
    //java中默认的equals方法比较的是对象的内存地址
    public boolean equals(Object o) {
       if(o == null || !(o instanceof User)) return false;
       if(this == o) return true;
        User o1 = (User) o;
        return this.name.equals(o1.name);
    }
}


6、集合结构只要发生改变,迭代器必须重新获取。


示例代码06:


public class CollectionTest06 {
    public static void main(String[] args) {
        Collection c = new ArrayList();
        // 注意:此时获取的迭代器,指向的是那是集合中没有元素状态下的迭代器。
        // 一定要注意:集合结构只要发生改变,迭代器必须重新获取。
        // 当集合结构发生了改变,迭代器没有重新获取时,调用next()方法时:java.util.ConcurrentModificationException
        Iterator it = c.iterator();
        c.add("abc");
        c.add("def");
        c.add(100);
        c.add("helloworld");
        while(it.hasNext()){
            // 编写代码时next()方法返回值类型必须是Object。
            Object o = it.next();
            System.out.println(o);
        }
        Collection cc = new ArrayList();
        cc.add("abc");
        cc.add("def");
        cc.add("xyz");
        Iterator it1 = cc.iterator();
        while(it1.hasNext()){
            Object o = it1.next();
            //删除元素
            //删除元素之后,集合的结构发生了变化,应该重新去获取迭代器
            //但是,循环下一次的时候并没有重新获取迭代器,所以会出现异常:java,util,ConcurrentModificationException
            //出异常的根本原因是:集合中元素删除了,但是没有更新迭代器(迭代器不知道集合变化)
            //c.remove(o);//直接通过集合去删除元素,没有通知迭代器。(导致迭代器的快照和原来的集合状态不同)
            //使用迭代器来删除可以吗?
            //迭代器去删除时,会自动更新迭代器,并且更新集合(删除集合中的元素)
            it1.remove();//删除的一定是迭代器指向的当前元素
            System.out.println(o);
        }
    }
}
相关文章
|
1月前
|
Java 大数据 API
Java Stream API:现代集合处理与函数式编程
Java Stream API:现代集合处理与函数式编程
193 100
|
1月前
|
Java API 数据处理
Java Stream API:现代集合处理新方式
Java Stream API:现代集合处理新方式
215 101
|
1月前
|
算法 Java
50道java集合面试题
50道 java 集合面试题
|
19天前
|
存储 算法 安全
Java集合框架:理解类型多样性与限制
总之,在 Java 题材中正确地应对多样化与约束条件要求开发人员深入理解面向对象原则、范式编程思想以及JVM工作机理等核心知识点。通过精心设计与周密规划能够有效地利用 Java 高级特征打造出既健壮又灵活易维护系统软件产品。
51 7
|
17天前
|
Java Go 开发工具
【Java】(9)抽象类、接口、内部的运用与作用分析,枚举类型的使用
抽象类必须使用abstract修饰符来修饰,抽象方法也必须使用abstract修饰符来修饰,抽象方法不能有方法体。抽象类不能被实例化,无法使用new关键字来调用抽象类的构造器创建抽象类的实例。抽象类可以包含成员变量、方法(普通方法和抽象方法都可以)、构造器、初始化块、内部类(接 口、枚举)5种成分。抽象类的构造器不能用于创建实例,主要是用于被其子类调用。抽象类中不一定包含抽象方法,但是有抽象方法的类必定是抽象类abstract static不能同时修饰一个方法。
159 1
|
27天前
|
算法 安全 Java
除了类,Java中的接口和方法也可以使用泛型吗?
除了类,Java中的接口和方法也可以使用泛型吗?
82 11
|
1月前
|
存储 Java Go
对比Java学习Go——函数、集合和OOP
Go语言的函数支持声明与调用,具备多返回值、命名返回值等特性,结合`func`关键字与类型后置语法,使函数定义简洁直观。函数可作为一等公民传递、赋值或作为参数,支持匿名函数与闭包。Go通过组合与接口实现面向对象编程,结构体定义数据,方法定义行为,接口实现多态,体现了Go语言的简洁与高效设计。
|
2月前
|
存储 缓存 安全
Java集合框架(二):Set接口与哈希表原理
本文深入解析Java中Set集合的工作原理及其实现机制,涵盖HashSet、LinkedHashSet和TreeSet三大实现类。从Set接口的特性出发,对比List理解去重机制,并详解哈希表原理、hashCode与equals方法的作用。进一步剖析HashSet的底层HashMap实现、LinkedHashSet的双向链表维护顺序特性,以及TreeSet基于红黑树的排序功能。文章还包含性能对比、自定义对象去重、集合运算实战和线程安全方案,帮助读者全面掌握Set的应用与选择策略。
188 23
|
2月前
|
存储 缓存 安全
Java集合框架(三):Map体系与ConcurrentHashMap
本文深入解析Java中Map接口体系及其实现类,包括HashMap、ConcurrentHashMap等的工作原理与线程安全机制。内容涵盖哈希冲突解决、扩容策略、并发优化,以及不同Map实现的适用场景,助你掌握高并发编程核心技巧。
|
2月前
|
存储 NoSQL Java
Java Stream API:集合操作与并行处理
Stream API 是 Java 8 提供的集合处理工具,通过声明式编程简化数据操作。它支持链式调用、延迟执行和并行处理,能够高效实现过滤、转换、聚合等操作,提升代码可读性和性能。