JAVA容器

一、容器体系结构

java.util

二、迭代器Iterator<E>

迭代器是一种设计模式,可以遍历并选择序列中的对象,而开发人员并不需要了解该序列的底层结构。迭代器通常被称为”轻量级”对象,因为创建它的代价小。

JAVA的Iterator<E>功能比较简单,并且只能单向移动。

相对Iterator而言,for()循环遍历的速度较快点。而Iterator则比较通用,且序列的内部状态都由Iterator维护。

函数

功能

hasNext()

检查序列下一个元素是否存在。

next()

获取序列下一个元素。

remove()

将迭代器新返回的元素删除。

实例:

public class ArrayToList {

static void printList(List<String> list){

for(String e : list)

System.out.print("  " + e);

System.out.println();

}

public static void main(String[] args) {

String[] strs = {"xue", "ma", "xiong", "feng", };

//方法一

List<String> strList = Arrays.asList(strs);

ArrayToList.printList(strList);

//方法二

List strList1 = new ArrayList<String>(strs.length);

for(String e : strs)

strList1.add(e);

ArrayToList.printList(strList1);

//方法三

List strList2 = new ArrayList();

Collections.addAll(strList2, strs);

ArrayToList.printList(strList2);

}

}

运行结果:

元素:xue

数组:[ma, xiong, feng]

元素:ma

数组:[xiong, feng]

元素:xiong

数组:[feng]

元素:feng

数组:[]

三、类集Collection<E>

与C++STL类似。Collection所有容器类都必须实现的接口。

所有通用的Collection实现类都应该提供两个“标准”构造方法:一个是void(无参)构造方法,用于创建空的Collection;另一个是带有Collection类型单参数的构造方法,用于创建一个具有与参数相同元素的新的collection。

函数

参数

功能

add

(E e)

确保此 collection 包含指定的元素(末尾)。

addAll

(Collection<? extends E> c)

将指定 collection 中的所有元素都添加到此 collection 中(末尾)。

clear

移除此 collection 中的所有元素(可选操作)。

contains

(Object o)

如果此 collection 包含指定的元素,则返回 true。

containsAll

(Collection<?> c)

如果此 collection 包含指定 collection 中的所有元素,则返回 true。

equals

(Object o)

比较此 collection 与指定对象是否相等。

hashCode

返回此 collection 的哈希码值。

isEmpty

如果此 collection 不包含元素,则返回 true。

iterator

返回在此 collection 的元素上进行迭代的迭代器。

remove

(Object o)

从此 collection 中移除指定元素的单个实例,如果存在的话(可选操作)。

removeAll

(Collection<?> c)

移除此 collection 中那些也包含在指定 collection 中的所有元素(可选操作)。

retainAll

(Collection<?> c)

仅保留此 collection 中那些也包含在指定 collection 的元素(可选操作)。

size

(Collection<?> c)

返回此 collection 中的元素数。

toArray

返回包含此 collection 中所有元素的数组。

toArray

(T[] a)

返回包含此 collection 中所有元素的数组;返回数组的运行时类型与指定数组的运行时类型相同。

应用实例:

public class TestCollection {

public static void main(String[] args) {

Collection  collection =  new ArrayList();

Collection<String>  collection1 =  new ArrayList<String>();

//向容器中加入对象

collection.add( "Hello");

collection1.add( "Hello");

collection.add(new Integer(1));

//collection1.add(new Integer(1));

Object obj = new Object();

collection.add(obj);

//collection1.add(obj);

//size返回collection中的元素数

System.out.println("容器的长度:"+collection.size());

System.out.println("容器:"+collection.toString());

System.out.println("容器1:"+collection1.toString());

//转换为数组

Object[] object  = collection.toArray();

//未进行类型转换

System.out.println("第一个元素是:"+object[0]);

//移除容器中制定的对象

collection.remove(obj);

System.out.println("容器:"+collection.toString());

//清空容器中的对象

collection.clear();

System.out.println("容器的长度:"+collection.size());

System.out.println("容器:"+collection.toString());

}

}

运行结果:

容器的长度:

容器:[Hello, 1, java.lang.Object@2de41d]

容器1:[Hello]

第一个元素是:Hello

容器:[Hello, 1]

容器的长度:

容器:[]

