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]