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]

  • 相关阅读:
    vue2.0 微信分享
    小程序开发:canvas在画布上滑动,页面跟着滑动问题
    前端AES解密
    vue2上传图片到OSS
    vue给不同环境配置不同打包命令
    vue页面绑定数据,渲染页面时会出现页面闪烁
    解决微信浏览器无法使用window.location.reload刷新页面
    vue列表拖拽组件 vue-dragging
    千万别在Java类的static块里写会抛异常的代码!
    linux shell的一些配置
  • 原文地址:https://www.cnblogs.com/SongHai/p/14190701.html
Copyright © 2011-2022 走看看