Java集合

集合概述


•Java提供集合类,集合类主要负责保存、盛装其他数据,因此集合类也被称为容器类。所有集合类都位于java.util包下。

•Java的集合类主要由两个接口派生而出:Collection和Map,Collection和Map是Java集合框架的根接口,这两个接口又包含了一些子接口或实现类。


Collection集合



•Collection接口是List、Set和Queue接口的父接口,该接口里定义的方法既可用于操作Set集合,也可用于操作List和Queue集合。                  •Collection提供了大量添加、删除、访问的方法来访问集合元素。


Iterator接口


•Iterator接口也是Java集合框架的成员,但它与Collection系列、Map系列的集合不一样:Collection系列集合、Map系列集合主要用于盛装其他对象,而Iterator则主要用于遍历(即迭代访问)Collection集合中的元素,Iterator对象也被称为迭代器。

•Iterator接口里定义了如下4个方法:

–boolean hasNext():如果被迭代的集合还元素没有被遍历,则返回true。

–Object next():返回集合里下一个元素。

–void remove() :删除集合里上一次next方法返回的元素

–void forEachRemaining(Consumer action),这是Java 8为Iterator新增的默认方法,该方法可使用Lambda表达式来遍历集合元素。

•使用JDK1.5提供的foreach循环来迭代访问集合元素更加便捷。

•当使用foreach循环迭代访问集合元素时,该集合也不能被改变,否则将引发ConcurrentModificationException异常。

•Java8为Collection集合新增了一些需要Predicate参数的方法,这些方法可以对集合元素进行过滤。程序可使用Lambda表达式构建Predicate对象。

Java8新增的Stream操作


•Java 8还新增了Stream、IntStream、LongStream、DoubleStream等流式API。

•独立使用Stream的步骤如下:

–(1)使用Stream或XxxStream的builder()类方法创建该Stream对应Builder。

–(2)重复调用Builder的add()方法向该流中添加多个元素。

–(3)调用Builder的build()方法获取对应的Stream。

–(4)调用Stream的聚集方法。

•Collection接口提供了一个stream()默认方法,该方法可返回该集合对应的流,接下来即可通过流API来操作集合元素。由于Stream可以对集合元素进行整体的聚集操作,因此Stream极大了丰富了集合的功能。

HashSet类


•HashSet是Set接口的典型实现,大多时候使用Set集合时就是使用这个实现类。HashSet按Hash算法来存储集合中的元素,因此具有很好的存取和查找性能。

•当向HashSet集合中存入一个元素时,HashSet会调用该对象的hashCode()方法来得到该对象的hashCode值,然后根据该HashCode值来决定该对象在HashSet中存储位置。如果有两个元素通过equals方法比较返回true,但它们的hashCode()方法返回值不相等,HashSet将会把它们存储在不同位置,也就可以添加成功。

•不能保证元素的排列顺序,顺序可能与元素的添加顺序不同,元素的顺序可能变化。

•HashSet不是同步的,如果多个线程同时访问一个HashSet,如果有2条或者2条以上线程同时修改了HashSet集合时,必须通过代码来保证其同步。

•集合元素值可以是null。

LinkedHashSet集合也是根据元素hashCode值来决定元素存储位置,但它同时使用链表维护元素的次序,这样使得元素看起来是以插入的顺序保存的。也就是说,当遍历LinkedHashSet集合里元素时,HashSet将会按元素的添加顺序来访问集合里的元素。

LinkedHashSet需要维护元素的插入顺序,因此性能略低于HashSet的性能,但在迭代访问Set里的全部元素时将有很好的性能,因为它以链表来维护内部顺序。

TreeSet是SortedSet接口的唯一实现,正如SortedSet名字所暗示的,TreeSet可以确保集合元素处于排序状态。与前面HashSet集合相比,TreeSet还提供了如下几个额外的方法:

–Object first():返回集合中的第一个元素。

–Object last():返回集合中的最末一个元素。

–Object lower(Object e):返回集合中位于指定元素之前的元素(即小于指定元素的最大元素,参考元素不需要是TreeSet的元素)。

–Object higher(Object e):返回集合中位于指定元素之后的元素(即大于指定元素的最小元素,参考元素不需要是TreeSet的元素)。

