<b>J2SE - 调集框架</b>[Java编程]
本文“<b>J2SE - 调集框架</b>[Java编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
我们都知道,当想要保存一组基本范例数据时,数组是最有效的保存方法,也是举荐利用这种方法的.但是数组是固有大小的,当运行时才知道大小的程序,这种方法利用就受限制了,这就是Java容器类产生的缘由.Java调集类有几个特点:首先,这种容器是高性能的,对基本数据调集(动态数组、链接表、树和散列表)的实现是高效率的.第二,容器类答应差别范例的类调集以相同的方法和高度互操作方法工作.第三,容器类是简单扩大或改正的.容器类的常用的基本范例有List、Set和Map,这些对象范例也称为调集类,但是在Java中利用了Collection这个名字来指代该类库的一个特别子集,所以业界利用了范围更遍及的“容器”来称谓.
Collection:是一个接口,它位于调集框架层次构造的顶层,担当自Iterable接口,阐明是可以用Iterator迭代器来拜候该调集合的元素的.又有List、Set和Queue接口担当Collection接口,直接实现该接口的是一个叫AbstractCollection的抽象类,该抽象类以最大限度地削减了实现此接口所需的工作.
List:担当自Collection接口,表示有序的、可包含反复元素的列表.同时拥有Collection内的办法外,还增添了大量的办法,使得可以在List的中间插入和删除元素.实现该接口的基本类有ArrayList和LinkedList. ArrayList:擅擅长对元素的随机拜候,但是在插入和删除元素时效率较慢.其实,看看ArrayList类实现的源代码就知道,ArrayList是以线性表的数据构造情势存取数据的,初始化的表大小为10,下面就有几个常常用到的核心办法:add(E e):在当前表的末尾插入元素,假如在前面表不满的情形下,也是很高效的,直接插入到末尾,但是假如在当前表已经满的情形下,就要重新生成一个比当前表大小更大的新表,新表的大小是当前表大小的1.5倍加1,比方当前表长度为20的,新表的大小就为31,还需求把当前表元素复制到新表中去,然后把当前表引用指向新表,最后把数值插入到表末尾,所以这种操作是非常低效的.
add(int index,E element):在指定索引位置插入元素,查抄表大小和重新追加表大小和上面的add(E e)方法是一样的.最后是要把index今后的元素都是要顺次往后移一个大小,然后把元素插入到index位置上去.触及到表的复制和表内元素的移动,所以效率也是比add(E e)办法还要低.
remove(int index):在指定索引位置删除元素,就是把index位置后的全部元素都往前移一个大小,也是触及到表内元素的移动,效率也是很低的.
remove(Object o):删除指定的元素,也就需求查找出该元素在表中呈现第一次的位置,查找是用到次序一个一个举行匹配的办法,找出后就把该元素背面的全部元素往前移一个大小.该办法触及到次序查找和表内元素移动,比remove(int index)办法更低效.
set(int index,E element):替换表中索引为index的元素值,返回被替换的值,直接用下标索引拜候元素,所以效率非常高.
get(int index):获得索引为index的元素,直接用下标索引拜候,所以效率也是非常高.
indexOf(Object o):获得元素的索引号,也就是需求查找,固然用到了次序查找法,但效率还是对比高的.
LinkedList:擅擅长对元素的插入和删除操作,但关于随机拜候元素对比慢.该类的实现是以双向链表的数据构造为底子的,所以是对比损耗内存的,但它的特定集比ArrayList更大.双向链表,每个节点都有三个域,两个域是存放前后节点的内存地址引用的,一个域是存放数据元素的.在LinkedList类中,有一个叫Entry的内部类,是private的,里面三个属性,辨别是element、next和previous,辨别对应了双向链表中的三个域,在ArrayList类中每实例化一个Entry就生成一个节点.下面看看它的核心办法:add(E e):把元素插入到链表末尾,首先要实例化一个节点,新节点previous域存放链表中最后一个节点地址,next域存放链表中第一个节点地址,element域存放元素值,链表中最后一个节点的next域存放新节点的地址,第一个元素的previous域存放新节点的地址,这样这个元素就插入到该链表中去了,没有触及到复杂的操作,所以是非常高效的.
add(int index,E element):在index位置插入元素,这就需求先查找到该位置.查到后,这里就把查到的节点的前一个节点叫为A,实例化新的节点为B,查到index的节点为C.B的next域等于A的next值(也就是C的内存地址),B的previous域等于C的previous值(也就是A的内存地址),B的element域存放元素值,然后把A的next域和C的previous域都等于B的内存地址.这样也就把元素插入到链表的index位置中去了,但触及到了查询,所以效率固然高,但也没有add(E e)那么高.
remove(int index):删除在index位置的元素,首先也是要找到该位置的节点.然后把该节点的下一个节点(也就是该节点next域的内存地址那个节点)的previous值等于该节点的previous值,该节点的上一个节点(也就是该节点previous域的内存地址那个节点)的next值等于该节点的next值.这样就把该节点从这条链表删除了,历程中固然触及到了查找,但没有触及到像ArrayList类中的remove办法要移动表中元素,所以该办法的效率还是很高的.
remove(Object o):删除在链表中第一个元素为o的节点,也是需求查找到该节点,然后就跟remove(int index)思绪一样把元素删除,所以效率也是很高的.
set(int index,E element):把在链表中第index个元素值改成element,这也需求找到该节点来改正元素值,但触及到了查找节点,ArrayList中的set办法就不用查找便可以改正,所以相关于ArrayList中的set办法,LinkedList办法set办法效率就没那么高了.
get(int index):获得第index位置的元素值,也是要找到该节点,所以就也没ArrayList中的get办法那么高效率了,因为该办法需求查找链表.
indexOf(Object o):获得该链表中第一o元素的位置,也是要查找链表,但ArrayList中的indexOf办法也是需求查找的,所以这两个类的indexOf的效率都差不多.
所以,在编程中,假如要举行大量的随机拜候,就利用ArrayList;假如要常常从表中插入或删除元素的就应当利用LinkedList.
以上是“<b>J2SE - 调集框架</b>[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |