各位大神好,我来求教集合的一些问题。ArrayList、LinkedList、Stack、Queue、HashSet、TreeSet、HashMap,TreeMap以上八个集合,请分别指出具体的使用场景。他们的区别和作用我都明白,但是我无法形象理解。请大神给我指点,在实际开发中,这八个集合分别在开发哪个功能的时候会用到,方便我形象的理解他们的作用。叩谢。

解决方案 »

  1.   

    ArrayList、LinkedList
    HashSet、TreeSet
    HashMap,TreeMap
    分为3组,在作为同一接口的实现使用时没有功能上的差异,只有性能上的差异。List,使用最广的集合,特点是有序,可重复。Map,这个使用也比较多,也比较特殊,因为它没有实现Collection接口,比如用于映射对象,映射数据库。比如某工具可以将对象映射为Map<String,Object>类型,便于转换为json。某框架可以将数据库数据映射为List<Map<String,Object>>类型。List+Map+基本数据类型已经可以用于表示很多复杂的数据类型。Set,特点是无序不重复(重复基于你如何重写equals()方法)。举一个我在项目中用到的例子,我需要遍历某一个图(图是顶点与边的集合),从某个顶点开始,使用广度优先的遍历,遍历出来的顶点再向下一级进行遍历。如果我使用List存放已经遍历过的顶点的话,对于图中如果存在环的话,那么将回到你遍历过的顶点从而导致死循环。这样就需要使用Set存放顶点和边。我的图可以定义为Map<String,Set<?>>类型
    (new xxMap("顶点",Vertex)和 new xxMap("边",Edge))。以上2种集合一般用到Hash实现比较多,但是要注意如果要正确使用Hash存储,需要你重写正确的hashCode()方法。Stack和Queue我也用得比较少。使场景用如其名:栈和队列栈比较经典的应用有比如括号匹配
    队列就更容易理解了,比如很多人去买票,但是售票窗口只有那么几个,把所有人放入队列里面,先进去的能够先买到票。值得一提的是LinkedList也是Queue的一种实现。
      

  2.   

    只是为了实现类似于数组的功能(实用性比数组强)就用List,包括ArrayList、LinkedList。具体用哪个List得看你业务需求,如果更新操作比较多,用ArrayList更好。List可以存在重复值。如果想实现没有重复值的数组就用Set,这种格式使用的情况也比较多,我在以此处理日期中曾经用到,需求是找到都是星期几执行了某个任务,直接循环把星期放入Set就行了,如果重复会自动去掉的。从效率上来说,HashSet好点。如果实现的是键值对,就是Map了,这个就是如果要求的格式不是数组类型的,自然就是Map。比如Web开发中从前端传递到后台,需要get得到数据,这种情况肯定是List和Set很难满足的。