Java容器类接口:Iterator,Collection,Map

Iterator

Iterator被称为迭代器,是一个对象,它的工作是遍历并选择序列中的对象,可以实现以下一些操作:

  • 使用方法iterator()要求容器返回一个Iterator,Iterator将返回序列的第一个元素;
  • 使用next()获取序列中的下一个元素;
  • 使用hasNext()检查序列中是否有元素;
  • 使用remove()将迭代器最近返回的元素删除;

Iterator只能向前移动,ListIterator是一个更加强大的Iterator的子类,它只能用于各种List类的访问,ListIterator可以双向移动,它能产生当前迭代器指向的列表中元素的前一个和后一个元素的索引,并且可以使用set()方法替换它访问过的最后一个元素。

Iterator在JDK中是一个接口,在JDK8中它的子接口包含


ListIterator<E>,

PrimitiveIterator<T,T_CONS>,

PrimitiveIterator.OfDouble,

PrimitiveIterator.OfInt,

PrimitiveIterator.OfLong,

XMLEventReader

Iterator定义如下:


public interface Iterator<E> {

boolean hasNext(); //如果有元素可以迭代则返回true

E next(); //返回迭代的下一个元素

void remove(); //从迭代器指向的Collection中移除迭代器返回的最后一个元素

}

Iterator使用实例:

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

public class IteratorTest {
    public static void play(Iterator<String> it) {
        while(it.hasNext()) {
            System.out.println(it.next());
        }
    }

    public static void main(String[] args) {
        ArrayList<String> ss = new ArrayList<String>();
        for(int i = 0; i < 7; i++) {
            ss.add("i:" + i);
        }
        play(ss.iterator());
    }
}

ListIterator允许按任意一方向遍历列表,迭代期间修改列表,并获得迭代器在列表中的位置。ListIterator没有当前元素,它的光标位置始终位于调用previous所返回的元素和调用next所返回元素之间。

ListIterator实现如下:


public interface ListIterator<E> extends Iterator<E> {

boolean hasNext(); //正向遍历列表时如果迭代器有多个元素,返回true

E next(); //返回列表中的下一个元素,可以重复使用迭代列表

boolean hasPrevious(); //反向遍历列表时如果迭代器有多个元素,返回true

E previous(); //返回列表中的上一个元素

int nextIndex(); //返回对next后续调用返回的索引

int previousIndex(); //返回对previous调用返回的索引

void remove(); //从列表中移除由next或previous返回的最后一个元素

void set(E e); //用指定元素替换next或previous返回的最后一个元素

void add(E e); //将指定元素插入列表

}

ListIterator使用实例:

import java.util.LinkedList;
import java.util.ListIterator;

public class ListIteratorTest {
    public static void play(ListIterator<String> it) {
        while(it.hasNext()) {
            System.out.print(it.next() + " " + it.nextIndex() + "|");
        }
        it.set("xxxxxxx");
        it.add("yyyyyyy");
        System.out.println();
        System.out.println(it.previous() + " " + it.next());
        while(it.hasPrevious()) {
            System.out.print(it.previous() + " " + it.previousIndex() + "|");
        }
    }

    public static void main(String[] args) {
        LinkedList<String> ls = new LinkedList<String>();
        for (int i = 0; i < 5; i++) {
            ls.add("aaaaaaa");
        }
        play(ls.listIterator());
    }
}

Collection

Collection是描述所有序列容器的共性根接口,使用接口可以创建富有通用性的代码,可以通过接口而非具体的实现来编写代码,如果编写的方法接受一个Collection,则该方法接受任何用于实现了Collection的类。

Collection接口继承自Iterable,在JDK8中它的子接口包含


BeanContext,

BeanContextServices,

BlockingDeque<E>,

BlockingQueue<E>,

Deque<E>,

List<E>,

NavigableSet<E>,

Queue<E>,

Set<E>,

SortedSet<E>,

TransferQueue<E>

Collection的定义如下


