java-集合2
浏览以下内容前,请点击并阅读 声明
下面对集中核心集合的接口分别总结
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的遍历有三种方法:
- 聚集操作
- for-each结构
- 使用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,否则返回falseaddAll
— 将指定集合的所有元素添加到目标集合中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的更多相关文章
- Java集合专题总结(1):HashMap 和 HashTable 源码学习和面试总结
2017年的秋招彻底结束了,感觉Java上面的最常见的集合相关的问题就是hash--系列和一些常用并发集合和队列,堆等结合算法一起考察,不完全统计,本人经历:先后百度.唯品会.58同城.新浪微博.趣分 ...
- Scala集合和Java集合对应转换关系
作者:Syn良子 出处:http://www.cnblogs.com/cssdongl 转载请注明出处 用Scala编码的时候,经常会遇到scala集合和Java集合互相转换的case,特意mark一 ...
- java集合你了解多少?
用了java集合这么久,还没有系统的研究过java的集合结构,今天亲自画了下类图,总算有所收获. 一.所有集合都实现了Iterable接口. Iterable接口中包含一个抽象方法:Iterator& ...
- 深入java集合学习1-集合框架浅析
前言 集合是一种数据结构,在编程中是非常重要的.好的程序就是好的数据结构+好的算法.java中为我们实现了曾经在大学学过的数据结构与算法中提到的一些数据结构.如顺序表,链表,栈和堆等.Java 集合框 ...
- Java集合框架List,Map,Set等全面介绍
Java集合框架的基本接口/类层次结构: java.util.Collection [I]+--java.util.List [I] +--java.util.ArrayList [C] +- ...
- Java集合框架练习-计算表达式的值
最近在看<算法>这本书,正好看到一个计算表达式的问题,于是就打算写一下,也正好熟悉一下Java集合框架的使用,大致测试了一下,没啥问题. import java.util.*; /* * ...
- 【集合框架】Java集合框架综述
一.前言 现笔者打算做关于Java集合框架的教程,具体是打算分析Java源码,因为平时在写程序的过程中用Java集合特别频繁,但是对于里面一些具体的原理还没有进行很好的梳理,所以拟从源码的角度去熟悉梳 ...
- Java 集合框架
Java集合框架大致可以分为五个部分:List列表,Set集合.Map映射.迭代器.工具类 List 接口通常表示一个列表(数组.队列.链表 栈),其中的元素 可以重复 的是:ArrayList 和L ...
- Java集合概述
容器,是用来装东西的,在Java里,东西就是对象,而装对象并不是把真正的对象放进去,而是指保存对象的引用.要注意对象的引用和对象的关系,下面的例子说明了对象和对象引用的关系. String str = ...
- 深入java集合系列文章
搞懂java的相关集合实现原理,对技术上有很大的提高,网上有一系列文章对java中的集合做了深入的分析, 先转载记录下 深入Java集合学习系列 Java 集合系列目录(Category) HashM ...
随机推荐
- 网站访问量大 怎样优化mysql数据库
MySQL优化的一些建议,单机MySQL的优化我分为三个部分,一是服务器物理硬件的优化,二是 MySQL安装时的编译优化,三是自身配置文件my.cnf的优化:如果单机的优化也解决不了你的数据库的压力的 ...
- JAVA教师:给JAVA初学者的忠告
我带过不少JAVA,C++班的课,来学习的同学很多都是初学者,一部分是急着找工作的,一部分是很感兴趣的.他们都想在短短一两个星期内掌握Java,这是不切实际的.而且这样做很容易让自己心浮气燥,难以静下 ...
- Solr学习总结(一)Solr介绍
最近一直在搞Solr的问题,研究Solr 的优化,搜索引擎的bug修改等,这几天终于有时间,闲下来总结分享,以便大家参考,与大家一起来共同学习. Solr是一个基于Lucene的全文搜索引擎,同 ...
- Ubuntu一路填坑...
1.安装 从ubuntu9.0开始,一路更新,越来越垃圾,更可恶的是工作上经常指定特定的版本,于是乎,我电脑里装了n个版本的ubuntu. Win7 + Ubuntu 15.10 1)装完win7之后 ...
- URL Schemes
APP 被唤醒离不开对URL Schemes的认知. 苹果选择沙盒来保障用户的隐私和安全,但沙盒也阻碍了应用间合理的信息共享,于是有了 URL Schemes 这个解决办法. URL Schemes ...
- [Head First设计模式]餐馆中的设计模式——命令模式
系列文章 [Head First设计模式]山西面馆中的设计模式——装饰者模式 [Head First设计模式]山西面馆中的设计模式——观察者模式 [Head First设计模式]山西面馆中的设计模式— ...
- can't debug windows service in win7 64bit
if encount below error: Solution: run the command “vsdiag_regwcf.exe -i” as admin in C:\Program File ...
- Linux date命令详解
1.显示时间 date命令可以按照指定格式显示日期,只键入date则以默认格式显示当前时间.如下: 如果需要以指定的格式显示日期,可以使用“+”开头的字符串指定其格式,详细格式如下: %n : 下一行 ...
- javascript基础02
javascript基础02 1.数据类型 数据类型的描述在上篇的扩展中有写到链接 由于ECMAScript数据类型具有动态性,因此的确没有再定义其他数据类型的必要.这句话很重要. 如果以后再数据类型 ...
- mysql查询语句select-子查询
1 子查询定义 在一个表表达中可以调用另一个表表达式,这个被调用的表表达式叫做子查询(subquery),我么也称作子选择(subselect)或内嵌选择(inner select).子查询的结果传递 ...