类集框架解析

    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));
        }
原文地址:https://www.cnblogs.com/wsyblog/p/7400686.html