public interface Collection<E> extends Iterable<E> {

int size(); //返回Collection中的元素数

boolean isEmpty(); //如果Collection不包含元素返回true

boolean contains(Object o); //如果Collection包含指定的元素返回true

Iterator<E> iterator(); //返回此Collection的迭代器

Object[] toArray(); //返回此Collection所有元素组成的数组

<T> T[] toArray(T[] a); //返回此Collection所有元素组成的数组

boolean add(E e); //确保此Collection包含指定的元素

boolean remove(Object o); //从此Collection中移除指定的元素

boolean containsAll(Collection<?> c); //如果包含指定Collection中的元素返回true

boolean addAll(Collection<? extends E> c); //至指定的Collectio中的元素加入

boolean removeAll(Collection<?> c); //移除指定Collection的元素

boolean retainAll(Collection<?> c); //只保留指定的Collection中的元素

void clear(); //移除Collection中的所有元素

boolean equals(Object o); //比较与指定对象是否相等

int hashCode(); //返回此Collection的哈希值

}

类AbstractCollection提供了Collection接口最基本的实现,最大程度的减少了实现Collection接口的工作。如果需要实现一个新的不可修改的Collection,则只需要扩展AbstractCollection即可,需要提供iterator()和size()方法的实现(iterator方法返回的迭代器必须实现hasNext和next),如果要实现一个可修改的Collection,则必须重写add方法,iterator方法返回的迭代器还必须实现remove方法。

Collection具体实现可以在之后的List,Set,Queue中见到。

Map

Map:Map<K, V> 在Java中提供键值映射的接口,K代表此映射所维护的键的类型,V代表此映射值的类型。一个映射不能包含重复的键,每个键最多只能映射到一个值。Map提供了三种Collection的视图,键集合,值集合以及键值映射关系集合。

Map<K, V>的子接口包含


Bindings,

ConcurrentMap<K,V>,

ConcurrentNavigableMap<K,V>,

LogicalMessageContext,

MessageContext,

NavigableMap<K,V>,

SOAPMessageContext,

SortedMap<K,V>

Map<K, V>的定义如下,Map<K, V>中包含一个嵌套的接口表示映射的键值对


public interface Map<K,V> {

int size(); //返回此映射中的键-值映射关系数

boolean isEmpty(); //如果此映射未包含键-值映射关系,则返回 true

boolean containsKey(Object key); //如果此映射包含指定键的映射关系,则返回 true

boolean containsValue(Object value); //如果此映射将一个或多个键映射到指定值,则返回 true

V get(Object key); //返回指定键所映射的值;如果此映射不包含该键的映射关系,则返回 null

V put(K key, V value); //将指定的值与此映射中的指定键关联

V remove(Object key); //如果存在一个键的映射关系,则将其从此映射中移除

void putAll(Map<? extends K, ? extends V> m); //从指定映射中将所有映射关系复制到此映射中

void clear(); //从此映射中移除所有映射关系

Set<K> keySet(); //返回此映射中包含的键的 Set 视图

Collection<V> values(); //返回此映射中包含的值的 Collection 视图

Set<Map.Entry<K, V>> entrySet(); //返回此映射中包含的映射关系的 Set 视图

interface Entry<K,V> {

K getKey();

V getValue();

V setValue(V value);

boolean equals(Object o);

int hashCode();

}

boolean equals(Object o); //比较指定的对象与此映射是否相等

int hashCode(); //返回此映射的哈希码值

}

Map<K, V>的使用实例

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

public class MapTest {
    public static void main(String[] args) {
        Map<String, String> map = new HashMap<String, String>();
        map.put("a", "AA");
        map.put("b", "BB");
        map.put("c", "CC");

        Set set = map.entrySet();
        Iterator it = set.iterator();
        while(it.hasNext()) {
            Map.Entry<String, String> me = (Map.Entry<String, String>)it.next();
            System.out.println(me.getKey() + " " + me.getValue());
        }
    }
}
时间: 2024-08-27 03:28:18

Java容器类接口:Iterator,Collection,Map的相关文章

java容器类分析:Collection,List,ArrayList

1. Iterable 与 Iterator Iterable 是个接口,实现此接口使集合对象可以通过迭代器遍历自身元素. public interface Iterable<T> 修饰符和返回值 方法名 描述 Iterator<T> iterator() 返回一个内部元素为T类型的迭代器 default void forEach(Consumer<? super T> action) 对内部元素进行遍历,并对元素进行指定的操作 default Spliterator&

