• java_集合框架


    一、集合框架图

    二、Collection接口

        Collection中可以存储的元素间无序可以重复的元素。
        Collection接口的子接口List和Set,Map不是Collection的子接口。

    三、List接口

    List接口中的元素的特点:

        List中的元素有序,可以重复。

        两个常用的实现类ArrayList和LinkedList
        1,ArrayList
            类似数组形式存储,访问数度快,增删慢,线程不安全。
            Vector是ArrayList的多线程的一个替代品。
            ArrayList遍历方式:
    public static void main(String[] args) {
         List<String> list=new ArrayList<String>();
         list.add("111");
         list.add("222");
         list.add("333");
         //第一种遍历方法使用foreach遍历List
         for (String str : list) {//也可以改写for(int i=0;i<list.size();i++)这种形式
            System.out.println(str);
         }
     
         //第二种遍历,把链表变为数组相关的内容进行遍历
         String[] strArray=new String[list.size()];
         list.toArray(strArray);
         for(int i=0;i<strArray.length;i++) //这里也可以改写为foreach(String str:strArray)这种形式
         {
             System.out.println(strArray[i]);
         }
         
         //第三种遍历 使用迭代器进行相关遍历
         
         Iterator<String> ite=list.iterator();
         while(ite.hasNext())
         {
             System.out.println(ite.next());
         }
     }
        2,LinkedList
            类似链表结果,查询慢,增删快,线程不安全。
            LinkedList遍历方式:
    public static void main(String[] args) {
         
        List<String> list=new LinkedList<String>();
        list.add("111");
        list.add("222");
        list.add("333");
        //LinkedList遍历的第一种方式使用数组的方式
        String[] strArray=new String[list.size()];
        list.toArray(strArray);
        for(String str:strArray)
        {
            System.out.println(str);
        }
        //LinkedList遍历的第二种方式
        for(String str:list)
        {
            System.out.println(str);   
        }
    }

    四、Set接口

        Set中的元素无序,不重复。
        虽然Set中元素没有顺序,但是元素在set中的位置是有由该元素的HashCode决定的,其具体位置其实是固定的。
        Set集合中去重和Hashcode与equals方法之间相关。
        常见实现类有HashSet,LinedHashSet和TreeSet
        1,HashSet
            底层基于Hash算法进行存储元素,允许null,无序,不重复,元素位置固定
            HashSet是通过HashMap实现的。
            HashSet的几种遍历方法:
    public static void main(String[] args) {
         Set<String> set=new HashSet<String>();
         set.add("111");
         set.add("222");
         set.add("333");
         //遍历集合的第一种方法,使用数组的方法
         String[] strArray=new String[set.size()];
         strArray=set.toArray(strArray);
         for(String str:strArray)//此处也可以使用for(int i=0;i<strArray.length;i++)
         {
             System.out.println(str);
         }
         //遍历集合的第二中方法,使用set集合直接遍历
         for(String str:set)
         {
             System.out.println(str);
         }
          
         //遍历集合的第三种方法,使用iterator迭代器的方法
         Iterator<String> iterator=set.iterator();
         while(iterator.hasNext())
         {
             System.out.println(iterator.next());
         }
    }
      2,LinkHashSet
            LinkHashSet不仅是Set接口的子接口而且还是上面HashSet接口的子接口。
            TreeSet是通过TreeMap实现的。
            LinkHashSet底层是基于LinkedHashMap来实现,和HashSet主要区别在于LinkedHashSet中存储的元素是在哈希算法的基础上增加了链式表的结构。
      3,TreeSet
            TreeSet底层算法基于红黑树,允许null,有序,不重复,元素位置固定
            TreeSet和HashSet的区别:
                1,HashSet是通过HashMap实现的,TreeSet是通过TreeMap实现的
                2, Map的key和Set都有一个共同的特性就是集合的唯一性.TreeMap更是多了一个排序的功能.
                3, hashCode和equal()是HashMap用的, 因为无需排序所以只需要关注定位和唯一性即可.
                    a. hashCode是用来计算hash值的,hash值是用来确定hash表索引的.
                    b. hash表中的一个索引处存放的是一张链表, 所以还要通过equal方法循环比较链上的每一个对象才可以真正定位到键值对应的Entry.
                    c. put时,如果hash表中没定位到,就在链表前加一个Entry,如果定位到了,则更换Entry中的value,并返回旧value
                4, 由于TreeMap需要排序,所以需要一个Comparator为键值进行大小比较.当然也是用Comparator定位的.
                    a. Comparator可以在创建TreeMap时指定
                    b. 如果创建时没有确定,那么就会使用key.compareTo()方法,这就要求key必须实现Comparable接口.
                    c. TreeMap是使用Tree数据结构实现的,所以使用compare接口就可以完成定位了.
    public static void main(String[] args) {
            //String实体类中实现Comparable接口,所以在初始化TreeSet的时候,
            //无需传入比较器
            TreeSet<String> treeSet=new TreeSet<String>();
            treeSet.add("d");
            treeSet.add("c");
            treeSet.add("b");
            treeSet.add("a");
            Iterator<String> iterator=treeSet.iterator();
            while(iterator.hasNext())
            {
                System.out.println(iterator.next());
            }
    }

    五、Map接口

        Map中的每个成员方法由一个关键字(key)和一个值(value)构成。
        常见实现类HashMap、TreeMap、LinkedHashMap、HashTable
        1,HashMap
            HashMap无序的、不可重复、查询快、null、非线程安全。
            HashMap实现了Map、CloneMap、Serializable三个接口,并且继承自AbstractMap类。
            HashMap基于hash数组实现,若key的hash值相同则使用链表方式进行保存。
            HashMap遍历方式
    public static void main(String[] args) {
            //方式1
            Map map = new HashMap();
            map.put("A", "1233");
            map.put("B", "12334");
            map.put("C", "12334");
            Iterator iter = map.entrySet().iterator();
            while (iter.hasNext()) {
                Map.Entry entry = (Map.Entry) iter.next();
                System.out.println(entry.getKey() + "--" + entry.getValue());
            }
            //方式2效率高
            iter = map.keySet().iterator();  
            while (iter.hasNext()) {  
                Object key = iter.next();
                System.out.println(key + "--" + map.get(key));
            }  
        }
      2,TreeMap
            TreeMap有序的、不可重复、遍历快、允许null、非线程安全。
            HashMap基于红黑树实现。
        3,LinkedHashMap
            LinkedHashMap有序的、不可重复、遍历快、允许null、非线程安全。
            LinkedHashMap输出顺序和输入顺序相同。
            LinkedHashMap继承hashMap,底层存储结果是Hashmap的table
        4,Hashtable
            Hashtable有序的、不可重复、不允许null、线程安全。
  • 相关阅读:
    x64 平台开发 Mapxtreme 编译错误
    hdu 4305 Lightning
    Ural 1627 Join(生成树计数)
    poj 2104 Kth Number(可持久化线段树)
    ural 1651 Shortest Subchain
    hdu 4351 Digital root
    hdu 3221 Bruteforce Algorithm
    poj 2892 Tunnel Warfare (Splay Tree instead of Segment Tree)
    hdu 4031 Attack(BIT)
    LightOJ 1277 Looking for a Subsequence
  • 原文地址:https://www.cnblogs.com/my-haohao/p/5659104.html
Copyright © 2020-2023  润新知