浏览以下内容前,请点击并阅读 声明

下面对集中核心集合的接口分别总结

Collection接口

一般情况下,集合的实现类会有一个含有Collection类型为参数的构造器,可以由一个指定的集合类创建该实现类的对象,能够实现集合类型的相互转化。

Collection包含一些执行基本操作的方法,如int size(), boolean isEmpty(), boolean contains(Object element), boolean add(E element), boolean remove(Object element),和 Iterator<E> iterator(),另外还有对于集合整体操作的方法,如boolean containsAll(Collection<?> c), boolean addAll(Collection<? extends E> c), boolean removeAll(Collection<?> c), boolean retainAll(Collection<?> c), 和 void clear(),此外还有数组的操作,如Object[] toArray()<T> T[] toArray(T[] a)

Collectio 遍历

collection的遍历有三种方法:

  1. 聚集操作
  2. for-each结构
  3. 使用Iterator

以下对三种方法分开总结

聚集操作

jdk8以后,使用聚集方法进行集合的遍历成为首选,集合操作通常与lambda表达式结合,能够增强代码的表达性与简洁性,如下例所示:

myShapesCollection.stream()
.filter(e -> e.getColor() == Color.RED)
.forEach(e -> System.out.println(e.getName()));

for-each结构

与数组的遍历相同:

for (Object o : collection)
System.out.println(o);

Iterators

Iterator是一个能够遍历一个集合同时能够选择性地处理集合中的元素,可以调用集合的iterator方法获得Iterator对象,以下是Iterator接口的声明:

public interface Iterator<E> {
boolean hasNext();
E next();
void remove();
}

接口中,如果Iterator对象还有更多的元素,则hasNext返回true,next方法返回下一个元素,next方法成功返回一个元素以后,可以用remove方法从集合中移除该元素,remove在一次使用next方法后只能使用一次,否则将抛出异常。

Iterator.remove是更改一个集合的唯一安全的方式,当一个集合处于Iterator遍历过程中时,对其进行其他操作的更改,后果是不可知的。

以下情况请使用Iterator而不是for-each结构:

  • 移除当前的元素。for-each会将Iterator隐藏,因此不能使用remove方法,所以for-each结构不适用于对集合的过滤。
  • 同时遍历多个集合。

批量操作

以下是Collection的批量操作:

  • containsAll — 如果目标集合包含指定的集合的所有元素,则返回true,否则返回false
  • addAll — 将指定集合的所有元素添加到目标集合中
  • removeAll —移除目标集合中目标集合和指定集合所共有的所有元素
  • retainAll — 移除目标集合中,所有不被指定集合包含的元素
  • clear —移除目标集合中所有的元素

如果成功目标集合进行了更改,addAll, removeAll, 和 retainAll就会返回true。

数组操作

toArray方法作用是桥接结合和一些需要数组作为输入的老的API,能够将Collection对象的内容转换成数组:

//以下语句创建一个长度和c相同的数组,并赋值给a
Object[] a = c.toArray();
//如果c中仅含有String对象,以下语句创建一个内容与c相同的字符串数组
String[] a = c.toArray(new String[0]);

Set接口

Set接口仅仅是继承了Collection的所有方法,并且对与元素的重复性进行了限制,此外,Set的equals和hashCode方法也有更强的功能,即使Set对象的实现类型不同也能够进行有意义的比较,如果两个Set实例含有相同的元素,则可以视为相等。

Java平台提供了三种通用的Set实现类,HashSet,TreeSet和LinkedHashSet,HashSet将其元素存储在一张hash表中,是性能最优的Set实现类,然而它并不保证其遍历元素的顺序。TreeSet将其元素存储在一张红-黑树中,其元素按照它们各自的值排列,性能上比HashSet弱一些,LinkedHashSet是以一张hash表实现的,同时会运行一个关联列表,其元素按照它们插入Set对象的先后顺序排列,能够保证其顺序,然而其性能会更差一些。

//创建Set语句,以下语句由集合c创建一个LinkedHashSet对象,自动去除重复的元素
Collection<Type> noDups = new LinkedHashSet<Type>(c);

Set接口的基本操作

与大部分的方法与Collection接口的方法相同,add方法能够向Set实例对象添加一个元素,如果该对象中已经存在该对象,则添加失败,返回false,否则添加成功,返回true。

Set批量操作

Set的批量操作也是继承了Collection的批量操作方法,此外,可使用其批量操作方法进行一些联合操作,如取交集并集等。

List接口

