zoukankan      html  css  js  c++  java
  • Java基础知识:集合

    Java 集合

    1. Collection

     

    Iterator接口:

    2. List

      有序的 Collection(也称为序列)。此接口的用户可以对列表中每个元素的插入位置进行精确地控制。用户可以根据元素的整数索引(在列表中的位置)访问元素,并搜索列表中的元素。

      正因为List是有序的,相对于Collection,其增加了以下几个方法:

      添加:

    void  add(int index, E element)  //在列表的指定位置插入指定元素
    void  addAll(int index, Collection<? extends E> c)  //将指定 collection 中的所有元素都插入到列表中的指定位置

      删除:

    E  remove(int index, E element)  //移除列表指定位置的元素

      修改:

    E  set(int index, E element)  //用指定元素替换列表中指定位置的元素

      判断索引:

    int  indexOf(Object o)    //返回列表中首次出现指定元素的索引,如果列表不包含此元素,则返回 -1
    int  lastIndexOf(Object o)    //返回列表中最后出现指定元素的索引,如果列表不包含此元素,则返回 -1

      取子集:

     List<E>  subList(int fromIndex, int toIndex)      //返回列表中指定的 fromIndex(包括 )和 toIndex(不包括)之间的部分

      列表迭代器:

    ListIterator<E>  listIterator()     //返回列表中元素的列表迭代器(以正确的顺序)
    ListIterator<E>  listIterator(int index)      //返回列表中元素的列表迭代器(以正确的顺序),从列表的指定位置开始

    ListIterator接口:(List独有的迭代器,是Iteartor的子接口。)

      注意:

        当使用“1”方法时,会出现 java.util.ConcurrentModificationException 异常。这是由于当集合在使用Iterator进行迭代时,不允许通过其他方法,即被其他线程修改。如果使用Iterator的方法“2”,就不会出现该问题。而ListIterator就是应对此需求出现的,它可以在迭代时进行添加、修改等操作。

     1 import java.util.ArrayList;
     2 import java.util.Iterator;
     3 import java.util.ListIterator;
     4 
     5 public class IteratorTest {
     6     public static void main(String[] args){
     7         ArrayList arr = new ArrayList();
     8         arr.add("hello--1");
     9         arr.add("hello--2");
    10         arr.add("hello--3");
    11         
    12         Iterator it = arr.iterator();
    13         while(it.hasNext()){
    14             String str = (String)it.next();
    15             if(str.equals("hello--2")){
    16                 arr.add("ok");  //1    
    17                 //it.remove();  //2
    18                 //it.add("ok");   //3
    19             }
    20         }
    21         print(arr);
    22     }
    23     
    24     public static void print(ArrayList arr){
    25         Iterator iterator = arr.iterator();
    26         while(iterator.hasNext()){
    27             System.out.println(iterator.next());
    28         }
    29     }
    30 }

      List包括ArrayList、LinkedList、Vector。

      1)ArrayList和Vector都是基于存储元素的Object[] array实现的,支持用小标来访问元素,同时索引数据的速度比较快。但是在插入元素时需要移动容器中元素,执行的比较慢。两者都有一个初始化的容量大小,当存储的元素超过这个大小会动态扩容,Vector默认扩充为原来的2倍(每次扩充空间的大小可以设置),ArrayList为原来的1.5倍(没有提供方法设置空间扩充大小)。
      2)ArrayList和Vector最大的区别是sybchronization同步,没有一个ArrayList方法是同步的,而Vector的绝大多数方法都是直接或间接同步的(add,insert,remove,set,equals,hashcode等)。所以Vector是线程安全的,ArrayList不是。因此前者性能也略逊于后者。
      3)LinkedList是采用双向列表实现的,对数据的索引需要从列表头开始遍历,因此用于随机访问比较慢,但是插入和删除效率比较高。

      LinkedList:由于是采用双向列表实现,在List的基础上,它还增加了以下几个方法:

      添加:

    void  addFirst(E o)    //将给定元素插入此列表的开头
    void  addLast(E o)    //将给定元素插入此列表的开头

      获取:

    E  getFirst(E o)    //返回此列表的第一个元素
    E  getLast(E o)    //返回此列表的最后一个元素

      删除:

    E  removeFirst(E o)    //移除并返回此列表的第一个元素
    E  removeLast(E o)    //移除并返回此列表的最后一个元素

      注意:

        由于getFirst/getLast和removeFirst/removeLast在列表没有该元素时,会抛出NoSuchElementException。此时我们可以使用peekFirst/peekLast和poolFirst/poolLast方法。

    E  peekFirst()    //获取但不移除此列表的第一个元素;如果此列表为空,则返回 null
    E  peekLast()    //获取但不移除此列表的最后一个元素;如果此列表为空,则返回 null
    
    E  poolFirst()    //获取并移除此列表的第一个元素;如果此列表为空,则返回 null
    E  poolLast()    //获取并移除此列表的最后一个元素;如果此列表为空,则返回 null

    3. Set(散列集)  

       Set是不包含重复元素的Collection,其方法大致与Collection一致。

      其元素是无序的(存入和取出的顺序不一致)。

      操作都是通过Iterator实现。

    1)HashSet

      底层数据结构是哈希表。

      保证唯一性的方法是通过hashCode()和equals()方法:如果元素的hashCode值相同时,则通过equals()方法来判断相等。如果元素hashCode不想等,则不调用equals()方法。

      对于判断元素是否存在、以及删除元素也是通过hashCode()和equals()方法实现。

      注意:

        在将自定义对象添加到HashSet集合时,需要重写hashCode()和equals()方法。

    2)TreeSet

      可以对Set集合中的元素进行排序,底层数据结构是二叉树。

      保证唯一性的方法是通过compareTo()方法,当返回0表示相等。

      TreeSet实现具有比较性有两种方式:

        1、一种是让对象本身实现Comparable接口,并重写compareTo()方法;

        2、还有一种是自定义一个比较器,但是该比较器需要实现Comparator接口,同时重写compare()方法,然后就可以在TreeSet初始化时添加该比较器;

        3、当两种比较都存在时,以比较器为准。

    TreeSet  ts  =  new  TreeSet(new  MyComparator);
    
    class  MyComparator  implements  Comparator
    {
    ...
    }

      

  • 相关阅读:
    利用序列化进行深度克隆
    原型链
    本地储存cookie,localStorage,sessionStorage
    ES6创建类
    hexo基本命令
    mouseent和mouseover的区别
    Event
    offset,client,scroll
    字符串的常用方法
    数组去重
  • 原文地址:https://www.cnblogs.com/jx-yangbo/p/6402479.html
Copyright © 2011-2022 走看看