Java之路--Javase篇 API (4)

                             List

Collection的子类,有序可重复可索引(有脚标)。

功能如下:

  添加—在指定的索引位插入元素:void add(index,element)

            在指定的索引位插入一批元素:boolean addAll(int index,Collection c)

  删除—删除指定index位的元素,并返回删除的元素:Object remove(int index)

  获取—通过索引获取指定位置上的元素:object get(int index)

        根据元素获取其位于list中的位置,如果不存在返回-1:int indexOf(object)

        根据元素反向获取该元素在list中的位置,如果不存在返回-1:int lastIndexOf(object)

        获取子list:List sublist(int start,int end)

       

特     殊列表迭代器:ListIterator ListIterator()

     他是迭代器的子接口。当对元素进行迭代时,如果在迭代过程中又使用了集合对象操作元素,就容易发生ConcurrentModificationException并发修改异常。原因在于,因为在获取该迭代器时,迭代器已知的是集合现有的元素,可是在迭代器过程中,用集合对象操作元素,迭代器无法知道操作了哪些元素,做出了什么更改。

     例子:

为解决上述问题List提供了自己更强大的迭代器ListIterator(原因在于它具有脚标):

增:add();

删:remove();

改:set();

查:next;

判断:hasNext();

修改—替换指定位置的元素并返回被替换的元素:Object set(index,Object)

List:有序,可重复,有索引;主要就是因为有脚标

 |--ArrayList: 底层也是数组数据结构,不同步;由于数组存储是连续的,查找速度很快,更改元素效率不高;

|--LinkedList:底层是链表数据结构,非同步;由于链表存储非连续,查找速度效率不高,增删的效率较高;

|--Vector:底层也是数组数据结构,同步的,被ArrayList替代了。查询和增删的速度都不高。故被淘汰。其枚举Enumeration和Iterator功能完全一样,被后者替代:

      for (Enumeration<E> e = v.elements(); e.hasMoreElements();)

       System.out.println(e.nextElement());

   

ArryList和Vector可变长度数组的原理:

    当默认10的长度的数组不够存储时,会建立一个新数组。将原来数组的内容拷贝到新的数组当中,并将新增加的元素追加到拷贝完的数组尾,如果仍然不够重复上述动作。其中,ArryList的增加是以原来50%长度进行增加,而Vector是按照100%延长。

注意:只要是常用的容器就不是同步的,因为效率比较低。

 

LinkedList

LinkedList特有方法:

   addLast();    //JDK1.6—offerFirst()

   addFirst();   //JDK1.6—offerLast()

   getLast();//返回元素,并不移除,如果集合中没有元素会出现NoSuchElementException;

   getFirst();//JDK1.6—peekLast();

   removeLast();//移除并返回被移除的元素,如果集合中没有元素会出现NoSuchElementException;JDK1.6—pollLast();

   removeFirst();// JDK1.6—pollLast();

getLast   注意:Jdk1.6中peek和poll方法如果集合中没有元素,则返回null,而不是如同get和remove方法抛出NoSuchElementException。

             //JDK1.6—peekFirst();

  

Arraylist

Arraylist中的contains和remove方法在判断两个元素是否一致时,沿用的是Object中的equals方法,即比较的是两个对象的地址。整个List中都是如此,故当要将自定义的对象需要存储到List集合中时,需要复写对象的equals方法,建立该对象自己特有的比较两个对象是否相同的方法。

你可能感兴趣的:(java,list,职场,休闲)