Java容器类接口的选择

我们知道Java容器类实际提供了四类接口:Map,List,Set和Queue,如下图所示,每种接口都有不止一个版本的实现,如果在实际编写程序时需要使用某种接口时该如何选择. 从Oracle的Java Language Best Practices 中的说明可以看到建议不要在新程序中使用HashTable,Vector,Stack使用HashMap,ArrayList和LinkedList来替换. ArrayList和LinkedList都实现了List接口,当ArrayList底层由数组实现,

java容器类3:set/HastSet/MapSet深入解读

介绍 Set:集合,是一个不包含重复数据的集合.(A collection that contains no duplicate elements. ) set中最多包含一个null元素,否者包含了两个相同的元素,不符合定义. 上一篇学习了Java中的容器类的一些基础接口,以及Collection接口三大分支中的List分支(ArrayList以及LinkedList).这一篇文章将讲解Collection三大分支(List.Set.Queue)中的Set分支,以及衍生出来的子类. java容器

java容器类4:Queue深入解读

Collection的其它两大分支:List和Set在前面已近分析过,这篇来分析一下Queue的底层实现. 前三篇关于Java容器类的文章: java容器类1:Collection,List,ArrayList,LinkedList深入解读 java容器类2:Map及HashMap深入解读 java容器类3:set/HastSet/MapSet深入解读 Queue public interface Queue<E> extends Collection<E> { boolean a

【java读书笔记】——Collection集合之六大接口(Collection、Set、List、Map、Iterator和Comparable)

两个月之前准备软考时,简单的从理论上总结了最经常使用的数据结构和算法,比方:线性表,链表,图.在进行java开发时,jdk为我们提供了一系列对应的类来实现主要的数据结构.jdk所提供的容器API位于java.util包内.本文主要是通过简单的介绍Collection集合,向读者简单阐述各个类的基本定义以及其作用,为后面的学习做一下铺垫. 首先,我们先看一下Collection集合的基本结构: 1.Collection接口 Collection是最基本集合接口,它定义了一组同意反复的对象.Coll

JAVA集合详解(Collection和Map接口)

在Java的util包中有两个所有集合的父接口Collection和Map,它们的父子关系:            java.util        +Collection 这个接口extends自 --java.lang.Iterable接口           +List 接口               -ArrayList 类              -LinkedList 类              -Vector 类     此类是实现同步的 +Queue 接口         

【转】java 容器类使用 Collection,Map,HashMap,hashTable,TreeMap,List,Vector,ArrayList的区别

原文网址:http://www.360doc.com/content/15/0427/22/1709014_466468021.shtml java 容器类使用 Collection,Map,HashMap,hashTable,TreeMap,List,Vector,ArrayList的区别. 经常会看到程序中使用了记录集,常用的有Collection.HashMap.HashSet.ArrayList,因为分不清楚它们之间的关系,所以在使用时经常会混淆,以至于不知道从何下手.在这儿作了一个小例

Collection集合之六大接口(Collection、Set、List、Map、Iterator和Comparable)

两个月之前准备软考时,简单的从理论上总结了最常用的数据结构和算法,比如:线性表,链表,图.在进行Java开发时,jdk为我们提供了一系列相应的类来实现基本的数据结构.jdk所提供的容器API位于java.util包内.本文主要是通过简单的介绍Collection集合,向读者简单阐述各个类的基本定义以及其作用,为后面的学习做一下铺垫. 首先,我们先看一下Collection集合的基本结构: 1.Collection接口 Collection是最基本集合接口,它定义了一组允许重复的对象.Collec

Java容器(List、Map、Set、Iterator)

容器是一个Java 所编写的程序,原先必须自行编写程序以管理对象关系,现在容器都会自动帮您做好. List特点:元素有放入顺序,元素可重复 Set特点:元素无放入顺序,元素不可重复(注意:元素虽然无放入顺序,但是元素在set中的位置是有该元素的HashCode决定的,其位置其实是固定的) Map特点:元素按键值对存储,无放入顺序 . 一.List接口 ArrayList:线程不安全,效率高. 底层实现是数组,查询块,修改删除慢. LinkedList: 线程不安全,效率高. 底层实现是链表,查询