注:在本例中也体系了泛型的好处。第一个容器没有使用泛型,可以向其添加不同类型的数据。第二个容器使用了泛型,只能向其添加String类型数据。

四、序列List<E>

是有序的Collection。程序员可以对列表中每个元素的插入位置进行精确地控制,也可以根据元素的整数索引访问元素,并搜索列表中的元素。

列表允许存在重复的元素。List 提供了 4 种对列表元素进行定位(索引)访问方法。List 接口提供了特殊的迭代器,称为 ListIterator,除了允许 Iterator 接口提供的正常操作外,该迭代器还允许元素插入和替换,以及双向访问。还提供了一个方法来获取从列表中指定位置开始的列表迭代器。

List除了继承Collection的方法外,扩展了如下方法:

函数

参数

功能

add

(int index, E element)

在列表的指定位置插入指定元素

addAll

(int index, Collection<? extends E> c)

将指定 collection 中的所有元素都插入到列表中的指定位置

get

(int index)

返回列表中指定位置的元素。

indexOf

(Object o)

返回此列表中第一次出现的指定元素的索引;如果此列表不包含该元素,则返回 -1。

boolean isEmpty()

lastIndexOf

(Object o)

返回此列表中最后出现的指定元素的索引;如果列表不包含此元素,则返回 -1。

listIterator

返回此列表元素的列表迭代器(按适当顺序)。

listIterator

(int index)

返回列表中元素的列表迭代器(按适当顺序),从列表的指定位置开始。

remove

(int index)

移除列表中指定位置的元素

set

(int index, E element)

用指定元素替换列表中指定位置的元素

subList

(int fromIndex, int toIndex)

返回列表中指定的 fromIndex(包括 )和 toIndex(不包括)之间的部分视图

五、动态数组ArrayList<E>

ArrayList是Array的复杂版本。提供:动态地增加和减少数组的元素;灵活设置数组的大小。

每个 ArrayList 实例都有一个容量。该容量是指用来存储列表元素的数组的大小。它总是至少等于列表的大小。随着向 ArrayList 中不断添加元素,其容量也自动增长。

在添加大量元素前,应用程序可以使用 ensureCapacity 操作来增加 ArrayList 实例的容量。这可以减少递增式再分配的数量。

ArrayList继承了List的方法外,其扩展了如下方法:

函数

参数

功能

ArrayList

构造一个初始容量为 10 的空列表。

ArrayList

(Collection<? extends E> c)

构造一个包含指定 collection 的元素的列表,这些元素是按照该 collection 的迭代器返回它们的顺序排列的。

ArrayList

