java_关于集合(Collection接口,List接口及其子类,Iterator迭代器接口)

(一)集合概念:用于存储多个对象的单一对象(容器),存储的数据叫元素.元素都是引用类型
PS:容器内存储的都是对象的地址;

用于模拟现实生活中的容器,因此集合类型,不单是一种,有很多类型设计成各种存储的数据结构,这种类型叫做集合框架

元素:必须是引用数据类型的数据,不能是基本数据类型的数据,可以是包装类

JDK1.5新特性:
    1.5前容器可以存储Object的任何子类型,但是在对元素进行操作时,比如在调用元素的方法时,我们必须知道冤死的类型,所以在编程中增加了大量代码,来强制转换,增加了开发难度,因此1.5开始支持了一个新特性,叫泛型机制,用来规定容器中存储的元素类型,此机制可以在编译期间判断元素的类型

(二)集合与数组的区别:
数组:可以存储基本数据类型,也可以存储引用数据类型
集合:只能存储引用数据类型

(三)集合框架中包含多种接口,抽象类,实现类等,用此来满足我们所需要的用于存储数据的数据结构

(四)Collection接口和Collections类:
Collection是集合框架的顶级父接口,用来定义常用的抽象方法,子类需要实现相应的方法逻辑
Collections是集合的工具类,定义了许多用于操作集合的工厂方法

常用方法:

boolean add(E e):
    将对象e添加到容器(集合)中
int size();
    返回集合元素的个数
boolean addAll(Collection c):
    将集合c添加到此集合中
void clear();
    清空集合元素
boolean contains(Object obj):
    查看此集合中是否包含obj这个元素
boolean containsAll(Collection<?> c) 
    如果此集合包含集合c中的所有元素,则返回true。反之,false 
boolean isEmpty():
    判断集合是否为空
boolean remove(Object o):
    从该集合中删除指定元素的单个实例
boolean retainAll(Collection<?> c):
    仅保留此集合中包含在指定集合中的元素(可选操作)。

(五)子接口:List与Set,Queue
1.List接口: 列表
此接口对应的实现类的特点都是:有序的,可重复的

有序:存储时与添加的顺序有关,有对应的下标标记位置
重复:存储的对象可以是同一个,或是内容相同的不同对象,重复与否与元素的equals方法有关

常用方法:

void add(int index, E element):
    将指定的元素插入此列表中的指定位置(可选操作)。

E get(int index):
    返回此列表中指定位置(下标为index)的元素。

int indexOf(Object o):
    返回此列表中指定元素的第一次出现的索引,如果此列表不包含元素,则返回-1。

E set(int index, E element) 
用指定的元素element替换此列表中指定位置(index)的元素。返回原元素

E remove(int index) 
删除该列表中指定位置的元素。

List<E> subList(int fromIndex, int toIndex) 
返回此列表中指定的[fromIndex, toIndex)之间的子集合。
PS:此方法在堆中会产生新集合对象,引用原集合的一部分,修改该集合会影响原集合
/*创建一个集合存储1,2,3,4,5,6,7,8,9,10*/
        List<Integer> list = new ArrayList<Integer>();
        for(int i=0;i<10;i++){
            list.add(i+1);
        }
        System.out.println(list);
        /*截取[4,5,6,7,8]*/
        List<Integer> sub = list.subList(3, 8);
        System.out.println(sub);
        /*将sub集合中的元素分别扩大10倍*/
        for(int i=0;i<sub.size();i++){
            sub.set(i, sub.get(i)*10);
        }
        System.out.println(sub);//[40, 50, 60, 70, 80]
        System.out.println(list);
        //[1, 2, 3, 40, 50, 60, 70, 80, 9, 10]

这里写图片描述

int lastIndexOf(Object o) 
返回此列表中指定元素的最后一次出现的索引,如果此列表不包含元素,则返回-1。

(六)数组与集合之间的转换
1.集合转数组

    Object[] toArray();
    E[] toArray(E[] e);

2.数组转集合
Arrays工具类的
List asList(数组)
PS:数组转成的集合不能进行增删操作,会出现UnsupportedOperationException异常,可以进行替换操作,但原数组的对应元素也会被替换,想要成功操作,需定义一个新的集合将转换的集合的元素都存入到新集合中

(七)Iterator:迭代器接口
1.迭代器的作用是用来遍历集合元素,是一个接口,Collection继承了该接口,提供了一个方法Iterator iterator()
2.Collection的实现类使用内部类定义了迭代器子类
3.迭代器提供了统一的方法用于遍历集合元素

常用方法:
    boolean hasNext();
        判断集合中是否有下一个元素
    E next();
        取出集合中下一个元素
    remove();
        要移除原集合的元素,调用集合的方法会出现运行时异常,这时需用到迭代器的移除方法

增强for循环--foreach循环
    for(数组元素类型 变量:要遍历的集合或数组){
        循环体;
    }
    与经典for循环的区别:
        (1)增强for循环中无法使用下标;
        (2)经典for循环可以使用下标,和下标有关的逻辑

(八)List的三个实现类
1.ArrayList:
底层是基于动态数组的数据结构,是有存放顺序的

2.LinkedList  
    底层是基于双链表的数据结构,每一个存储单元都涉及到其他两个引用

优缺点:
在执行get/set时,ArrayList效率高,LinkedList效率低
在增加,删除时,LinkedList效率高,ArrayList效率低
PS:当然在元素的数量大时,效率高低才区别显著

3.Vector:是一个比较古老的集合类型,线程安全但效率低,故不建议使用

(九)接口Queue:队列,先进先出

Queue也是Collection的子接口,一种队列的数据结构
队列:通常都是一端进(offer),另一端出(poll)

因为队列增删频繁,所以使用LinkedList实现了Queue接口


常用方法:
boolean offer(E e) 
    将指定的元素添加为此列表最后一个元素。
E poll() 
    检索并删除此列表的头一个元素。
    队列没有元素时,返回null

E peek() 
    检索但不删除此列表的第一个元素。
    队列没有元素时,返回null

注意:为避免移除队列的队首时出现null,最好先查看队首是不是null

Deque:是一个Queue子接口,实现的是双端队列的数据结构
双端队列:两端都可以进出

E peekFirst() 
检索,但不删除,此deque的第一个元素,或返回 null如果这个deque是空的。  
E peekLast() 
检索但不删除此deque的最后一个元素,如果此deque为空,则返回 null 。  

E pollFirst() 
检索并删除此deque的第一个元素,如果此deque为空,则返回 null 。  
E pollLast() 
检索并删除此deque的最后一个元素,如果此deque为空,则返回 null 。  

模拟栈的数据结构:先进后出
将双端队列的一端进行禁止操作,另一端进出,即Stack

void push(E e)
    将元素e进栈
E pop();
    将最后进去的元素出栈

猜你喜欢

转载自blog.csdn.net/yc_hen/article/details/81839881