–SortedSet subSet(fromElement, toElement):返回此Set的子集合,范围从fromElement(包含)到toElement(不包含)。

–SortedSet headSet(toElement):返回此Set的子集,由小于toElement的元素组成。

–SortedSet tailSet(fromElement):返回此Set的子集,由大于或等于fromElement的元素组成。

•TreeSet采用红黑树的数据结构对元素进行排序。TreeSet支持两种排序方法:自然排序和定制排序。

–自然排序:TreeSet会调用集合元素的compareTo(Object obj)方法来比较元素之间大小关系,然后将集合元素按升序排列,这种方式就是自然排列。

–定制排序:TreeSet借助于Comparator接口的帮助。该接口里包含一个的int compare(T o1, T o2)方法,该方法用于比较o1和o2的大小。

EnumSet是一个专为枚举类设计的集合类,EnumSet中所有元素都必须是指定枚举类型的枚举值,该枚举类型在创建EnumSet时显式或隐式地指定。EnumSet的集合元素也是有序的,EnumSet以枚举值在Enum类的定义顺序来决定集合元素的顺序。

•EnumSet在内部以位向量的形式存储,这种存储形式非常紧凑、高效,因此EnumSet对象占用内存很小,而且运行效率很好。尤其是当进行批量操作(如调用containsAll 和 retainAll方法)时,如其参数也是EnumSet集合,则该批量操作的执行速度也非常快。

•EnumSet集合不允许加入null元素。如果试图插入null元素,EnumSet将抛出 NullPointerException异常。如果仅仅只是试图测试是否出现null元素、或删除null元素都不会抛出异常,只是删除操作将返回false,因为没有任何null元素被删除。

List接口


•List集合代表一个有序集合,集合中每个元素都有其对应的顺序索引。List集合允许使用重复元素,可以通过索引来访问指定位置的集合元素。因为List集合默认按元素的添加顺序设置元素的索引,例如第一次添加的元素索引为0,第二次添加的元素索引为1……

•List作为Collection接口的子接口,当然可以使用Collection接口里全部方法。而且由于List是有序集合,因此List集合里包含了根据索引来操作集合元素的方法。

ListIterator与Iterator接口不同,它不仅可以向后迭代,它还可以向前迭代。

ListIterator包含增加了如下3个方法:

–boolean hasPrevious():返回该迭代器关联的集合是否还有上一个元素。

–Object previous():返回该迭代器的上一个元素。

–void add():在指定位置插入一个元素。

Iterator(迭代)


•迭代是取出集合中元素的一种方式。

•因为Collection中有iterator方法,所以每一个子类集合对象都具备迭代器。

用法:

for(Iterator iter =iterator();iter.hasNext();  )

{

  System.out.println(iter.next());

}

Iterator iter =l.iterator();

while(iter.hasNext())

{

  System.out.println(iter.next());

}

•迭代器在Collcection接口中是通用的。

•迭代器的next方法是自动向下取元素,要避免出现NoSuchElementException。

•迭代器的next方法返回值类型是Object,所以要记得类型转换。

key和value都可以是任何引用类型的数据。Map的key不允许重复,即同一个Map对象的任何两个key通过equals方法比较总是返回false。
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 一:基本概念 Java的所有集合都放在java.util包下,集合跟数组不同之处在于前者只能保存对象(对象的引...
    Febers阅读 453评论 0 0
  • 以下是《疯狂Java讲义》中的一些知识,如有错误,烦请指正。 集合概述 Java集合可以分为Set、List、Ma...
    hainingwyx阅读 561评论 0 1
  • 集合概述 集合用来储存数量不等的对象,且只能保存对象,实际保存的是对象的引用变量 主要由两个接口派生而出,Coll...
    Utte阅读 401评论 0 0
  • 3.3 集合 一方面, 面向对象语言对事物的体现都是以对象的形式,为了方便对多个对象的操作,就要对对象进行存储。另...
    闫子扬阅读 762评论 0 1
  • 把相片 让你能保存 多洗一本 毛衣 也为你多备一层 但是 你孤单时刻 安慰的体温 怎么为你 多留一份 我不愿让你一...
    啊嘉啊嘉阅读 304评论 0 0