首页 > 技术文章 > Collection集合

Shuangyi 2019-05-26 16:22 原文

集合概述

  • 集合是Java中提供的一种容器,可以用来存储多个数据
  • 集合和数组既然都是容器,它们有什么区别呢?
    • 数组的长度是固定的,集合的长度可变的。
    • 数组中存储的是同一个类型的元素,可以存储基本数据类型值。集合存储的都是对象,而且对象的类型可以不一致,在开发中一般当对象多的时候,使用集合进行存储。

集合框架

接口
Collection
(顶层-->底层)
List
(有序集合)
ArrayList
LinkedList
Vector
Set
(无序集合、
不可存放重复数)
HashSet LinkedHashSet
TreeSet

迭代器的使用:

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

/*
* java.util.Iterator接口:迭代器(对集合进行遍历)
* 有两个常用的方法
*   boolean hasNext() 如果有元素可以迭代,则返回true
*                   判断集合没有下一个元素时,就返回false
*   E next() 返回迭代的下一个元素
*            取出集合中的下一个元素
*   Iterator迭代器是一个接口,我们无法直接使用,需要使用Iterator接口的实现类对象,
*   获取实现类的方式比较特殊。
*   Collection接口中有一个方法,叫iterator(),这个方法返回的就是迭代器的实现类对象
*   迭代器的使用步骤:
*     1.使用集合中的方法iterator()获取迭代器的实现类对象,使用Iterator接口接收(多态)
*     2.使用Iterator接口中的方法hasNext判断还有没有下一个元素
*     3.使用Iterator接口中的方法next取出集合中的下一个元素
*
* */
public class demo03Iterator {
    public static void main(String[] args) {
        //创建一个集合对象
        Collection<String> coll = new ArrayList<>();
        //往集合中添加元素
        coll.add("姚明");
        coll.add("科比");
        coll.add("麦迪");
        coll.add("詹姆斯");
        coll.add("艾弗森");
        /*
        * 注意:Iterator<E> 接口也是有泛型的,迭代器的泛型跟着集合走,
        * 集合是什么泛型,迭代器就是是泛型
        * */
        Iterator<String> it = coll.iterator();
        //使用hasNext判断是否还有下一个元素
        boolean b = it.hasNext();
        System.out.println(b);
        //使用next取出集合中的下一个元素
        String s = it.next();
        System.out.println(s);
        //未知循环使用while  已知循环使用for
        while (it.hasNext()){
            s = it.next();
            System.out.println(s);
        }

    }
}

package cn.itcast.demo04;

import java.util.ArrayList;
import java.util.Iterator;

public class generic {
public static void main(String[] args) {
show02();

}

 /*
* 创建集合对象,不使用泛型
* 好处:默认的类型就是object,可以存储任意类型的数据
* 弊端:不安全,会引发异常
* */
private static  void show01() {
    ArrayList list = new ArrayList<>();
    list.add("abc");
    list.add(1);
    //使用迭代获取 第一步要先获取迭代器
    Iterator it = list.iterator();
    while (it.hasNext()) {
        Object obj = it.next();
        System.out.println(obj);
        /*
        * 想要使用String类型特有的方法,length获取字符串长度,
        * 不能使用 多态 Object obj = “abc” 需要向下转型
        * 此时会出现类型转换异常,不能把Integer 转成 String
        * */
        String s = (String) obj;
        System.out.println(s.length());
    }
}

/*
* 创建结汇对象,使用泛型
* 好处:
*  1.避免了类型转换的麻烦,存储的是什么类型,取出的就是什么类型
*  2.把运行期异常(代码运行之后会抛出的异常,提升到了编译期),写代码的时候会报错
*  弊端:
*   泛型是什么类型,只能存储什么类型
* */
private static  void show02(){
    ArrayList<String> list = new ArrayList<>();
    list.add("abc");
    //使用迭代获取 第一步要先获取迭代器
    Iterator<String> it = list.iterator();
    while (it.hasNext()){
        String s = it.next();
        System.out.println(s.length());
    }
}

}

通配符的使用:

 
    import java.util.ArrayList;
    import java.util.Iterator;
    
    /*
    * 泛型的通配符:
    *    ? 代表任意的数据类型
    * 使用方式:
    *    不能创建对象使用
    *    只能作为方法的参数使用
    * */
    public class generic02 {
        public static void main(String[] args) {
            ArrayList<Integer> list01 = new ArrayList<>();
            list01.add(1);
            list01.add(2);
    //        System.out.println(list01);
    
            ArrayList<String> list02 = new ArrayList<>();
            list02.add("a");
            list02.add("b");
    
            printArray(list01);
            printArray(list02);
        }
        /*
        * 定义一个方法,能遍历所有类型的ArrayList集合
        * 这时候我们不知道ArrayList集合使用什么数据类型,可以使用泛型通配符
        * */
        public static void  printArray(ArrayList<?> list){
            Iterator<?> it = list.iterator();
            while (it.hasNext()){
                //it.next()方法,取出的元素时Object
                //因为只有Object才可以接收所有的类型
                Object o = it.next();
                System.out.println(o);
            }
        }
    }
   

推荐阅读