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的遍历有三种方法:

  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 修改

原文地址:https://www.cnblogs.com/justforcon/p/6035924.html