集合类

       Java集合类主要负责保存、盛装其他数据,因此集合类也称容器类。在编程过程种集合类(容器)可以自动的调整自己的尺寸,可以将任意数量的对象放置于容器内。

      Java集合类分为:Set、List、Map、Queue四大体系。其中Set代表无序、不可重复的集合;List代表有序、可重复的集合。Map代表具有映射关系的集合;Queue代表队列集合。 

      Java集合类主要由两个接口派生:Collection和Map,是集合框架的根接口。其中List必须按照插入的顺序保存元素;而Set不能有重复元素;Queue按照队列规则来确定对象顺序(通常与它们的被插入顺序相同);ArrayList允许使用数字来查找值,因此从某种意义上说,它将数字和对象联系起来了;而映射表允许使用一个对象查找另一个对象,它也被称为“关联数组”或者“字典”,因此可以使用键对象来查找值对象。

ps:所有的Collection'都可以用foreach语法遍历



下面就一一介绍四大接口及其实现类。

 

         Set具有与Collection一样的接口,因此没有任何额外的功能,实际上它就是Collection,只是行为不同。集合不允许包含相同的元素。set判断两个对象是否相同是根据equals方法。如果两个对象用equals方法返回的是true,set不会接受这两个对象。HashSet是set接口的典型实现,HashSet按哈希算法来存储集合中的元素,因此具有很好的存储和查找性能;专门对快速查找进行了优化。HashSet判断两个元素的标准是两个元素的equals方法比较相等,同时两个对象的hasCode()方法返回值也相等。另外HashSet所维护的顺序与TreeSet或LinkedHashSet都不同;它们的实现具有不同的元素存储方式。TreeSet将元素存储在红-黑树结构中;而HashSet使用的是散列函数。linkedHashSet因为查找速度的原因也使用了散列,但是加入了链表来维护元素的插入顺序。

       ps:  HashSet可以保存null元素。

       List集合代表一个有序集合。集合中的每个元素都有其对应的顺序索引。Arraylist和Vector是List接口的两个典型实现。他们之间的显著区别就是:vector是线性安全的,而Arraylist不是。它们两个都是基于数组实现的List类;长于随机访问元素,但是在List中间插入和移除元素时较慢。基于链表实现的LinkedList类,当插入、删除元素的速度非常快。这个类比较特殊,功能也特别多,即实现了List接口,也实现了Dueue接口(双向队列)。可以当成双向队列使用,也可以当成栈使用。

       Queue用于模拟队列的数据结构。队列是一种典型的先进先出容器,常被用来当作一种可靠的将对象从一个区域传递到另一个区域的途径;且在并发编程时特别重要,因为它们可以将对象安全的从一个任务传递到另一个任务。LinkedList提供了方法支持队列的行为实现,实现了Queue接口。PriorityQueue优先队列。

       将对象映射到其他对象的能力是解决编程问题的杀手锏,Map用于保存具有映射关系的数据。Map接口有如下几个常用的实现类:HashMap、HashTable、TreeMap。TreeMap是基于红黑树对TreeMap中所有key进行排序。HashMap和HashTable主要区别有两点:1、Hashtable是线性安全的,因此性能差些。2、HashMap可以使用null作为key或者value。

       集合类还提供了一个工具类Collections。主要用于查找、替换、同步控制、设置不可变集合。

       上面是对java集合类的一般概述,下面就set、list、map三者之间的关系进行剖析。

        Set与Map的关系。Map集合中所有key集中起来,就组成了一个set集合。所以Map集合提供Set<K> keySet()方法返回所有key组成的set集合。由此可见,Map集合中的所有key具有set集合的特征,只要Map所有的key集中起来,它就是一个Set集合,这就实现了Map到Set的转换。同时,如果把Map中的元素看成key-value的set集合,也可以实现从Set到Map之间的转换。

        HashSet和HashMap分别作为它们的实现类。两者之间也挺相似的。HashSet的实现就是封装了HashMap对象来存储元素。它们的本质是一样的。类似于HashSet和HashMap的关系,其实TreeMap和TreeSet本质也差不多,TreeSet底层也是依赖TreeMap实现。

       Map与List的关系。把Map的key-value分开来看,从另一个角度看,就可以把Map与List统一起来。Map集合是一个关联数组,key可以组成Set集合,Map中的value可以重复,所以这些value可以组成一个List集合。但是需要注意的是,实质Map的values方法并未返回一个List集合。而是返回一个不存储元素的Collection集合,换一种角度来看对List集合,它也包含了两组值,其中一组就是虚拟的int类型的索引,另一组就是list集合元素,从这个意思上看,List就相当于所有key都是int型的Map。

       下面讲解几个相似类之间的差异。

        ArrayList和LinkedList。ArrayList是一种顺序存储的线性表,其底层是采用数组实现的,而LinkedList是链式存储的线性表。其本质就是一个双向链表。对于随机存储比较频繁的元素操作应选用ArrayList,对于经常需要增加、删除元素应该选用LinkedList。但总的来说ArrayList的总体性能还是优于LinkedList。

       HashSet与HashMap的性能选项。主要有两个方面:容量和负载因子(尺寸/容量)。较低负载因子会增加查询数据的性能,但是会降低hash表所占的内存开销。较高负载因子则反之,一般对数据的查询比较频繁,所以一般情况下初始容量应该大一点,但也不能太大,否则浪费内存空间。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值