(int initialCapacity

构造一个具有指定初始容量的空列表。

clone

返回此 ArrayList 实例的浅表副本。

ensureCapacity

(int minCapacity)

如有必要,增加此 ArrayList 实例的容量,以确保它至少能够容纳最小容量参数所指定的元素数。

removeRange

(int fromIndex,

int toIndex)

移除列表中索引在 fromIndex(包括)和 toIndex(不包括)之间的所有元素。

trimTosize

将此 ArrayList 实例的容量调整为列表的当前大小。

六、链表LinkedList<E>

LinkedList<E>是一种双向的链式结构。相对ArrayList而言,LinkedList<E>的插入和删除元素相对方便,但速度较慢。

除了实现 List 接口外,LinkedList 类还为在列表的开头及结尾 get、remove 和 insert 元素提供了统一的命名方法。这些操作允许将链接列表用作堆栈、队列或双端队列。

LinkedList继承了List的方法外,其扩展了如下方法:

函数

方法

功能

LinkedList

构造一个空列表。

LinkedList

(Collection<? extends E> c)

构造一个包含指定 collection 中的元素的列表,这些元素按其 collection 的迭代器返回的顺序排列。

addFirst

(E e)

将指定元素插入此列表的开头。

addLast

(E e)

将指定元素插入此列表的结尾。

clone

返回此 LinkedList 的浅表副本。

descendingIterator

返回以逆向顺序在此双端队列的元素上进行迭代的迭代器。

element

获取但不移除此列表的头(第一个元素)。

getFirst

返回此列表的第一个元素。

getLast

返回此列表的最后一个元素。

lastIndexOf

返回此列表中最后出现的指定元素的索引,如果此列表中不包含该元素,则返回 -1。

listIterator

(int index)

返回此列表中的元素的列表迭代器(按适当顺序),从列表中指定位置开始。

offer

(E e)

将指定元素添加到此列表的末尾

offerFirst

(E e)

在此列表的开头插入指定的元素。

offerLast

(E e)

在此列表末尾插入指定的元素。

peek

获取但不移除此列表的头

peekFirst

获取但不移除此列表的第一个元素;如果此列表为空,则返回 null。

peekLast

获取但不移除此列表的最后一个元素;如果此列表为空,则返回 null

poll

获取并移除此列表的头(第一个元素)

pollFirst

获取并移除此列表的第一个元素;如果此列表为空,则返回 null。

pollLast

获取并移除此列表的最后一个元素;如果此列表为空,则返回 null。

pop

将元素推入此列表所表示的堆栈。

push

(E e)

将元素推入此列表所表示的堆栈。

removeFirst

移除并返回此列表的第一个元素。

removeFirstOccurrence

(Object o)

从此列表中移除最后一次出现的指定元素(从头部到尾部遍历列表时)。

七、集合Set<E>

Set和数学中的集合是同一个概念,就是没有重复元素的集合,是一个不包含重复元素的 collection。更确切地讲,set 不包含满足 e1.equals(e2) 的元素对 e1 和 e2,并且最多包含一个 null 元素。

Set继承Collection的所有方法,没有扩展了其他方法。

八、映射Map<K , V>

Map 接口提供三种collection 视图,允许以键集、值集或键-值映射关系集的形式查看某个映射的内容。

所有通用的映射实现类应该提供两个“标准的”构造方法:一个 void(无参数)构造方法,用于创建空映射;一个是带有单个 Map 类型参数的构造方法,用于创建一个与其参数具有相同键-值映射关系的新映射。实际上,后一个构造方法允许用户复制任意映射,生成所需类的一个等价映射。

Map继承Collection的所有方法,并扩展了其他方法:

函数

参数

功能

containsKey

(Object key)

如果此映射包含指定键的映射关系,则返回 true。

containsValue

(Object key)

如果此映射将一个或多个键映射到指定值,则返回 true。

entrySet

返回此映射中包含的映射关系的 Set 视图。

keySet

返回此映射中包含的键的 Set 视图。

put

(K key, V value)

将指定的值与此映射中的指定键关联。

putAll

(Map<? extends K,? extends V> m)

从指定映射中将所有映射关系复制到此映射中.

values

返回此映射中包含的值的 Collection 视图。

九、队列Queue<E>

Queue 实现通常不允许插入 null 元素,尽管某些实现(如 LinkedList)并不禁止插入 null。即使在允许 null 的实现中,也不应该将 null 插入到 Queue 中,因为 null 也用作 poll 方法的一个特殊返回值,表明队列不包含元素。

Queue继承Collection的所有方法,并扩展了其他方法:

函数

参数

方法

element

获取,但是不移除此队列的头。

offer

(E e)

将指定的元素插入此队列(如果立即可行且不会违反容量限制),当使用有容量限制的队列时,此方法通常要优于 add(E),后者可能无法插入元素,而只是抛出一个异常。

peek

获取但不移除此队列的头;如果此队列为空,则返回 null。

poll

获取并移除此队列的头,如果此队列为空,则返回 null。

remove

获取并移除此队列的头。

JAVA容器的更多相关文章

  1. 【Java心得总结七】Java容器下——Map

    我将容器类库自己平时编程及看书的感受总结成了三篇博文,前两篇分别是:[Java心得总结五]Java容器上——容器初探和[Java心得总结六]Java容器中——Collection,第一篇从宏观整体的角 ...

  2. 【Java心得总结六】Java容器中——Collection

    在[Java心得总结五]Java容器上——容器初探这篇博文中,我对Java容器类库从一个整体的偏向于宏观的角度初步认识了Java容器类库.而在这篇博文中,我想着重对容器类库中的Collection容器 ...

  3. 【Java心得总结五】Java容器上——容器初探

    在数学中我们有集合的概念,所谓的一个集合,就是将数个对象归类而分成为一个或数个形态各异的大小整体. 一般来讲,集合是具有某种特性的事物的整体,或是一些确认对象的汇集.构成集合的事物或对象称作元素或是成 ...

  4. Java 容器(list, set, map)

    java容器类库的简化图: (虚线框表示接口, 实线框表示普通的类, 空心箭头表示特定的类实现了接口, 实心箭头表示某个类可以生成箭头所指的类对象) 继承Collection的主要有Set 和 Lis ...

  5. Java - 容器详解

    一.ArrayList 长度可变数组,类似于c++ STL中的vector. 元素以线性方式连续存储,内部允许存放重复元素. 允许对元素进行随机的快速访问,但是向ArrayList中插入和删除元素的速 ...

  6. Java 容器:Collection 初探之 List

    1 ///: JavaBasic//com.cnblogs.pattywgm.day1//CollectionTest.java 2 3 package com.cnblogs.pattywgm.da ...

  7. java容器---集合总结

    思考为什么要引入容器这个概念? Java有多种方式保存对象(应该是对象的引用),例如使用数组时保存一组对象中的最有效的方式,如果你想保存一组基本类型的数据,也推荐使用这种方式,但大家知道数组是具有固定 ...

  8. 3)Java容器

    3)Java容器   Java的集合框架核心主要有三种:List.Set和Map.这里的 Collection.List.Set和Map都是接口(Interface). List lst = new ...

  9. Java 容器相关知识全面总结

    Java实用类库提供了一套相当完整的容器来帮助我们解决很多具体问题.因为我本身是一名Android开发者,包括我在内很多安卓开发,最拿手的就是ListView(RecycleView)+BaseAda ...

