JAVA--集合之Collection,List与迭代器Iterator

集合

概念

用于存储多个对象的单一对象(容器,数据结构).存储的数据叫做元素,注意元素只能是引用类型,不可以存储基本数据类型.

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

集合内存储的是对象的地址信息.

且子类中重写了toString方法.

JDK1.5新特性

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

与数组的区别

数组可以存储基本数据类型,也可以存储引用数据类型.而集合不能存储基本数据类型.

集合框架

包含许多接口,抽象类,实现类等,用来满足我们所需要的用于存储数据的数据结构.

interface Collection

集合框架的顶级父接口,用来定义常用的方法.子类需要实现相应的方法逻辑.

与Collections的区别

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中的所有元素.

boolean isEmpty():用于判断集合是否为空.为空返回true.

boolean remove(Object obj):集合中删除元素obj.

boolean retainAll(Collection c):仅保留两个集合的共有元素.

<T> T[] toArray(T[] a):将集合转换为数组.

Collection接口方法的相关示例代码如下:

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;

public class Tests  {
    public static void main(String[] args) {
        Collection<String> c=new ArrayList<String>();
        Collection<String> c1=new ArrayList<String>();
        /*添加元素 boolean add(E e)*/
        c.add("A");c.add("B");c.add("C");c.add("D");
        c1.add("E");c1.add("F");
        System.out.println("集合c:"+c);
        System.out.println("集合c1:"+c1);
        /*集合c的元素数 int size();*/
        System.out.println("集合c的元素数:"+c.size());
        /*添加集合boolean addAll(Collection c) */
        c.addAll(c1);
        System.out.println("添加集合后的c:"+c);
        /*清空集合 void clear()*/
        c1.clear();
        System.out.println("清空后的集合c1:"+c1);
        /*是否有相同元素 boolean contains(Object obj)*/
        String str="b";
        System.out.println("集合c中是否包含str:"+c.contains(str));
        /*是否包含集合全部元素 boolean containsAll(Collection c)*/
        Collection<String> c2=new ArrayList<String>();
        c2.add("B");c2.add("E");c2.add("F");
        System.out.println("c是否包含集合c2:"+c.containsAll(c2));
        /*判断是否为空 boolean isEmpty()*/
        System.out.println("集合c1是否为空:"+c1.isEmpty());
        /*移除某一元素 boolean remove(Object o)*/
        String str1="C";
        c.remove(str1);
        System.out.println("集合c移除str1:"+c);
        /*移除集合中的共有元素 boolean removeAll(Collection c)*/
        c.removeAll(c2);
        System.out.println("移除集合c2中共有元素后的c1:"+c);
        c.addAll(c2);
        /*保留共有元素 boolean retainAll(Collection c)*/
        Collection<String> c3=new ArrayList<String>();
        c3.add("D");c3.add("E");c.add("F");
        c.containsAll(c3);
        System.out.println("保留与c3共有的元素的集合c"+c);
        /*转换为数组 <T> T[] toArray(T[] a)*/
         String[] strArr=c.toArray(new String[0]);
         System.out.println("集合c转换为数组"+Arrays.toString(strArr));
    }
}

运行结果:

集合c:[A, B, C, D]
集合c1:[E, F]
集合c的元素数:4
添加集合后的c:[A, B, C, D, E, F]
清空后的集合c1:[]
集合c中是否包含str:false
c是否包含集合c2:true
集合c1是否为空:true
集合c移除str1:[A, B, D, E, F]
移除集合c2中共有元素后的c1:[A, D]
保留与c3共有的元素的集合c[A, D, B, E, F, F]
集合c转换为数组[A, D, B, E, F, F]

interface List 列表

是Collection的子接口此接口的实现类对应的实现类都是有序的,可以重复的,重复与否与元素的equals()有关,有对应的索引(下标)标记位置,从0开始.存入的元素可以是同一个,也可以是内容相同的不同对象.

由于存在下标,所以可以对指定元素通过下标进行操作.

常用方法

void add(int index,E element):将某一元素插入至此集合的下标index出,剩下的元素依次向后移动.

E get(int index):返回指定下标位置的元素.

int indexOf(Object obj):返回指定元素第一次出现的位置,若没有则返回-1.

