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);
        }
    }
}
相关文章
|
14天前
|
JSON Java Apache
非常实用的Http应用框架,杜绝Java Http 接口对接繁琐编程
UniHttp 是一个声明式的 HTTP 接口对接框架,帮助开发者快速对接第三方 HTTP 接口。通过 @HttpApi 注解定义接口,使用 @GetHttpInterface 和 @PostHttpInterface 等注解配置请求方法和参数。支持自定义代理逻辑、全局请求参数、错误处理和连接池配置,提高代码的内聚性和可读性。
|
5天前
|
Java
在Java中,接口之间可以继承吗?
接口继承是一种重要的机制,它允许一个接口从另一个或多个接口继承方法和常量。
23 1
|
15天前
|
Java
Java 8 引入的 Streams 功能强大,提供了一种简洁高效的处理数据集合的方式
Java 8 引入的 Streams 功能强大,提供了一种简洁高效的处理数据集合的方式。本文介绍了 Streams 的基本概念和使用方法,包括创建 Streams、中间操作和终端操作,并通过多个案例详细解析了过滤、映射、归并、排序、分组和并行处理等操作,帮助读者更好地理解和掌握这一重要特性。
25 2
|
14天前
|
安全 Java
Java多线程集合类
本文介绍了Java中线程安全的问题及解决方案。通过示例代码展示了使用`CopyOnWriteArrayList`、`CopyOnWriteArraySet`和`ConcurrentHashMap`来解决多线程环境下集合操作的线程安全问题。这些类通过不同的机制确保了线程安全,提高了并发性能。
|
19天前
|
存储 Java
判断一个元素是否在 Java 中的 Set 集合中
【10月更文挑战第30天】使用`contains()`方法可以方便快捷地判断一个元素是否在Java中的`Set`集合中,但对于自定义对象,需要注意重写`equals()`方法以确保正确的判断结果,同时根据具体的性能需求选择合适的`Set`实现类。
|
15天前
|
Java
java线程接口
Thread的构造方法创建对象的时候传入了Runnable接口的对象 ,Runnable接口对象重写run方法相当于指定线程任务,创建线程的时候绑定了该线程对象要干的任务。 Runnable的对象称之为:线程任务对象 不是线程对象 必须要交给Thread线程对象。 通过Thread的构造方法, 就可以把任务对象Runnable,绑定到Thread对象中, 将来执行start方法,就会自动执行Runable实现类对象中的run里面的内容。
32 1
|
21天前
|
Java 开发者
在Java多线程编程的世界里,Lock接口正逐渐成为高手们的首选,取代了传统的synchronized关键字
在Java多线程编程的世界里,Lock接口正逐渐成为高手们的首选,取代了传统的synchronized关键字
44 4
|
19天前
|
存储 Java 开发者
在 Java 中,如何遍历一个 Set 集合?
【10月更文挑战第30天】开发者可以根据具体的需求和代码风格选择合适的遍历方式。增强for循环简洁直观,适用于大多数简单的遍历场景;迭代器则更加灵活,可在遍历过程中进行更多复杂的操作;而Lambda表达式和`forEach`方法则提供了一种更简洁的函数式编程风格的遍历方式。
|
19天前
|
Java 开发者
|
19天前
|
存储 Java 开发者
Java中的集合框架深入解析
【10月更文挑战第32天】本文旨在为读者揭开Java集合框架的神秘面纱,通过深入浅出的方式介绍其内部结构与运作机制。我们将从集合框架的设计哲学出发,探讨其如何影响我们的编程实践,并配以代码示例,展示如何在真实场景中应用这些知识。无论你是Java新手还是资深开发者,这篇文章都将为你提供新的视角和实用技巧。
18 0
下一篇
无影云桌面