服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > JAVA > 高级技术 > 设计模式 > 查看文档

两种java容器类list和set分析

容器类可以大大提高编程效率和编程能力,在java2中,所有的容器都由sun公司的joshua bloch进行了重新设计,丰富了容器类库的功能。 

  java2容器类类库的用途是“保存对象”,它分为两类: 

  collection----一组独立的元素,通常这些元素都服从某种规则。list必须保持元素特定的顺序,而set不能有重复元素。 

  map----一组成对的“键值对”对象,即其元素是成对的对象,最典型的应用就是数据字典,并且还有其它广泛的应用。另外,map可以返回其所有键组成的set和其所有值组成的collection,或其键值对组成的set,并且还可以像数组一样扩展多维map,只要让map中键值对的每个“值”是一个map即可。 

  1.迭代器 

  迭代器是一种设计模式,它是一个对象,它可以遍历并选择序列中的对象,而开发人员不需要了解该序列的底层结构。迭代器通常被称为“轻量级”对象,因为创建它的代价小。 

  java中的iterator功能比较简单,并且只能单向移动: 

  (1) 使用方法iterator()要求容器返回一个iterator。第一次调用iterator的next()方法时,它返回序列的第一个元素。 

  (2) 使用next()获得序列中的下一个元素。 

  (3) 使用hasnext()检查序列中是否还有元素。 

  (4) 使用remove()将迭代器新返回的元素删除。 

  iterator是java迭代器最简单的实现,为list设计的listiterator具有更多的功能,它可以从两个方向遍历list,也可以从list中插入和删除元素。 

  2.list的功能方法 

  list(interface): 次序是list最重要的特点;它确保维护元素特定的顺序。list为collection添加了许多方法,使得能够向list中间插入与移除元素(只推荐linkedlist使用)。一个list可以生成listiterator,使用它可以从两个方向遍历list,也可以从list中间插入和删除元素。 

  arraylist: 由数组实现的list。它允许对元素进行快速随机访问,但是向list中间插入与移除元素的速度很慢。listiterator只应该用来由后向前遍历arraylist,而不是用来插入和删除元素,因为这比linkedlist开销要大很多。 

  linkedlist: 对顺序访问进行了优化,向list中间插入与删除得开销不大,随机访问则相对较慢(可用arraylist代替)。它具有方法addfirst()、addlast()、getfirst()、getlast()、removefirst()、removelast(),这些方法(没有在任何接口或基类中定义过)使得linkedlist可以当作堆栈、队列和双向队列使用。 

  3.set的功能方法 

  set(interface): 存入set的每个元素必须是唯一的,因为set不保存重复元素。加入set的object必须定义equals()方法以确保对象的唯一性。set与collection有完全一样的接口。set接口不保证维护元素的次序。 

  hashset: 为快速查找而设计的set。存入hashset的对象必须定义hashcode()。 

  treeset: 保持次序的set,底层为树结构。使用它可以从set中提取有序的序列。 

  linkedhashset: 具有hashset的查询速度,且内部使用链表维护元素的顺序(插入的次序)。于是在使用迭代器遍历set时,结果会按元素插入的次序显示。 

  hashset采用散列函数对元素进行排序,这是专门为快速查询而设计的;treeset采用红黑树的数据结构进行排序元素;linkedhashset内部使用散列以加快查询速度,同时使用链表维护元素的次序,使得看起来元素是以插入的顺序保存的。需要注意的是,生成自己的类时,set需要维护元素的存储顺序,因此要实现comparable接口并定义compareto()方法。 

扫描关注微信公众号