zoukankan      html  css  js  c++  java
  • 常用集合类使用方法

     转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/5920991.html 

     在编程中,我们经常需要考虑数据的储存方法——到底用什么东西去安置这些数据呢?

       一般,少的可以用数组,但是数组只能存放规定大小、同一类型的数据;这样的话,不定长的可以试试链表,但是链表检索起来需要从头到尾,一旦数据多了会很慢。如果需要为一个对象存放多个不同类型的数据,可以用结构体,制作成链表。但是在Java中,更推荐用封装类来实现,用一个类来封装这些不同数据类型的数据,然后我们只需储存、管理类对象即可。如果事先知道有多少数据的话,可以用对象数组来储存。然而,实际应用中更多是不知道有多少数据的,那该如何呢?这时,我们可以使用集合类。

        Java中集合类有很多,本文只针对经常使用的几个。文中涉及到的集合类主要有以下几种:

        

       Java中集合类主要分两种:Collection和Map。Collection主要储存value值,而Map则以“key-value”形式存放数据。

       

       Collection有两个子接口:List和Set,二者主要区别在于:list数据有序存放、可重复;set中数据无序存放,不可重复。

       ,如图,list相当于数组一样存放数据,每个数据是有下标对应的,通过下标来访问数据。

       ,而set只是提供了一片区域用来存放数据,数据的顺序只能依靠数据本身的值来决定,所以不能有重复值出现。

       

      1)Vector

      Vector类实现了一个动态数组,主要用在事先不知道数组的大小,以及需要频繁地进行查找,插入,删除工作,或者只是需要一个可以改变大小的数组的情况。

    创建:

    Vector类支持4种构造方法。

    第一种构造方法创建一个默认的向量,默认大小为10:

    Vector()

    第二种构造方法创建指定大小的向量。

    Vector(int size)

    第三种构造方法创建指定大小的向量,并且增量用incr指定. 增量表示向量每次增加的元素数目(当该vector对象添加的元素接近原先分配的内存极限时,会以incr大小自动扩大该对象拥有的内存容量,以容纳更多的数据)

    Vector(int size,int incr)

    第四中构造方法创建一个包含集合c元素的向量:利用父类对象创建子类对象

    Vector(Collection c)

      常用的vector操作方法:增、删、查、改。

    增:

    vec.add(E element) 
    将指定元素追加到此向量的末尾。 
    vec.add(int index, E element) 
    在此向量的指定位置插入指定的元素。 
    vec.addAll(Collection c) 
    将指定 Collection 中的所有元素按顺序追加到此向量的末尾。 
    vec.addAll(int index, Collection c) 
    在指定位置将指定 Collection 中的所有元素插入到此向量中。 

    删:

    vec.remove(int index) 
    移除此向量中指定位置的元素。 
    vec.remove(value v) 
    移除向量中元素值为v的元素。
    vec.removeAll(Collection c) 
    从此向量中移除包含在集合c 中的所有元素。 
    vec.removeAllElements() 
    从此向量中移除全部组件,并将其大小设置为零。 
    vec.removeRange(int fromIndex, int toIndex) 
    移除位于 fromIndex(包括)与 toIndex(不包括)之间的所有元素。 

    vec.clear() 

    移除所有元素。

    查:

    vec.get(int index) 

    返回向量中指定位置的元素。 
    vex.indexOf(value v) 
    返回v值在vec中的下标。
    vec.isEmpty() 
    检查该向量是否为空。 
    vec.lastElement() 
    返回此向量的最后一个元素。 

    int capacity() 
    返回此向量的当前容量。

    int size() 
    返回此向量中的组件数。 

    String toString() 
    返回此向量的字符串表示形式,其中包含每个元素的 String 表示形式。 
    改:

    vec.set(int index, E element) 
    用指定的元素替换此向量中指定位置处的元素。 
    vex.setElementAt(E obj, int index) 
    将此向量指定 index 处的组件设置为指定的对象。 
    vec.setSize(int newSize) 
    设置此向量的大小。 

    2)ArrayList

    ArrayList就是动态的数组,可以动态的增加和减少元素,灵活的设置数组的大小。基本与Vector一样。

    创建:

     ArrayList提供了三个构造器: 

    public ArrayList(); 
    默认的构造器,将会以默认(16)的大小来初始化内部的数组 
    public ArrayList(Collection c); 
    用一个集合对象来构造,并将该集合的元素添加到ArrayList 
    public ArrayList(int n); 
    用指定n的大小来初始化内部的数组.

    增:

    方法摘要
     boolean add(E e)
              将指定的元素添加到此列表的尾部。
     void add(int index, E element)
              将指定的元素插入此列表中的指定位置。
     boolean addAll(Collection<? extends E> c)
              按照指定 collection 的迭代器所返回的元素顺序,将该 collection 中的所有元素添加到此列表的尾部。
     boolean addAll(int index, Collection<? extends E> c)
              从指定的位置开始,将指定 collection 中的所有元素插入到此列表中。

    删:

     E remove(int index)
              移除此列表中指定位置上的元素。
     boolean remove(Object o)
              移除此列表中首次出现的指定元素(如果存在)。
    protected  void removeRange(int fromIndex, int toIndex)
              移除列表中索引在 fromIndex(包括)和 toIndex(不包括)之间的所有元素。
    void clear()
              移除此列表中的所有元素。

    查: 

     E get(int index)
              返回此列表中指定位置上的元素。
     int indexOf(Object o)
              返回此列表中首次出现的指定元素的索引,或如果此列表不包含元素,则返回 -1。
     boolean isEmpty()
              如果此列表中没有元素,则返回 true
    int size()
              返回此列表中的元素数。
    boolean contains(Object o)
              如果此列表中包含指定的元素,则返回 true

    ArrayList支持3种遍历方式

    第一种,通过迭代器遍历

    Integer value = null;
    Iterator iter = list.iterator();
    while (iter.hasNext()) {
        value = (Integer)iter.next();
    }

     第二种,随机访问,通过索引值去遍历。

    Integer value = null;
    int size = list.size();
    for (int i=0; i<size; i++) {
        value = (Integer)list.get(i);        
    }

    第三种,for-each遍历

    Integer value = null;
    for (Integer integ:list) {
        value = integ;
    }

    改:

     E set(int index, E element)
              用指定的元素替代此列表中指定位置上的元素。
     Object[] toArray()
              按适当顺序(从第一个到最后一个元素)返回包含此列表中所有元素的数组。//把Arraylist转化为一个数组。

    Vector与ArrayList比较:

     1. 同步性
     
        Vectors是可同步的,是线程安全的。ArrayList是不可同步的,不是线程安全的。所以,一般单线程推荐用ArrayList,多线程中则用Vector 2. 数据增长
     
        往一个ArrayList或者Vector里插入一个元素的时候,如果内部数组空间不够了,ArrayList或者Vector就要扩展它的大小。Vector在默认情况下是增长一倍的大小,而ArrayList增加50%的大小。
     
    3)HashMap
      这里我们先讲hashmap,具体原因等讲到hashset的时候就知道了。
      HashMap基于哈希表的 Map 接口实现,以key-value的形式存在。在HashMap中,系统 key-value 当成一个整体进行处理,系统总是根据 Hash 算法来计算 key-value 的存储位置,这样可以保证能快速存、取 Map 的 key-value 对。系统调用key的 hashCode() 方法得到其 hashCode 值——每个 Java 对象都有 hashCode() 方法,都可通过该方法获得它的 hashCode 值。得到这个对象的 hashCode 值之后,系统会根据该 hashCode 值来决定key—value的存储位置。
    创建
    构造方法摘要
    HashMap() 
              构造一个具有默认初始容量 (16) 和默认加载因子 (0.75) 的空 HashMap
    HashMap(int initialCapacity) 
              构造一个带指定初始容量和默认加载因子 (0.75) 的空 HashMap
    HashMap(int initialCapacity, float loadFactor) 
              构造一个带指定初始容量和加载因子的空 HashMap
    HashMap(Map<? extends K,? extends V> m) 
              构造一个映射关系与指定 Map 相同的 HashMap
     容量表示哈希表中桶的数量,初始容量是创建哈希表时的容量,加载因子是哈希表在其容量自动增加之前可以达到多满的一种尺度,它衡量的是一个散列表的空间的使用程度,负载因子越大表示散列表的装填程度越高,反之愈小。
    增:
    V put(K key, V value) 
           插入键值对。
     void putAll(Map<? extends K,? extends V> m) 
              把map中的键值对插入到hashmap中。
    删:
     V remove(Object key) 
              如果此映射中存在该键的映射关系,则将其删除。
     void

    clear() 
              从此映射中移除所有映射关系。

    查:
     V get(Object key) 
              返回指定键在此标识哈希映射中所映射的值,如果对于此键来说,映射不包含任何映射关系,则返回 null
    boolean isEmpty() 
              如果此映射不包含键-值映射关系,则返回 true
     Set<K> keySet() 
              返回此映射中所包含的键的 set 。//获取hashmap中的key集合。
    Collection<V> values() 
              返回此映射所包含的值的 collection 视图。
     int size() 
              返回此映射中的键-值映射关系数。
     boolean containsKey(Object key) 
              如果此映射包含对于指定的键的映射关系,则返回 true
     boolean containsValue(Object value) 
              如果此映射将一个或多个键映射到指定值,则返回 true
    4)HashSet
      HashSet是基于 HashMap 实现的,底层采用 HashMap 来保存数据。所有放入 HashSet 中的集合元素实际上由 HashMap 的 key 来保存,而 HashMap 的 value 则存储了一个静态的 Object 对象(向上转型,这样value就可以是各种基本类型的值了)。HashSet 的绝大部分方法都是通过调用 HashMap 的方法来实现的,因此 HashSet 和 HashMap 两个集合在实现本质上是相同的。 
    创建
    HashSet hashSet = new HashSet();
    HashSet hashset=new HashSet(collection);
    增:
    hashset.add(value);//向集合中添加一个元素
    hashset.add(array[]);//把数组中的值添加到集合中

    删除一个元素:hashSet.remove(Object);

    删除所有元素:hashSet.clear();

    查:

    用迭代器遍历:

    Iterator it = hashSet.iterator();
      while(it.hasNext()){
       Object obj = it.next();

       然后针对obj进行一系列的操作,比如:输出值、如果obj是类对象则调用属性、方法。

     boolean contains(Object o)
              如果此 set 包含指定元素,则返回 true
     boolean isEmpty()
              如果此 set 不包含任何元素,则返回 true
     int size()
              返回此 set 中的元素的数量(set 的容量)。

     当从HashSet中访问元素时,HashSet先计算该元素的hashCode值(也就是调用该对象的hashCode())方法的返回值),然后直接到该hashCode对应的位置去取出该元素。  为了保证HashSet能正常工作,要求当两个对象用equals比较相等时,hashCode也要相等,否则就会有可能加入两个相同的项。

    HashSet的特点:

    (1)HashSet不是同步的,多个线程访问是需要通过代码保证同步

    (2)集合元素值可以为null。

     
  • 相关阅读:
    Java基础
    HTML笔记
    Java简介
    win8 图标 汇总 希望做Windows 8 应用的朋友用得着
    amCharts 的完整使用及破解[我弄过的]
    找了几个地方:发现关于SQL 的基本使用sql日期精确推算
    使用powerdesigner生成Pdm
    windows 8 Metro 设置选中ListViewItem 的样式
    关于DataTable与IList和List泛型集合的相互转换在网上总结
    C++ RString (原生字符串)
  • 原文地址:https://www.cnblogs.com/ygj0930/p/5920991.html
Copyright © 2011-2022 走看看