基础训练--(09)JAVA与Collection
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的内容因为不能重复,所以会有排序的问题,而排序的考量有二点:
-
使用者自订排序 → TreeSet
-
快速取出 → 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的部份。