zoukankan      html  css  js  c++  java
  • Java集合框架知识总结

    两大体系:Collection,Map

    一、Collection:

    List 接口 :

      List:里面对象全部是有序的(通过三种方法来遍历)
        ArrayList,LinkedList,Vertor

    ArrayList:本质上 ArrayList 里维护的就是动态可变长度的数组。

     常用方法:
       增:add(4) 对象 位置+对象  集合 集合+位置。
       删:remove(2)下标删对象,直接删对象。
       改:set(1) 下标  对象。
       查:get() 下标得对象, indexOf()对象得下标。

       contains()必须是同一个对象才返回true  iterator() size()。


    LinkedList:本质上 LinkedList 里维护的是动态可变长度的双向链表

     常用方法:
       增:add(4) 对象 位置,对象 集合 位置,集合 +2(对象) 新增:addFirst() addLast()。
       删:remove(2)下标删对象,直接删对象 +2(对象) 新增:removeFirst() removeLast()。
       改:set(1) 下标 对象
       查:get() 下标得对象 indexOf()对象得下标 +2(对象) 新增:getFirst() getLast()。

         contains() iterator()size()。


    Vertor:线程安全,执行效率非常低

      常用方法:
       增:add(4) 对象 位置,对象 集合 位置,集合 addElement(对象) insertElement(对象)。
       删:remove(2)下标删对象,直接删对象 removeElement(对象) removeAllElment()。
       改:set(1) 下标,对象 setElementAt(对象,下标)。
       查:get() 下标得对象 indexOf()对象得下标。

        contains() iterator() size()。

       iterator() :hasNext()判断有没有下一个元素。
       next()获取下一个元素。
       remove()在迭代器中移除元素。

    Set接口:
           不允许出现重复的方法,允许有一个null值,都没有顺序索引(通过增强for循环和迭代来遍历),所以查不了,改不了。
       要想存入Set,必须重写equals()和hashCode()方法(String已经重写),两者返回值都为真表明相等,比的是内容。
       其实一个equals()就可以,但是当存入数据量大的时候,一一比较效率非常低,加入hashCode,就是来判断不是同一个对象的。
       用hashCode()无法判断是同一个对象。

       因为所有的已经存入的对象保存在一个table里面,比较的效率非常高。
           如果已存在,是不能再往里面添加(而Map是后面覆盖前面)。
    HashSet:
      内部维护的是HashMap的一个实例,存的是key的集合。
      元素的表现是无序的,但一旦添加完元素,元素位置是固定的(也就是说你无论再运行多少遍,这个显示的顺序都一样),再添加新元素,不会影响前面元素的位置,给添加的元素分配位置,只要不打乱前面的元素位置,前面的元素位置就不会再发生变化。

     常用方法:
      增:add(对象)。
      删:clear()移除所有对象 ,remove(对象)。
      改:没有,没下标。
      查:除了遍历出所有,没有,因为没有下标。

      contains()内容相同就返回true  iterator() size()。


    LinkedHashSet:
      HashSet的子类,只有四个新增的构造器,没有其他新增方法,内部维护的是LinkedHashMap的一个实例,是双向链表结构。
      元素存放顺序和迭代顺序一样(按顺序)。
      常用方法同HashSet。


    TreeSet:

       确保元素处于排序状态,底层为树结构。使用它可以从Set中提取有序的序列。

       两种排序方法:自然排序和定制排序,默认采用自然排序。
       自然排序:会调用集合元素的comparaTo(对象)方法来比较元素之间的大小关系,然后把集合按升序排列(实现 Comparable接口)。
       定制排序:通过Comparator(比较器)接口,需要重写compara(对象,对象),要实现定制排序,需要把comparator实例作为形 参传给TreeSet的构造器。
       要想把元素放到TreeSet中,必须实现Comparable接口,同时必须实现comparaTo方法。
       或者继承Comparator接口,然后重写compara方法。
       first() last()lower(对象) heigher(对象) 其他视图方法。


    二、Map集合:维护"键值对"的关联性

       key,value 必须都为引用类型数据
       key不可以重复(后覆盖先),保存在Set集合中(因为Set集合里面的元素不能重复,所以,,还必须重写equals和hashCode()方法),经常用String,因为都已经实现
       put(key,value) remove(key) putAll(Map map) clear()清除所有 。(基本全是通过Set,也就是key,唯一性)。
       获取key的集合:
          Set<> set= map.keySet();Iterator<> it=set.iterator();get(key) 迭代器。
       获取value的集合:
          Collection values() 迭代器,增强for都可以。
       Entry集合:
         Set<Entry<,>> entrys = map.entrySet();
         for(Entry<String,String> entry : entrys)迭代器,增强for都可以
         get(key) containsKey(key) containsValue(value) size isEmpty() equals()比较的当然是内容啦

    HashMap:
      允许key和value的值为null。
      表现是无序的 比较key相等和Set一样。
      LinkedHashMap:子类,有序的(等同上面的HashSet和LinkedHashSet)只比HashMap慢一点。而在迭代访问时发而更快,因为它使用链表维护内部次序。

    TreeMap:

      有序。 基于红黑树数据结构的实现。查看"键"或"键值对"时,它们会被排序(次序由Comparabel或Comparator决定)。TreeMap是唯一的带有subMap()方法的Map,它可以返回一个子树。
     HashTable:

       最古老,不允许key和value值为null

    Properties:
      是HashTable的子类,用来处理文件的属性。
      文件属性必须是key_value,必须都是字符串,存取数据用put(key,value),get(key)。

    Collections:
      集合操作类
      排序:
      Collections.reverse(list) 反序
      Collections.shuffle()随机
      Collections.sort()自然顺序升序
      Collections.swap(对象,位置,位置)交换
      查找:
      max()
      min()frequency(Collections,对象);
      copy(目标list,srclist)
      Collections.repalceAll(list,old对象,new对象)

      synchronizedXXX();
      synchronizedList(list)

    总结:         

           1.线程安全的是vertor和HashTable。
           2. List:允许重复的,全部有序(允许null)。
       3.Set: HashSet无序的表现(一个null),其中HashSet的子类LinkedHashSet有序,TreeSet有序。
       4.Map:HashMap无序的表现(一次null),其中HashMap的子类LinkedHashMap有序,TreeMap有序,HashTable无序(不能为null)。

       5.ArrayList:查询效率高,增删效率低。
       6.LinkedList:查询效率低,增删效率高。
       7.Vertor:执行效率非常低。

       8.HashSet:良好的增删查询性能。
       9.LinkedHashSet:查询效率低,插入效率比HashSet低。

       10.Map对象高于List。因为Map除了Value外还需要一个Object的Key,从而增大了Map的容量。

         11. HashSet,HashMap的元素都是无序的,而他们的子类都是有序的,双向链表,非常类似,因为HashMap中的唯一的约束就是key,而 key恰恰是被HashMap维护的
           12.TreeSet和TreeMap都是有序的,两个很类似。

           13. 如果Map知道了Key,List知道了index,其性能在一百万条数据中无多大差别。

       14.List按对象进入的顺序保存对象,不做排序或编辑操作。Set对每个对象只接受一次,并使用自己内部的排序方法(通常,你只关心某个元素是否属于 Set,而不关心它的序                   否则应该使用List)。Map同样对每个元素保存一份,但这是基于"键"的,Map也有内置的排序,因而不关心元素添加的 顺序。如果添加元素的顺序对你很重要,应该使用     LinkedHashSet或者LinkedHashMap。

          15.HashMap就是使用对象的hashCode()进行快速查询的。此方法能够显着提高性能。


    举个简单的例子:

    复制代码
    import java.util.Collection;
    import java.util.HashMap;
    import java.util.Iterator;
    import java.util.Map;
    import java.util.Map.Entry;
    import java.util.Set;
    public class TestHashMap {
        public static void main(String[] args) {    
                  Map<String, String> map = new HashMap<String, String>();
            // put()往Map中添加一个元素(Key-Value)
            map.put("5", "ddd");
            map.put("1", "aaa");
            map.put("2", "bbb");
            map.put("3", "ccc");
            map.put("4", "ccc");
    
            // HashMap的遍历
            Set<String> keys = map.keySet();
            Iterator<String> it = keys.iterator();
            // Iterator<String> it = map.keySet().iterator();
            System.out.println("-----------HashMap的遍历方法一-------------");
            System.out.println("-----------map.keySet()-------------");
            while (it.hasNext()) {
                String key = it.next();
                // get返回指定key对应的value
                System.out.println(key + " : " + map.get(key));
            }
            Collection<String> c2=map.values();
            for(String str:c2){
                System.out.println(str);
            }    
            Set<Entry<String,String>> entrys = map.entrySet();
             System.out.println("-----------HashMap的遍历方法三-------------");
             System.out.println("-----------map.entrySet()-------------");
         for(Entry<String,String> entry : entrys){
            System.out.println(entry.getKey() + " : " + entry.getValue());
            }
            System.out.println("-------------");
             //remove方法移除指定key对应的元素,返回对应的value
             System.out.println(map.remove("4"));
            // //如果key不存在,返回null,移除操作无效
             System.out.println(map.remove("9"));
            System.out.println("-----------map.remove()之后-------------");
             it = map.keySet().iterator();
             while(it.hasNext()){
             String key = it.next();
             //get返回指定key对应的value
             System.out.println(key + " : " + map.get(key));
             }
            //
             //判断Map中是否存在指定key
             System.out.println(map.containsKey("1"));
             System.out.println(map.containsKey(new String("1")));
             //判断Map中是否存在指定Value
             System.out.println(map.containsValue("aaa"));
             System.out.println(map.containsValue(new String("aaa")));
        }
    
    }
    复制代码

    仅仅总结了常用的集合。

  • 相关阅读:
    一致性hash 参考:http://blog.csdn.net/cywosp/article/details/23397179/
    动态规划:最长公共子序列和最长公共子串
    并发包(转) http://blog.csdn.net/he90227/article/details/52788981
    海量数据
    MyBatis
    Spring MVC执行流程
    mysql优化
    红黑树
    并发包 (转) http://www.cnblogs.com/wanly3643/category/437878.html
    递增数列中找出和为s的数列
  • 原文地址:https://www.cnblogs.com/chenhceng/p/7677761.html
Copyright © 2011-2022 走看看