zoukankan      html  css  js  c++  java
  • 类集框架解析

        2017-08-20  16:30:32

      常用集合的总结:

    List:有序、可重复 

    Set:无序、不可重复

    Map:将键映射到值的对象,一个映射不能包含重复的键,每个键最多只能映射到一个值

     一、List(以ArrayList为例)

    1)ArrayList.remove(int)按照下标删除,不会自动装箱

        List list = new ArrayList();
            list.add(1);
            list.add(2);
            list.add(2);
            list.add(2);
            list.add(3);
            list.add(4);
            list.add(5);
            
            list.remove(new Integer(5));//删除值为5的键值对
                    list.remove(1);//删除下标为1的键值对

    2)迭代器遍历的同时,添加元素,并发修改异常,通过ListIterator解决

    public static void print(List list){
            ListIterator iter = list.listIterator();
            while(iter.hasNext()){
                Student s = (Student)iter.next();
                if(s.getName().equals("Jack"))
                    iter.add(new Student("Marry",20));
                System.out.println(iter.next());
            }
        }

    3)遍历集合删除元素,使用Iterater.remove()操作(否则会报并发修改异常)

            Iterator iter = list.iterator();
            while(iter.hasNext()){
                Integer i = (Integer)iter.next();
                if(i == 5)
                    iter.remove();
                System.out.println(iter.next());
            }

    4)集合数组互转用Arrays.asList()/ArrayList.toArray()  但要注意:数组转化成集合Arrays.asList() 转化后的集合为固定长度,不可改变

    5)List的三个子类的特点:

    ArrayList:底层数据结构是数组,查询快,增删慢。线程不安全,效率高。 

    LinkedList:底层数据结构是链表,查询慢,增删快。线程不安全,效率高。 

    Vector:底层数据结构是数组,查询快,增删慢。线程安全,效率低。

    二、Set 

       a) 我们使用Set集合都是需要去掉重复元素的, 如果在存储的时候逐个equals()比较, 效率较低,哈希算法提高了去重复的效率, 降低了使用equals()方法的次数 

    当HashSet调用add()方法存储对象的时候, 先调用对象的hashCode()方法得到一个哈希值, 然后在集合中查找是否有哈希值相同的对象 如果没有哈希值相同

    的对象就直接存入集合 ,如果有哈希值相同的对象, 就和哈希值相同的对象逐个进行equals()比较,比较结果为false就存入, true则不存。

     b)TreeSet:有序,不可重复。可以指定一个顺序, 对象存入之后会按照指定的顺序排列

      1)自然顺序(Comparable)
      TreeSet类的add()方法中会把存入的对象提升为Comparable类型
      调用对象的compareTo()方法和集合中的对象比较
      根据compareTo()方法返回的结果进行存储
      
      2)比较器顺序(Comparator)
      创建TreeSet的时候可以指定一个Comparator
      如果传入了Comparator的子类对象, 那么TreeSet就会按照比较器中的顺序排序
      add()方法内部会自动调用Comparator接口中compare()方法排序
      调用的对象是compare方法的第一个参数,集合中的对象是compare方法的第二个参数

      3)两种方式的区别
      TreeSet构造函数什么都不传, 默认按照类中Comparable的顺序(没有就报错ClassCastException)
      TreeSet如果传入Comparator, 就优先按照Comparator

    三、Map

    1)HashMap和Hashtable的区别
    Hashtable是JDK1.0版本出现的,是线程安全的,效率低;HashMap是JDK1.2版本出现的,是线程不安全的,效率高
    Hashtable不可以存储null键和null值;HashMap可以存储null键和null值

    2)LinkedHashMap:链表实现,存放顺序和取出顺序一致

    3)TreeMap:可以根据键进行排序,排序规则的指定同TreeSet相同

    4)Map的遍历方式(包含增强for循环)

    public static void print1(Map map){
            Set keys = map.keySet();
            Iterator iter = keys.iterator();
            while(iter.hasNext()){
                Character key = (Character)iter.next();
                Integer value = (Integer)map.get(key);
                System.out.println(key + ":" + value);
            }
        }
    
    public static void print2(Map map){
            Set entrys = map.entrySet();
            Iterator iter = entrys.iterator();
            while(iter.hasNext()){
                Map.Entry entry = (Map.Entry)iter.next();
                Character key = (Character)entry.getKey();
                Integer value = (Integer)entry.getValue();
                System.out.println(key + ":" + value);
            }
        }
    
    public static void print3(Map map){
            Set entry = map.entrySet();
            for(Object entrys : entry){
                Map.Entry entryss = (Map.Entry)entrys;
                System.out.println(entryss.getKey() + ":" + entryss.getValue());
            }
        }
    
    public static void print4(Map map){
            Set keys = map.keySet();
            for(Object o : keys){
                Character key = (Character)o;
                System.out.println(key + ":" + map.get(key));
            }
  • 相关阅读:
    题解 CF171G 【Mysterious numbers
    题解 P1157 【组合的输出】
    题解 P3955 【图书管理员】
    题解 P2036 【Perket】
    题解 CF837A 【Text Volume】
    题解 CF791A 【Bear and Big Brother】
    题解 CF747A 【Display Size】
    题解 P1332 【血色先锋队】
    题解 P2660 【zzc 种田】
    题解 P4470 【[BJWC2018]售票】
  • 原文地址:https://www.cnblogs.com/wsyblog/p/7400686.html
Copyright © 2011-2022 走看看