List(列表)是一个有序的集合,List可以包含重复的元素,除了从Collection继承的方法之外,List接口还可以进行如下操作:

  • 定位访问能够根据元素的序号位置操作元素,如get,set,add,addAll和remove方法等等。
  • 搜索 — 在列表中搜索指定的对象,返回该对象的数字序号,搜索方法包含indexOf和lastIndexOf方法
  • 迭代子 — 拓展了迭代子字面意思,充分利用了列表的序列性质,listIterator方法提供了这一功能
  • 范围视图 — sublist方法能够提供对列表中任意范围内元素的操作

java有两个通用的List接口实现类,ArrayList(性能较好)和LinkedList(在特定情况下有较好的性能)。

集合操作

List接口的集合操作方法与从Collection继承的方法作用效果相同,remove方法会移除列表中首次出现的指定的元素,而add和addAll方法则会将指定的元素添加到列表的最后。

和Set类似,List也对equals和hashCode方法的实现要求做了加强,因此即使两个List对象实现类型不同也能进行逻辑对等性的判断,如果两个List对象含有相同的元素和排列顺序相同则视为相等。

定位访问与搜索操作

基本的定位访问操作方法包括get,set,add和remove,其中set和remove方法返回该方法被更改或者被移除的元素的旧值,而其他的操作方法(如indexOf,lastIndexOf)返回指定元素的序号。

List的addAll方法将指定的Collection对象的所有元素从指定的位置开始插入,插入顺序按照Collection调用iterator方法的到的迭代子的迭代的顺序,该方法与Collection的addAll方法功能类似,只是指定了插入的位置。

Arrays对象有一个静态的方法asList,可以将一个数组看作是List对象,而该方法实际上并没有对数组进行复制,产生一个新的列表对象,如果对数组进行更改,则List对象也会改变,反之亦然。asList返回的List对象并不是通用的List实例,因为它没有实现add和remove方法。

//创建一个字符串数组
String[] a={"a","b"};
List<String> aa=java.util.Arrays.asList(a);
//改变数组产生的List对象
aa.set(0,"aa");
System.out.println(a[0]) ;
//输出为 aa
//如果调用add或者remove方法,则会抛出异常

迭代器

List的iterator方法返回按一定序列的雷暴,而listIterator方法则返回一个功能更加丰富的ListIterator迭代器,能够按照任意方向迭代,在遍历过程中进行元素的操作,并且能够获得当前迭代的位置。

ListIterator继承了Iterator的hasNext,next和remove方法,作用相同,此外ListIterator还有previous和hasPrevious方法,作用分别是返回当前游标的前一个元素和判断当前游标是否前面还有元素,previous向前迭代,而next向后迭代。

listIterator可以没有参数,此时返回的迭代器从List对象的最开始迭代,当传入一个整型的参数时,迭代器从该整数的位置开始迭代,即迭代器的索引号,索引号与List对象的元素的关系如下图所示:

index(索引号)从零开始,到元素(element)的个数结束。

范围视图

范围-视图操作由方法subList(int fromIndex,int toIndex)完成,该方法返回List对象中索引号从fromIndex到toIndex之间的的元素的List范围视图。

subList方法返回的List视图能够使用List的所有操作:

//从list中移除一部分元素
list.subList(fromIndex, toIndex).clear();
//返回list中指定的List范围视图中的指定元素的索引号
int i = list.subList(fromIndex, toIndex).indexOf(o);
int j = list.subList(fromIndex, toIndex).lastIndexOf(o);

注意,虽然List范围视图如此强大,但它也有较大局限性,如果一个List对象生成了一个List范围视图,则List对象只能通过List范围视图来增加或者移除元素,否则List范围视图就会无效,因此,建议List范围视图只是短时间使用,不过,可以通过List对象产生的List范围视图进一步产生一个List范围视图来更改后台的List对象:

//lis为List对象list的List范围视图
List<String> lis=list.subList(0, 2);
//对list进行移除元素操作
list.remove("a");
//上述操作后,lis无效,抛出异常
System.out.println(lis.size());
//两次使用subList方法
list.subList(0, 2).subList(0, 2).remove(1);

2016-11-29 20:58:13 修改