E set(int index,E new Element):使用新元素element替换下标index的元素,返回原来的元素.

boolean remove(int index):移除此集合中下标为index的元素,移除后底层数组缩容.

List<E> subList(int fromIndex,int endIndex):截取此集合中fromIndex下标到endIndex下标(不含endIndex)的元素.

PS:此方法不会在堆中产生新的集合对象,变量引用的是父集的一部分.

List相关方法的示例代码:

import java.util.ArrayList;
import java.util.List;

public class Tests  {
    public static void main(String[] args) {
        List<String> list=new ArrayList<>();
        list.add("A");list.add("C");list.add("D");list.add("E");
        /*向指定位置添加元素 void add(int index,E element)*/
        list.add(1,"B");
        System.out.println("像第二个位置添加元素后的list:"+list);
        /*返回指定下标的元素 E ger(int index)*/
        System.out.println("取出的list的第四个元素:"+list.get(3));
        /*返回指定元素第一次出现的位置下标 int indexOf(Object obj)*/
        System.out.println("元素C第一次出现的下标为:"+list.indexOf("C"));
        System.out.println("元素F第一次出现的下标为:"+list.indexOf("F"));
        /*使用新元素替换指定位置的元素 E set(int index,E element)*/
        System.out.println("被移除的元素:"+list.set(2,"G"));
        System.out.println("替换元素后的list:"+list);
        /*移除指定位置元素 boolean remove(int index)*/
        list.remove(1);
        System.out.println("移除第二个元素后的list:"+list);
        /*截取一部分 List<E> subList(int fromIndex,int endIndex)*/
        System.out.println("截取2至4号元素list:"+list.subList(1,4));
    }
}

运行结果:

像第二个位置添加元素后的list:[A, B, C, D, E]
取出的list的第四个元素:D
元素C第一次出现的下标为:2
元素F第一次出现的下标为:-1
被移除的元素:C
替换元素后的list:[A, B, G, D, E]
移除第二个元素后的list:[A, G, D, E]
截取2至4号元素list:[G, D, E]

数组与集合之间的转换

集合转数组

Object[] toArray();

E[] toArray(E e);

数组转集合

List Arrays.asList(数组参数);

注意:数组转成的集合不能进行增删操作,否则报UnsupportedOperationException.但是可以进行改操作,数组对应元素亦会被修改.若想成功进行增删操作,可以将元素存入新集合中.

interface Iterator迭代器

作用是用来遍历几何元素,提供一个方法

Iterator iterator();

Collection 的实现类使用内部类定义了迭代器子类.

迭代器提供了统一的方法,用于遍历集合元素.

常用方法

boolean hasNext():判断集合中是否有下一个元素.

E next():取出集合中的下一个元素.

void remove():移除元素.

注意:在使用迭代器堆集合进行遍历是,不能使用集合的remove()进行移除.

必须使用迭代器自己提供的remove()才可以.

迭代器的示例代码:

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

public class Tests  {
    public static void main(String[] args) {
        List<String> list=new ArrayList<>();
        list.add("A");list.add("B");list.add("C");list.add("D");list.add("E");
        Iterator<String> i=list.iterator();
        /*使用迭代器遍历集合元素*/
        while (i.hasNext()){
            String str=i.next();
            System.out.print(str+" ");
        }
        System.out.println();
        /*迭代器的删除方法 void remove()*/
        Iterator<String> i1=list.iterator();
        while (i1.hasNext()){
            String str=i1.next();
            if ("C".equals(str))
                i1.remove();
        }
        System.out.println("删除元素后的list:"+list);
    }
}

运行结果: 

A B C D E 
删除元素后的list:[A, B, D, E]

增强for循环(foreach)

 for(元素类型 变量名:要遍历的集合或数组.){循环体}

底层使用了迭代器.

注意,foreach循环无法使用下标,只能进行遍历.

增强for循环示例代码:

import java.util.ArrayList;
import java.util.List;

public class Tests  {
    public static void main(String[] args) {
        List<String> list=new ArrayList<>();
        list.add("A");list.add("B");list.add("C");list.add("D");list.add("E");
        for (String str:list) {
            System.out.println(str);
        }
    }
}

运行结果:

A
B
C
D
E

猜你喜欢

转载自blog.csdn.net/bujiujie8/article/details/81840412