大内高手社区

标题: Java Collection类 [打印本页]

作者: 花不败    时间: 2021-12-23 16:11
标题: Java Collection类
  Collection是最基本的集合接口,一个Collection代表一组Object,即Collection的元素(Elements)。JavaSDK不提供直接继承自Collection的类,JavaSDK提供的类都是继承自Collection的“子接口”如List和Set。

  一、语法

  publicinterfaceCollection<E>extendsIterable<E>{}

  它是一个接口,是高度抽象出来的集合,它包含了集合的基本操作:添加、删除、清空、遍历(读取)、是否为空、获取大小、是否保护某元素等等。

  二、方法

  booleanadd(Ee)

  确保此collection包含指定的元素(可选操作)。

  booleanaddAll(Collectionc)

  将指定collection中的所有元素都添加到此collection中(可选操作)。

  voidclear()

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

  booleancontains(Objecto)

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

  booleancontainsAll(Collectionc)

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

  booleanequals(Objecto)

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

  inthashCode()

  返回此collection的哈希码值。

  booleanisEmpty()

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

  Iteratoriterator()

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

  booleanremove(Objecto)

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

  booleanremoveAll(Collectionc)

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

  booleanretainAll(Collectionc)

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

  intsize()

  返回此collection中的元素数。

  Object[]toArray()

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

  T[]toArray(T[]a)

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

  三、iterator接口

  不论Collection的实际类型如何,它都支持一个iterator()的方法,该方法返回一个迭代子,使用该迭代子即可逐一访问Collection中每一个元素。iterator方法如下:

  booleanhasNext()

  如果仍有元素可以迭代,则返回true。

  Enext()

  返回迭代的下一个元素。

  voidremove()

  从迭代器指向的集合中移除迭代器返回的最后一个元素(可选操作)。

  Iterator实例

  Iteratorit=collection.iterator();//获得一个迭代子

  while(it.hasNext()){

  Objectobj=it.next();//得到下一个元素

  }

  四、继承体系

  Collection

  |-----List有序(存储顺序和取出顺序一致),可重复

  |----ArrayList,线程不安全,底层使用数组实现,查询快,增删慢,效率高。

  |----LinkedList,线程不安全,底层使用链表实现,查询慢,增删快,效率高。

  |----Vector,线程安全,底层使用数组实现,查询快,增删慢,效率低。每次容量不足时,默认自增长度的一倍(如果不指定增量的话),如下源码可知

  |-----Set元素唯一一个不包含重复元素的collection。更确切地讲,set不包含满足e1.equals(e2)的元素对e1和e2,并且最多包含一个null元素。

  |--HashSet底层是由HashMap实现的,通过对象的hashCode方法与equals方法来保证插入元素的唯一性,无序(存储顺序和取出顺序不一致),。

  |--LinkedHashSet底层数据结构由哈希表和链表组成。哈希表保证元素的唯一性,链表保证元素有序。(存储和取出是一致)

  |--TreeSet基于TreeMap的NavigableSet实现。使用元素的自然顺序对元素进行排序,或者根据创建set时提供的Comparator进行排序,具体取决于使用的构造方法。元素唯一。

  Collection包含了List和Set两大分支:

  1)、List是一个有序的队列,每一个元素都有它的索引,第一个元素的索引值是0。List的实现类有LinkedList、ArrayList、Vector和Stack。

  (1)、LinkedList实现了List接口,允许元素为空,LinkedList提供了额外的get,remove,insert方法,这些操作可以使LinkedList被用作堆栈、队列或双向队列。

  LinkedList并不是线程安全的,如果多个线程同时访问LinkedList,则必须自己实现访问同步,或者另外一种解决方法是在创建List时构造一个同步的List。

  (2)、ArrayList实现了可变大小的数组,允许所有元素包括null,同时ArrayList也不是线程安全的。

  (3)、Vector类似于ArrayList,但Vector是线程安全的。

  (4)、Stack继承自Vector,实现一个后进先出的堆栈。

  2)、set是一个不允许有重复元素的集合。set的实现类有Hashset和Treeset。HashSet依赖于HashMap,实际上是通过HashMap实现的;TreeSet依赖于TreeMap,通过TreeMap来实现的。

  五、总结

  (1)如果涉及到堆栈,队列等操作,应该考虑用List;对于需要快速插入,删除元素,应该使用LinkedList;如果需要快速随机访问元素,应该使用ArrayList。

  (2)如果程序在单线程环境中,或者访问仅仅在一个线程中进行,考虑非同步的类,其效率较高;如果多个线程可能同时操作一个类,应该使用同步的类。

  (3)要特别注意对哈希表的操作,作为key的对象要正确复写equals和hashCode方法。

  (4)尽量返回接口而非实际的类型,如返回List而非ArrayList,这样如果以后需要将ArrayList换成LinkedList时,客户端代码不用改变。这就是针对抽象编程。

  六、例子

  publicclassCollectionReview{

  publicstaticvoidmain(String[]args){

  test1();

  }

  privatestaticvoidtest1(){

  Collection<String>collection=newVector<>();

  collection.add("gogogo");

  collection.add("pap");

  collection.add("niko");

  collection.add("kitty");

  Collection<String>coll=newArrayList<>();

  coll.add("niko");

  coll.add("kitty");

  coll.add("pecuyu");

  //collection.clear();//清空集合

  //System.out.println(collection.isEmpty());//集合是否为空

  //intsize=collection.size();//获取集合大小

  //System.out.println(size);

  //booleancontains=collection.contains("niko");//是否包含另一个元素

  //System.out.println(contains);

  //booleancontainsAll=collection.containsAll(coll);//是否完全包含另一个集合

  //System.out.println(containsAll);

  //collection.remove("kitty");//删除第一个匹配项,删除了匹配项则返回true

  //booleanremoveAll=collection.removeAll(coll);//删除与指定集合有交集的部分,原集合有改变就返回true

  //System.out.println(removeAll);

  //booleanretainAll=collection.retainAll(coll);//保留与指定集合有交集的部分,原集合有改变就返回true

  //System.out.println(retainAll);

  //iterator迭代器,方式1

  Iterator<String>iterator=collection.iterator();

  while(iterator.hasNext()){

  System.out.print(iterator.next()+"");

  }

  System.out.println("\n"+"-------------------");

  //方式2,for循环完iterator1就会被销毁,节约内存提高效率

  for(Iterator<String>iterator1=collection.iterator();iterator1.hasNext();){

  System.out.print(iterator1.next()+"");

  }

  System.out.println("\n"+"-------------------");

  Object[]array=collection.toArray();//转化为object数组

  for(Objectstring:array){

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

  }

  System.out.println("\n"+"-------------------");

  String[]arr=newString[collection.size()];

  String[]array2=collection.toArray(arr);//指定要转化的数组类型

  for(Stringstring:array2){

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

  }

  }





欢迎光临 大内高手社区 (https://bbs.tedu.cn/) Powered by Discuz! X3.4