zoukankan      html  css  js  c++  java
  • Java基础之:集合——Collection

    Java基础之:集合——Collection

    为什么要引入集合的概念?

    因为我们在使用数组时,不方便动态的扩容缩容。而集合很好的解决了这个问题,当然这只是集合强大功能中的一部分。

    集合的分类

    Collection

    首先,学习单列集合Collection。我们先了解什么是单列,什么是双列。

       单列:只有一列数据组成,类似一维数组。

       双列:由两列数据组成,一列表示键,一列表示值。类似二维数组。

    Collection是一个接口,public interface Collection<E> extends Iterable<E>

    对于Collection的实现类而言,有些是有序(List)的,有些是无序(Set)的。(这里的有序与无序指的是,输出数据时是否按照输入时的顺序)

    Set与List是继承于Collection接口的两个子接口。可以通过它们来实现Collection。

    List是允许有重复元素的,Set是不允许有重复元素的。

    Collection常用方法

    在Collection接口中的方法,在List与Set中也能够使用,所以比较重要。

    1. add:添加单个元素

    2. remove:删除指定元素

    3. contains:查找元素是否存在

    4. size:获取元素个数

    5. isEmpty:判断是否为空

    6. addAll:添加多个元素

    7. containsAll:查找多个元素是否都存在

    8. removeAll:删除多个元素

    9. clear:清空

    package class_collection;
    import java.util.ArrayList;
    import java.util.Collection;
    public class ClassTest01_CollectionMethods {
    ​
        @SuppressWarnings({ "unchecked", "rawtypes" })
        public static void main(String[] args) {
    ​
            //Collection的子接口List的实现类ArrayList,使用多态的特性。
            //此时col编译类型为Collection,运行类型为ArrayList,所以只能访问Collection中的方法。
            Collection col = new ArrayList();
            
            //add:添加单个元素
            col.add("Hello" + "01");
            col.add("Hello" + "02");
            col.add("Hello" + "03");
            col.add("Hello" + "04");
            System.out.println(col);
            
            //remove:删除指定元素
            col.remove("Hello02");
            System.out.println(col);
            
            //contains:查找元素是否存在
            col.contains("Hello01"); //true
            
            //size:获取元素个数
            col.size(); // 3
    ​
            //isEmpty:判断是否为空
            col.isEmpty(); //false
            
            //addAll:添加多个元素,参数为Collection类型,即实现了Collection接口的集合。
            col.addAll(col); //此效果等同于将col复制一份加入原来的col集合中
            System.out.println(col);
            
            //containsAll:查找多个元素是否都存在,参数为Collection类型
            col.containsAll(col); //true
            
            //removeAll:删除多个元素,参数为Collection类型
            col.removeAll(col); //效果等同于清空集合
            System.out.println(col);
    ​
            //clear:清空 
            col.clear();
            System.out.println(col);
        }
    }
    ​
    

    Collection遍历方式

    Collection接口可以使用两种方法遍历集合,使用Iterator迭代器 或者 使用增强for循环。

    Iterator迭代器遍历

    Iterator对象称为迭代器(设计模式的一种),主要用于遍历Collection集合中的元素。

    Collection接口中有iterator()方法,用以返回一个Iterator接口的对象,即可以返回一个迭代器。(Collection中有此方法,那么所有实现Collection接口的类也可以使用)

    Iterator仅用于遍历集合,Iterator本身并不提供承载对象的能力(它是一个接口)。如果需要创建Iterator对象,则必须要有一个需要被迭代的集合。

     

    迭代器执行原理:

    1. 创建迭代器 Iterator iterator = col.iterator();

    2. 使用hasNext()方法判断是否还有下一个元素:iterator.hasNext(); //T or F

    3. 使用next()方法将指针下移并返回下移后指针指向的元素:System.out.println(iterator.next());

    4. 在使用迭代器遍历完一次集合后,一定要重置迭代器。否则迭代器将一直指向最后一个元素,就不能进行下一次遍历。

    package class_collection;
    ​
    import java.util.ArrayList;
    import java.util.Collection;
    import java.util.Iterator;
    ​
    public class ClassTest02_ForeachCollection {
    ​
        @SuppressWarnings({ "rawtypes", "unchecked" })
        public static void main(String[] args) {
            
            Collection col = new ArrayList();
            
            col.add("Hello" + "01");
            col.add("Hello" + "02");
            col.add(new Book("三体1", 30.4));
            col.add(new Book("三体2", 33.4));
            col.add(new Book("三体3", 31.4));
            
            /*
             * Iterator 核心方法 hasNext() next()
             *       通常遍历使用while
             */
            Iterator iterator = col.iterator();
            System.out.println(iterator.getClass());//iterator运行类型java.util.ArrayList$Itr
            
            while(iterator.hasNext()) { //首先判断是否还有下一个元素
                System.out.println(iterator.next());    
                //直接输出元素内容,如果是自定义类,需要重新toString
            }
            //在使用迭代器遍历完一次集合后,一定要重置迭代器。否则迭代器将一直指向最后一个元素,就不能进行下一次遍历
            iterator = col.iterator();
        }
    }
    ​
    class Book{
        private String name;
        private double price;
        public Book(String name, double price) {
            super();
            this.name = name;
            this.price = price;
        }
        
        @Override
        public String toString() {
            return "Book [name=" + name + ", price=" + price + "]";
        }
    }

     

    增强for循环遍历

    jdk5.0出现了增强for循环,可以代替iterator迭代器,特点:增强for就是简化版的iterator,本质一样。只能用于遍历集合或数组。

    基本语法:

      for(元素类型 元素名 : 集合名或数组名) {

        访问元素

      }

    package class_collection;
    ​
    import java.util.ArrayList;
    import java.util.Collection;
    import java.util.Iterator;
    ​
    public class ClassTest02_ForeachCollection {
    ​
        @SuppressWarnings({ "rawtypes", "unchecked" })
        public static void main(String[] args) {
            
            Collection col = new ArrayList();
            
            col.add("Hello" + "01");
            col.add("Hello" + "02");
            col.add(new Book("三体1", 30.4));
            col.add(new Book("三体2", 33.4));
            col.add(new Book("三体3", 31.4));
            
            /*
                增强for循环本质上,还是使用Iterator迭代器。
                只不过是提供的一种更加方便的形式。
            */
            //Debug看源码
            for(Object obj : col) {
                System.out.println(obj);
            }
        }
    ​
    class Book{
        private String name;
        private double price;
        public Book(String name, double price) {
            super();
            this.name = name;
            this.price = price;
        }
        
        @Override
        public String toString() {
            return "Book [name=" + name + ", price=" + price + "]";
        }
    }

     

    Collection练习

    创建 3个 Dog {name, age} 对象,放入到 ArrayList 中,赋给 List 引用

    用迭代器和增强for循环两种方式来遍历

    重写Dog 的toString方法, 输出name和age

    import java.util.List;
    import java.util.ArrayList;
    import java.util.Iterator;
    ​
    public class ClassWork01 {
    ​
        @SuppressWarnings({ "unused", "rawtypes", "unchecked" })
        public static void main(String[] args) {
            List list = new ArrayList();
            list.add(new Dog("小白",3));
            list.add(new Dog("小花",8));
            list.add(new Dog("小黑",6));
            
            //迭代器
            Iterator ite = list.iterator();
            while(ite.hasNext()) {
                System.out.println(ite.next()); //next()取出集合中的下一个对象,默认调用toString
            }
    //      ite = list.iterator();  //使用迭代器,在遍历完之后,一定要重置。因为索引已经走到了最后。
            //未重置迭代器,此循环无输出
            while(ite.hasNext()) {
                System.out.println(ite.next());
            }
    ​
            System.out.println("=======================");
            
            //增强for循环
            for(Object obj:list) {
                System.out.println(obj);    //编译类型为Object,动态绑定到Dog
            }
        }
    }
    ​
    class Dog{
        private String name;
        private int age;
        public Dog(String name, int age) {
            super();
            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 String toString() {
            return "Dog [name=" + name + ", age=" + age + "]";
        }
        
    } 

    程序输出

    Dog [name=小白, age=3]

    Dog [name=小花, age=8]

    Dog [name=小黑, age=6]

    ==========================

    Dog [name=小白, age=3]

    Dog [name=小花, age=8]

    Dog [name=小黑, age=6]

  • 相关阅读:
    流处理 —— Spark Streaming中的Window操作
    Spring框架参考手册(4.2.6版本)翻译——第三部分 核心技术 6.10.8 提供带注解的限定符元数据
    Spring框架参考手册(4.2.6版本)翻译——第三部分 核心技术 6.10.7 为自动检测组件提供作用域
    Spring框架参考手册(4.2.6版本)翻译——第三部分 核心技术 6.10.6 给自动检测组件命名
    Spring框架参考手册(4.2.6版本)翻译——第三部分 核心技术 6.10.5 在组件中定义bean的元数据
    Spring框架参考手册(4.2.6版本)翻译——第三部分 核心技术 6.10.4 使用过滤器自定义扫描
    Spring框架参考手册(4.2.6版本)翻译——第三部分 核心技术 6.10.3 自动检测类和注册bean的定义
    Spring框架参考手册(4.2.6版本)翻译——第三部分 核心技术 6.10.2 元注解
    Spring框架参考手册(4.2.6版本)翻译——第三部分 核心技术 6.10.1 @Component和深层的构造型注解
    Spring框架参考手册(4.2.6版本)翻译——第三部分 核心技术 6.10 类路径扫描和被管理的组件
  • 原文地址:https://www.cnblogs.com/SongHai/p/14190701.html
Copyright © 2011-2022 走看看