java-集合2的更多相关文章

  1. Java集合专题总结(1):HashMap 和 HashTable 源码学习和面试总结

    2017年的秋招彻底结束了,感觉Java上面的最常见的集合相关的问题就是hash--系列和一些常用并发集合和队列,堆等结合算法一起考察,不完全统计,本人经历:先后百度.唯品会.58同城.新浪微博.趣分 ...

  2. Scala集合和Java集合对应转换关系

    作者:Syn良子 出处:http://www.cnblogs.com/cssdongl 转载请注明出处 用Scala编码的时候,经常会遇到scala集合和Java集合互相转换的case,特意mark一 ...

  3. java集合你了解多少?

    用了java集合这么久,还没有系统的研究过java的集合结构,今天亲自画了下类图,总算有所收获. 一.所有集合都实现了Iterable接口. Iterable接口中包含一个抽象方法:Iterator& ...

  4. 深入java集合学习1-集合框架浅析

    前言 集合是一种数据结构,在编程中是非常重要的.好的程序就是好的数据结构+好的算法.java中为我们实现了曾经在大学学过的数据结构与算法中提到的一些数据结构.如顺序表,链表,栈和堆等.Java 集合框 ...

  5. Java集合框架List,Map,Set等全面介绍

    Java集合框架的基本接口/类层次结构: java.util.Collection [I]+--java.util.List [I]   +--java.util.ArrayList [C]   +- ...

  6. Java集合框架练习-计算表达式的值

    最近在看<算法>这本书,正好看到一个计算表达式的问题,于是就打算写一下,也正好熟悉一下Java集合框架的使用,大致测试了一下,没啥问题. import java.util.*; /* * ...

  7. 【集合框架】Java集合框架综述

    一.前言 现笔者打算做关于Java集合框架的教程,具体是打算分析Java源码,因为平时在写程序的过程中用Java集合特别频繁,但是对于里面一些具体的原理还没有进行很好的梳理,所以拟从源码的角度去熟悉梳 ...

  8. Java 集合框架

    Java集合框架大致可以分为五个部分:List列表,Set集合.Map映射.迭代器.工具类 List 接口通常表示一个列表(数组.队列.链表 栈),其中的元素 可以重复 的是:ArrayList 和L ...

  9. Java集合概述

    容器,是用来装东西的,在Java里,东西就是对象,而装对象并不是把真正的对象放进去,而是指保存对象的引用.要注意对象的引用和对象的关系,下面的例子说明了对象和对象引用的关系. String str = ...

  10. 深入java集合系列文章

    搞懂java的相关集合实现原理,对技术上有很大的提高,网上有一系列文章对java中的集合做了深入的分析, 先转载记录下 深入Java集合学习系列 Java 集合系列目录(Category) HashM ...

随机推荐

  1. vim编辑器的使用

    I 在光标所在行的行首插入 A 在光标所在行的行尾插入 { 移动到上一段 } 移动到下一段 空格向后移动一格 H 屏幕顶部 M 屏幕中间 L 屏幕下方 n| 使光标移动到第几个字符处 ngg 移动到制 ...

  2. c# .Net :Excel NPOI导入导出操作教程之List集合的数据写到一个Excel文件并导出

    将List集合的数据写到一个Excel文件并导出示例: using NPOI.HSSF.UserModel;using NPOI.SS.UserModel;using System;using Sys ...

  3. 自然语言25_nltk.book

    测试NLTK数据包 导入nltk.book包中所有的东西: 能使用以下函数的是nltk.text.Text对象 from nltk.book import * text1.concordance(&q ...

  4. C# 调用C++ SDK/API的问题总结

    1.回调函数的使用 c++的回调函数如下所示: typedef void (CALLBACK *Data)(long lHandle, DATA_TYPE eDataType, unsigned ch ...

  5. [NHibernate]一对多关系(关联查询)

    目录 写在前面 文档与系列文章 一对多查询 总结 写在前面 上篇文章介绍了nhibernate的一对多关系如何配置,以及级联删除,级联添加数据的内容.这篇文章我们将学习nhibernate中的一对多关 ...

  6. jQuery入门(4)jQuery中的Ajax应用

    jQuery入门(1)jQuery中万能的选择器 jQuery入门(2)使用jQuery操作元素的属性与样式 jQuery入门(3)事件与事件对象 jQuery入门(4)jQuery中的Ajax()应 ...

  7. 【Alpha版本】冲刺阶段——Day 10

    我说的都队 031402304 陈燊 031402342 许玲玲 031402337 胡心颖 03140241 王婷婷 031402203 陈齐民 031402209 黄伟炜 031402233 郑扬 ...

  8. 局域网中共享Lantern上网

    Lantern作为一款非常好用的上网软件,深受大家喜爱,但是由于目前没有ios版,所以iPhone用户上网很麻烦,这里介绍一下如何共享Lantern使局域网内的设备都能正常上网. 1.电脑端设置:右键 ...

  9. iOS开发——高级篇——音频、音乐播放(封装类)

    一.简介 简单来说,音频可以分为2种音效又称“短音频”,通常在程序中的播放时长为1~2秒在应用程序中起到点缀效果,提升整体用户体验 音乐比如游戏中的“背景音乐”,一般播放时间较长 播放音频可以使用框架 ...

  10. Java Native Interfce三在JNI中使用Java类的普通方法与变量

    本文是<The Java Native Interface Programmer's Guide and Specification>读书笔记 前面我们学习了如何在JNI中通过参数来使用J ...