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

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

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. 怎样学习Java

    JAVA自学之路 一:学会选择 ,当你要走向社会的时候,就不要再把自己当成学生,不要把自己的将来交给别人,学会运用自己的眼睛去观察,去了解这个世界吧. 我讲一个通过招聘网站的观察方法: http:// ...

  2. nltk27_NLTK聚类分析

    http://www.pythontip.com/blog/post/10044/ Python自然语言处理(三) -- 利用NLTK进行聚类 这篇文章介绍如何利用NLTK进行聚类,和上两篇文章Pyt ...

  3. php提供更快的文件下载

    在微博上偶然看到一篇介绍php更快下载文件的方法,其实就是利用web服务器的xsendfile特性,鸟哥的博客中只说了apache的实现方式,我找到了介绍nginx实现方式的文章,整理一下! let' ...

  4. EF唯一索引

    this.Property(p => p.Name) .IsRequired() .HasMaxLength()) .HasColumnAnnotation("Index", ...

  5. JAVA中获取当前系统时间及格式转换

    JAVA中获取当前系统时间   一. 获取当前系统时间和日期并格式化输出: import java.util.Date;import java.text.SimpleDateFormat; publi ...

  6. 大熊君JavaScript插件化开发------(实战篇之DXJ UI ------ ProcessBar)

    一,开篇分析 Hi,大家好!大熊君又和大家见面了,还记得前两篇文章吗.主要讲述了以“jQuery的方式如何开发插件”,以及过程化设计与面向对象思想设计相结合的方式是 如何设计一个插件的,两种方式各有利 ...

  7. Express知识整理

    开发实例 Express开发实例(1) —— Hello,world! Express开发实例(2) —— Jade模板引擎

  8. tyvj1125 JR's chop

    描述 JR有很多双筷子.确切的说应该是很多根,因为筷子的长度不一,很难判断出哪两根是一双的.JR家里来了K个客人,JR留下他们吃晚饭.加上JR,JR的girl friend和JR的朋友内涵,共K+3个 ...

  9. 清北学堂模拟赛day7 数字碰撞

    /* clj:水题别人都满分你不是你就完了,所以说水题一定要细心一点,有这么几个细节:①前导零的处理,全是零的时候要特判②换行要注意,不要多大一行,剩下就是水水的模拟了 */ #include< ...

  10. 如何删除PHP数组中的元素,并且索引重排(unset,array_splice)?

    如果要在某个数组中删除一个元素,可以直接用的unset,但是数组的索引不会重排: <?php $arr = array('a','b','c','d'); unset($arr[1]); pri ...