Java集合(上)

Java集合(上)

提纲

  • 集合的概念
  • Collection接口
  • Set接口及其实现类
  • List接口及其实现类
  • Map接口及其实现类
  • HashMap和HashSet的性能选项
  • Collections工具类

集合概述

  • 为了保存数量不确定的数据,以及保存具有映射关系的数据(也被称为关联数组)Java提供集合类,集合类主要负责保存、盛装其他的数据,因此集合类也被称为容器类。所有集合类都位于java.util包下。
  • Java的集合类主要由两个接口类派生而出:Collection和Map,Collection和Map是Java集合框架的根接口,这两个接口又包含了一些子接口或实现类

Collection集合

在这里插入图片描述

Map集合

在这里插入图片描述

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方法返回的元素

foreach循环遍历集合元素

  • 使用JDK 1.5提供的foreach循环来迭代访问集合元素更加便捷
  • 当使用foreach循环迭代访问集合元素时,该集合也不能被改变,否则将引发ConcurrentModificationException异常

使用Prediate操作集合

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

Java8新增的stream操作

  • Java8还新增了Stream、IntStream、LongStream、DoubleStream等流式API
  • 独立使用Stream的步骤如下:
  • 使用Stream或XxxStream的builder()类方法创建该Stream对应Builder
  • 重复调用Buider的add()方法向该流中添加多个元素
  • 调用Builder的build()方法获取对应的Stream
  • 调用Stream的聚集犯法
  • Collection接口提供了一个stream()默认方法,该方法可返回集合对应的流,接下来即可通过流API来造作集合元素。由于Stream可以对集合元素进行整体的聚集操作,因此Streanm极大丰富了集合的功能

HashSet类

  • HashSet时是Set接口的典型实现,大多时候使用Set集合时就是使用这个实现类。HashSet按Hash算法来存储集合中的元素,因此具有很好的存取和查找性能
  • 当向HashSet集合中存入一个元素时,HashSet会调用该对象的hashCode()方法来得到该对象的hashCode值,然后分局该HashCode值来决定该对象在HashSet中存储的位置。如果又两个元素通过equals()方法比较放回true,但他们的hashCode()方法返回值不相等,HashSet将会把它们存储在不同位置,也就可以添加成功

HashSet的特征

  • 不能保证元素的排列顺序,顺序可能与元素的添加顺序不同,元素的顺序可能发生变化,
  • HashSet不是同步的,如果多个线程同时访问一个HashSet,如果有2条或者2条以上线程同时修改了HashSet集合时,必须通过代码来保证其同步
  • 集合元素值可以是null

LinkedHashSet

  • LinkedHashSet集合也是根据元素hashCode值来决定元素存储位置,但它同时使用链表维护元素的次序,这样使得元素看起来是以插入的顺序保存的。也就是说,当遍历LinkedHashSet集合里元素时,HashSet将会按元素的添加顺序来访问集合里的元素
  • LinkedHashSet需要维护元素的插入顺序,因此性能略低于HashSet的性能,但在迭代器访问Set里的全部元素时将有很好的性能,因为它以链表来维护内部顺序

TreeSet

  • TreeSet是SortedSet接口的唯一实现,正如SoredSet名字所暗示的,TreeSet可以确保集合元素处于排序状态。与前面HashSet集合相比,TreeSet还提供了如下几个额外的方法:
    Object first(): 返回集合的第一个元素
  • Object last():返回集合中的最末一个元素
  • Object lower(Object e):返回集合中位于指定元素之前的元素(即小于指定元素的最大元素,参考元素不需要是TreeSet的元素)
  • Object higher(Object e):返回集合中位于指定元素之后的元素(即大于指定元素的最小元素,参考元素不需要是TreeSet的元素)
  • SortedSet subSet(fromElemnt,toElement):返回此Set的子集合,范围从formElement(包含)到toElement(不包含)
  • sortedSet headSet(toElement):返回此Set的子集,由小于toElement的元素组成
  • SortedSet tailSet(fromElement):返回此set的子集,由大于或等于fromElement的元素组成

TreeSet的排序

  • TreeSet采用红黑数的数据结构对元素进行排序。TreeSet支持两种排序方法:自然排序和定制排序
  • 自然排序:TreeSet会调用集合元和的copareTo(Object obj)方法来比较元素之间大小关系,然后将集合元素按升序排列,这种方法就是自然排列
  • 定制排列:TreeSet借助于Comparator接口的帮助。该接口里包含一个int compare(T ol,T 02)方法,该方法用于比较o1和o2的大小

EnumSet

  • EnumSet是一个专为枚举类设计的集合类,EnumSet中所有元素都必须是指定枚举类型的枚举类,该枚举类型在创建EuumSet时显式或者隐式地指定。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接口

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

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

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

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

Iterator(迭代),Enumeration(枚举)

  • 迭代时取出集合中元素的一种方式
  • 因为Collection中由iterator方法,所以每一个子类集合对象都具备迭代器
  • 用法:
for(Iterator iter=iterator();iter.hasNext();)
{
    System.out.println(iter,next());
}
//或者
Iterator iter=I.iterator;
while(iter.hasNext())
{
    System.out.println(iter.next());
}

选型注意事项

  • 迭代器在Collection接口中是通用的
  • 迭代器的next方法是自动向下取元素,要避免出现NoSuchElementException
  • 迭代器的next方法返回值类型是Object,所以要记得类型转换

比较Comparator

  • 比较函数强行对某些对象collection进行整体排序。可以将Comparatoe传递给sort方法(如 Collection.sort),从而允许在排序顺序上实现精确控制
public class User
{
    int a;
    String s;
    public User(int a,String s)
    {
        this.a=a;
        this.s=s;
    }
}
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值