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);
        }
    }
}
相关文章
|
5天前
|
存储 安全 Java
Java基础之集合Map
【7月更文挑战第8天】Java中的Map集合以键值对方式存储数据,如`Map&lt;&quot;name&quot;, &quot;张三&quot;&gt;`。Map接口定义了存取、判断、移除等操作,包括`put`、`get`、`containsKey`等方法。HashMap是最常用的实现,基于哈希表,允许null键值,但不保证顺序。其他实现包括同步的Hashtable、处理属性文件的Properties、保持插入顺序的LinkedHashMap、基于红黑树的TreeMap、弱引用的WeakHashMap、并发安全的ConcurrentHashMap和针对枚举优化的EnumMap。
11 4
|
3天前
|
安全 Java
Java进阶之泛型
【7月更文挑战第10天】Java泛型,自Java 5引入,旨在提升类型安全和代码重用。通过泛型,如List&lt;String&gt;,可在编译时捕获类型错误,防止ClassCastException。泛型包括泛型类、接口和方法,允许定义参数化类型,如`class className&lt;T&gt;`,并用通配符&lt;?&gt;、extends或super限定边界。类型擦除确保运行时兼容性,但泛型仅做编译时检查。使用泛型能增强类型安全性,减少强制转换,提高性能。
12 1
|
3天前
|
Java
Java进阶之泛型
Java进阶之泛型
7 1
|
3天前
|
Java
Java进阶之异常捕捉处理和错误处理
【7月更文挑战第9天】Java异常处理确保程序在遇到错误时不会崩溃。关键机制包括try-catch-finally,用于捕获(try)、处理(catch)和清理(finally)异常。异常分为检查型(需编译时处理,如IOException)和非检查型(如NullPointerException)。throw用于抛出异常,throws用于声明方法可能抛出的异常。Error表示系统级错误,不可恢复;Exception是可处理的异常,包括检查型和非检查型。自定义异常通过继承Exception实现。Java 7引入try-with-resources自动关闭资源。
7 1
|
4天前
|
安全 算法 Java
Java面试题:如何使用并发集合,例如ConcurrentHashMap?
Java面试题:如何使用并发集合,例如ConcurrentHashMap?
15 1
|
4天前
|
设计模式 缓存 安全
Java面试题:工厂模式与内存泄漏防范?线程安全与volatile关键字的适用性?并发集合与线程池管理问题
Java面试题:工厂模式与内存泄漏防范?线程安全与volatile关键字的适用性?并发集合与线程池管理问题
11 1
|
18小时前
|
数据采集 Java API
java接口防爬虫
7月更文挑战第4天
|
3天前
|
Java
Java进阶之异常捕捉处理和错误处理
Java进阶之异常捕捉处理和错误处理
5 0
|
4天前
|
Java API
Java面试题:说明Lambda表达式在Java中的应用,以及函数式接口的概念和作用。
Java面试题:说明Lambda表达式在Java中的应用,以及函数式接口的概念和作用。
11 0
|
4天前
|
存储 安全 Java
Java面试题:请解释Java中的泛型集合框架?以及泛型的经典应用案例
Java面试题:请解释Java中的泛型集合框架?以及泛型的经典应用案例
10 0