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 集合框架中的老炮与新秀:HashTable 和 HashMap 谁更胜一筹?
嗨,大家好,我是技术伙伴小米。今天通过讲故事的方式,详细介绍 Java 中 HashMap 和 HashTable 的区别。从版本、线程安全、null 值支持、性能及迭代器行为等方面对比,帮助你轻松应对面试中的经典问题。HashMap 更高效灵活,适合单线程或需手动处理线程安全的场景;HashTable 较古老,线程安全但性能不佳。现代项目推荐使用 ConcurrentHashMap。关注我的公众号“软件求生”,获取更多技术干货!
26 3
|
2月前
|
Java 开发者
在 Java 中,一个类可以实现多个接口吗?
这是 Java 面向对象编程的一个重要特性,它提供了极大的灵活性和扩展性。
160 57
|
2月前
|
Java
在Java中实现接口的具体代码示例
可以根据具体的需求,创建更多的类来实现这个接口,以满足不同形状的计算需求。希望这个示例对你理解在 Java 中如何实现接口有所帮助。
91 38
|
15天前
|
数据采集 JSON Java
利用Java获取京东SKU接口指南
本文介绍如何使用Java通过京东API获取商品SKU信息。首先,需注册京东开放平台账号并创建应用以获取AppKey和AppSecret。接着,查阅API文档了解调用方法。明确商品ID后,构建请求参数并通过HTTP客户端发送请求。最后,解析返回的JSON数据提取SKU信息。注意遵守API调用频率限制及数据保护法规。此方法适用于电商平台及其他数据获取场景。
|
20天前
|
安全 Java API
java如何请求接口然后终止某个线程
通过本文的介绍,您应该能够理解如何在Java中请求接口并根据返回结果终止某个线程。合理使用标志位或 `interrupt`方法可以确保线程的安全终止,而处理好网络请求中的各种异常情况,可以提高程序的稳定性和可靠性。
46 6
|
22天前
|
存储 缓存 安全
Java 集合江湖:底层数据结构的大揭秘!
小米是一位热爱技术分享的程序员,本文详细解析了Java面试中常见的List、Set、Map的区别。不仅介绍了它们的基本特性和实现类,还深入探讨了各自的使用场景和面试技巧,帮助读者更好地理解和应对相关问题。
38 5
|
2月前
|
存储 缓存 安全
Java 集合框架优化:从基础到高级应用
《Java集合框架优化:从基础到高级应用》深入解析Java集合框架的核心原理与优化技巧,涵盖列表、集合、映射等常用数据结构,结合实际案例,指导开发者高效使用和优化Java集合。
44 4
|
2月前
|
Java API
Java中内置的函数式接口
Java中内置的函数式接口
27 2
|
2月前
|
Java
在Java中如何实现接口?
实现接口是 Java 编程中的一个重要环节,它有助于提高代码的规范性、可扩展性和复用性。通过正确地实现接口,可以使代码更加灵活、易于维护和扩展。
103 3
|
2月前
|
Java
在Java中,接口之间可以继承吗?
接口继承是一种重要的机制,它允许一个接口从另一个或多个接口继承方法和常量。
126 1