随机推荐

  1. OpenGL完整实例

    结合上一节的内容,分享完整代码. 先画一个cube,然后通过OnGestureListener去触发onFling使它旋转起来. OnGestureListener相关的方法我已经都加了注释,可以参考 ...

  2. 怎么解决/bin/sh: arm-linux-gcc: not found make

      1.arm-linux-gcc 环境变量没有设,所以找不到这个编译器 在/etc/profile里添加arm-linux-gcc的存放路径 sudo -s gedit /etc/profile 编 ...

  3. iOS学习之UI自定义cell

    一.自定义Cell 为什么需要自定义cell:系统提供的cell满足不了复杂的样式,因此:自定义Cell和自定义视图一样,自己创建一种符合我们需求的Cell并使用这个Cell.如下图所示的这些Cell ...

  4. java提高篇-----详解java的四舍五入与保留位

    转载:http://blog.csdn.net/chenssy/article/details/12719811 四舍五入是我们小学的数学问题,这个问题对于我们程序猿来说就类似于1到10的加减乘除那么 ...

  5. homework-01 "最大子数组之和"的解决过程

    看到这个题目,我首先想到就是暴力解决 求出所有的子数组的和,取出最大值即可 但其中是可以有优化的 如 子数组[3:6]可以用[3:5]+[6]来计算 即可以将前面的计算结果保留下来,减少后面的重复计算 ...

  6. 理解JavaScript中的事件路由冒泡过程及委托代理机制

    当我用纯CSS实现这个以后.我开始用JavaScript和样式类来完善功能. 然后,我有一些想法,我想使用Delegated Events (事件委托)但是我不想有任何依赖,插入任何库,包括jQuer ...

  7. 容器适配器之queue

    转载http://blog.csdn.net/thefutureisour/article/details/7751846容器适配器容器适配器其实就是一个接口转换装置,使得我们能用特定的方法去操作一些 ...

  8. CoffeeRobotTeam项目组报告

    一.小组分工 模块 任务 责任人 备注 报告 需求分析 熊振威 功能分析 熊振威 项目报告 熊振威 人机界面 秦勤.洪超 单元测试 姜进.张文强 机器人代码 机器人类 徐意.余拥军.孙智博 机器人运动 ...

  9. 为什么Linux的fdisk分区时第一块磁盘分区的First Sector是2048?

    这个问题曾经困扰我很久,在了解了MBR之后,我曾认为第一块分区之前为一个block.但是用fdisk查看是2048,一直不了解其中的缘由,今天查了一下资料,大概了解了,其中的细节留着慢慢去了解. 最直 ...

  10. svn 检出 Check out 请求的名称有效,但是找不到请求的类型的数据。

    根据问题不同有不同的解决方案,可按照以下方法进行解决1.取消TortoiseSVN-网络-代理2.确认SVN目录地址是否正确,可在浏览器中直接打开测试.如地址是由计算机名组成请改成Ip地址进行测试