Collection

Collection在JAVA的基础中是非常重要的部份,它会占了一整个章节,而Collection主要的内容如下图:

 

我们在下方大概的解释一下每个相应的Class。

List、ArrayList、LinkedList

首先介绍的是List、ArrayList、LinkedList这三组。基本上List这一类的Class,跟Array很类似,List上跟Array不同的是,Array需要提前知道长度,List不需要。

而List是一个Interface,而ArrayList与LinkedList是实作的Class。所以通常宣告时,会搭配物件导向的多型方式宣告如下:

ArrayList与LinkedList的差别

ArrayList与LinkedList都是实作List的Class,所以List有的功能,ArrayList与LinkedList全都有;而这二个List的差别在于,寻找下一节点的位置与切换下一个节点的位置。

假设今天有三个Object在heap中,分别利用ArrayList与LinkedList储存,则结果如下图:

此时因为ArrayList是照顺序储存的,所以在取得特定的index元素时,非常方便快速,而LinkedList在取得特定的index元素,因为要一个一个去取,所以会比较慢。

假设今天要插入第四个Object A,而且要接续在Object 1之后,所以会变成:

我们可以看到ArrayList的Object 2与Object 3都被移位了,而LinkedList则是修改Object 1的指向,再由Object A的指向Object 2,所以修改了二个指向,如果今天List内的数量很多,ArrayList会影响到被插入的index后的每一个,而LinkedList只会影响到二个。

结论

 

 

ArrayList

LinkedList

找特定index值

可以快速找到。

因为需要一个接续一个地找,所以比较慢。

插入中间值

影响中间index之后的每一个值,所以执行时间较久。

只影响二个指向,所以较快。

 

Set、HashSet、TreeSet

Set与List其实是很类似的东西,不过它们之间最大的区别在于,Set的内容不准重复,不过List可以。

下图是一List与Set的范例:

Set因为有著不能重复的特性,而判断重复的基准是根据Object的equals()来判断;另外Set的内容因为不能重复,所以会有排序的问题,而排序的考量有二点:

  1. 使用者自订排序 → TreeSet

  2. 快速取出 → HashSet

TreeSet预设为ASCII的方式排序,不过使用者也可以让物件实作java.lang.Comparable,客制化排序;而HashSet则是根据Object的hash()来决定先后顺序。

*注意:List在取出时是有顺序的,但是Set在取出时,是会根据排序后的顺序,请注意,下图是范例:

Stack(先进后出)与Queue(先进先出)

Stack与List是很类似的东西,都是将一堆资料塞进去里面后,再慢慢取出来;不过它们有Stack与Queue有它们自己的特性,Stack是先进后出(LIFO),而Queue是先进先出(FIFO),我们直接来看范例:

下图是Stack的范例:

下图是Queue的范例:

Stack与Queue的peek()

Stack与Queue都是在取出内容物后,就将该物件从Stack或Queue中移除了,所以为了因应各种状况,所以在Stack或Queue中都有提供对应的Method peek(),这个Method取出来的物件与Stack的pop()与Queue的poll()是相同的,不过它不会将物件从Stack或Queue中移除。

Map、HashMap、TreeMap

Map是一种方便使用者储放key、Value的一种集合,而且它也很接近Set与List的集合体,储放key时使用Set,储放Value时使用List。

Map的Key是使用Set的方式储存的,所以Key是不能重复的,而Value是用List的方式储存,所以Value是可以重复的。

而Map中的Key因为使用Set的方式储存,所以跟Set一样,Set有HashSet、TreeSet,而Map则有HashMap与TreeMap,主要都是针对Key的部份。

相关文章