当前位置:天才代写 > tutorial > JAVA 教程 > J2SE – 荟萃框架

J2SE – 荟萃框架

2017-11-11 08:00 星期六 所属: JAVA 教程 浏览:359

副标题#e#

我们都知道,当想要生存一组根基范例数据时,数组是最有效的生存方法,也是推荐利用这种方法的。可是数组是固有巨细的,当运行时才知道巨细的措施,这种方法利用就受限制了,这就是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)那么高。

#p#分页标题#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.


#p#副标题#e#

Set:担任自Collection接口,暗示无序的,无反复元素的荟萃。Set中最常利用的是测试归属性,可以很容易测试某个工具是否在某个Set中。所以,查找就成为了Set中最重要的操纵,因此凡是会选择一个HashSet的实现查找,因为有较量巨大的哈希表支持,它专门对快速查找举办了优化。

迭代器:迭代器是一种设计模式,在这里是一个工具,它的浸染就是遍历并选择列表和操纵列表中的工具。迭代器的创佳的价钱小,所以凡是被称为轻量级工具。迭代器统一了对各类容器的会见方法,很利便。Java中的迭代器有两种,一种是Iterator,另一种是担任了Iterator只能用于各类List会见的ListIterator. Iterator:只能用于单向移动,要领有:iterator()要求容器返回一个Iterator,Iterator将筹备好返回序列的第一元素。next()得到列表中的下一个元素。hasNext()查抄列表中是否尚有元素。remove()将迭代器新近返回的元素删除。

ListIterator:只能用于各类的List类的会见,但能用于双向的移动,有一个hasPrevious()查抄时候有前一个元素的,这种操纵很像数据库的游标。

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.ListIterator;
   public class ListTest ...{
   public static void main(String [] args)
   ...{
     Collection<Integer> col = new ArrayList<Integer>(Arrays.asList(10,20,30));
     List<Integer> list = new LinkedList<Integer>();
     list.addAll(col);
     list.add(40);
     list.add(50);
     list.add(60);
     displayIterator(list);
     list.remove(3);
     displayListIterator(list);
   }
   public static void displayIterator(Collection<Integer> list)
   ...{
     Iterator<Integer> it = list.iterator();
     Integer i;
     while(it.hasNext())
     ...{
       i = it.next();
       System.out.print(i + " ");
       if(i==50)
       ...{
         it.remove();
       }
     }
     System.out.println();
   }
   public static void displayListIterator(List<Integer> list)
   ...{
     ListIterator<Integer> li = list.listIterator();
     /** *//**以下注释代码为死轮回,永远输入表中的第一个数据*/
     /** *//**while(li.hasNext())
     {
       System.out.println(li.next());
       System.out.println(li.previous());
     }*/
     while(li.hasNext())
     ...{
       System.out.print(li.next() + " ");
     }
     System.out.println();
     while(li.hasPrevious())
     ...{
       System.out.print(li.previous() + " ");
     }
   }
}

#p#副标题#e#

#p#分页标题#e#

Map:也是一个映射存储键/值对的接口,但跟Collection没有任何关系的,也没有担任任何接口,所以不能用Iterator迭代器来会见该荟萃中的元素。给定一个要害字和一个值,可以存储这个值到一个Map工具中,存储今后,就可以利用它的要害字来检索它。映射常常利用到的两个根基操纵:get()和put()。利用put()要领可以将一个指定了要害字和值的项插手映射。为了获得值,可以通过将要害字作为参数来挪用get()要领。

import java.util.HashMap;
import java.util.Map;
   public class TestMap ...{
   public static void main(String [] args)
   ...{
     Map<String,Integer> hm = new HashMap<String,Integer>();
     hm.put("a1", 1);
     hm.put("b2", 2);
     hm.put("c3", 3);
     hm.put("d4", 4);
     hm.put("e5", 5);
     display(hm);
     System.out.println(hm.containsKey("c3"));
     hm.remove("c3");
     System.out.println(hm.containsValue(3));
     System.out.println(hm.size());
   }
   public static void display(Map<String,Integer> m)
   ...{
     for(String s : m.keySet())
     ...{
       System.out.println(s + " : " + m.get(s));
     }
   }
}

 

    关键字:

天才代写-代写联系方式