zoukankan      html  css  js  c++  java
  • 集合

    一、为什么要使用集合

      当定义一个数组来存数据的时候长度可能不够用,此时集合类是最好的考虑

    二、集合间的区别

    1.  ArrayList与LinkedList的区别

         1.1 ArrayList的内部实现是数组,每当删除或增加一个元素的时候整个数组就会移动;优势是在进行查询的时候比较快速,因为只要找到ArrayList元素的下标即可进行操作,所以在对数组进行大量查询操作的时候,用ArrayList

    ArrayList<Integer> a = new ArrayList<Integer>();// 动态数组
    a.add(1);
    a.add(2);
    a.add(3);
    a.add(4);
    List<Integer> b = a.subList(2, 4);
    for (Integer temp : b) {
    out.println(temp);
    }
    out.println(a.indexOf(2)); // 通过indexof充分体现了这个内部的实现原理就是数组
    out.println(a.indexOf(21));


         1.2 LinkedList的内部实现是链表,每当删除或增加一个元素的时候只需对链表的节点进行操作就行,不用移动整个数组;优势是在进行修改和删除的时候比较快速,因为只要找到对应的链表节点即可进行删除,在进行大量的修改和删除操作的时候使用LinkedList

    LinkedList<Integer> a = new LinkedList<Integer>();// 链表
    a.add(1);
    a.add(2);
    a.add(3);
    a.add(4);
    for (Integer temp : a) {
    out.println(temp);
    }

    2. ArrayList与Vector的区别

       2.1 ArrayList是非线程安全的,采用异步处理模式,性能更高
       2.2 Vector是线程安全的,采用同步处理模式,性能较低
       2.3 两个集合类的方法在使用上完全一样

    3. HashSet、linkedHashSet、TreeSet的区别

       3.1 HashSet的实现原理是哈希表,内部元素是无序不可重复的,插入的元素在输出的时候也是无序的

    class aaa {
    
        aaa(int i) {
            this.i = i;
        }
    
        int i = 1;
    }
    
    public class Test {
        public static void main(String[] args) {
            // hashset不能保证插入数据的顺序,特别是保证该代码一直不变,
            //// 实现原理是哈希表
            // 如果要保证插入顺序即为输出顺序的话使用LinkedHashSet
            HashSet<aaa> h1 = new HashSet<aaa>();
            h1.add(new aaa(2));// 分配堆内存以后把地址给h1
            h1.add(new aaa(5));
            h1.add(new aaa(2));// 虽然set不能有重复的但这两个值其实是不一样的因为new的地址不一样
            h1.add(new aaa(4));
            h1.add(new aaa(6));
            h1.add(new aaa(0));
    
            for (aaa j : h1) {
                out.println(j.i);// 遍历输出h1地址指向的值
            }
    
            h1.add(null);// 此类允许使用 null 元素,但不能空输出
    
        }
    }

    输出结果:2,0,6,2,5,4

       3.2、LinkedHashSet的实现原理是哈希表和链表,可以对插入的元素进行原样输出

    package com.study.test;
    
    import static java.lang.System.out;
    
    import java.util.LinkedHashSet;
    
    class aaa {
    
        aaa(int i) {
            this.i = i;
        }
    
        int i = 1;
    }
    
    public class Test {
        public static void main(String[] args) {
            LinkedHashSet<aaa> h1 = new LinkedHashSet<aaa>();
            // 具有可预知迭代顺序的 Set 接口的哈希表和链接列表实现
            h1.add(new aaa(2));
            h1.add(new aaa(2));// 这里两个 new aaa()其实是不一样的
            h1.add(new aaa(1));
            h1.add(new aaa(4));
            h1.add(new aaa(3));
            for (aaa temp : h1) {
                out.println(temp.i);
            }
            h1.add(null);// 此类允许使用 null 元素
    
        }
    }

    输出结果:2,2,1,4,3

       3.3、TreeSet可以对插入的元素进行排序后再输出,会把一样的值去掉一个

    TreeSet<Integer> h1 = new TreeSet<Integer>();
            // 可以排序的set
            h1.add(2);
            h1.add(3);
            h1.add(8);
            h1.add(4);
            h1.add(4);
            for (int temp : h1) {
                out.println(temp);
            }

    输出结果:2,3,4,8

    4. HashMap和Hashtable的区别

       4.1、HashMap是非线程安全的,采用异步处理模式,性能更高
       4.2、Hashtable是线程安全的,采用同步处理模式,性能较低
       4.3、两个集合类的方法再使用上完全一样

    5. HashMap和IdentityHashMap的区别

     5.1、HashMap的内部是用equals来比较的,比较的是内容,当键值内容相等时,不允许重复的键值
     5.2、IdentityHashMap内部是用==来比较的,比较的是地址,当地址不相同但内容相同时是允许重复的

    package com.study.test;
    
    import static java.lang.System.out;
    
    import java.util.HashMap;
    import java.util.IdentityHashMap;
    import java.util.Iterator;
    import java.util.Map.Entry;
    import java.util.Set;
    
    class aa implements Comparable<aa> {
        int i = 1;
    
        aa(int i) {
            this.i = i;
        }
    
        @Override
        public int compareTo(aa o) { // 这函数就是排序的依据
            // TODO Auto-generated method stub
            return this.i - o.i;
        }
    
    }
    
    public class Test {
        public static void main(String[] args) {
            HashMap<Integer, String> k = new HashMap<Integer, String>();
            // TODO Auto-generated method stub
            HashMap<String, String> k1 = new HashMap<String, String>();// 用equals比较 比较的是内容
            String s1 = new String("1");
            String s2 = new String("2");
            String s3 = new String("2");
            String s4 = new String("3");
            k1.put(s1, "tom");
            k1.put(s2, "jack");
            k1.put(s3, "jack1");
            k1.put(s4, "mary");
            for (Entry<String, String> temp : k1.entrySet()) {
                out.println(temp.getKey() + "," + temp.getValue());
            }
            out.println(k1.size());
    
            // 用==比较,比较的是地址
            // 此类不是 通用 Map 实现!此类实现 Map 接口时,它有意违反 Map 的常规协定,
            // 该协定在比较对象时强制使用 equals 方法。此类设计仅用于其中需要引用相等性语义的罕见情况。
            out.println("---------------identityHashMap-----------------");
            IdentityHashMap<String, String> k2 = new IdentityHashMap<String, String>();// 用==比较,比较的是地址
            k2.put(s1, "tom");
            k2.put(s2, "jack");
            k2.put(s3, "jack1");
            k2.put(s4, "mary");
            for (Entry<String, String> temp : k2.entrySet()) {
                out.println(temp.getKey() + "," + temp.getValue());
            }
            out.println(k1.size());
        }
    }

    输出结果:

    1,tom
    2,jack1
    3,mary
    3
    ---------------identityHashMap-----------------
    1,tom
    2,jack1
    3,mary
    2,jack
    3

    6. TreeSet和TreeMap的区别

     6.1、TreeSet与TreeMap实现原理都是红黑树,都能够对内部元素进行排序后输出
     6.2、都要实现Comparable<T>泛型接口,否则不能比较

    package com.study.test;
    
    import static java.lang.System.out;
    
    import java.util.Map.Entry;
    import java.util.TreeMap;
    
    class aaa implements Comparable<aaa> {
        aaa(int i) {
            this.i = i;
        }
    
        int i = 1;
    
        @Override
        public int compareTo(aaa o) {
            // TODO Auto-generated method stub
            return this.i - o.i;
        }
    
    }
    
    public class Test {
        public static void main(String[] args) {
            TreeMap<aaa, String> h1 = new TreeMap<aaa, String>();
            // 可以排序的set
            h1.put(new aaa(2), "jack");
            h1.put(new aaa(1), "tom");
            h1.put(new aaa(3), "mary");
            for (Entry<aaa, String> temp : h1.entrySet()) {
                out.println(temp.getKey().i + "," + temp.getValue());
            }
    
            // 因为Integer是实现了Comparable接口的,所以做为key的比较
            TreeMap<Integer, String> h2 = new TreeMap<Integer, String>();
            // 可以排序的set
            h2.put(2, "jack");
            h2.put(1, "tom");
            h2.put(3, "mary");
            for (Entry<Integer, String> temp : h2.entrySet()) {
                out.println(temp.getKey() + "," + temp.getValue());
            }
        }
    }

    三、集合的方法的使用

    1. HashMap和Hashtable各种方法的使用(HashMap与Hashtable的使用完全一样)

    package com.study.test;
    
    import static java.lang.System.out;
    
    import java.util.HashMap;
    import java.util.Iterator;
    import java.util.Map.Entry;
    import java.util.Set;
    
    class aa implements Comparable<aa> {
        int i = 1;
    
        aa(int i) {
            this.i = i;
        }
    
        @Override
        public int compareTo(aa o) { // 这函数就是排序的依据
            // TODO Auto-generated method stub
            return this.i - o.i;
        }
    
    }
    
    public class Test {
        public static void main(String[] args) {
            HashMap<Integer, String> k = new HashMap<Integer, String>();
            // 增加
            k.put(1, "jack");
            k.put(2, "rose");
            k.put(3, "alan");
            k.put(4, "jim");
            // out.println(k.size());
            // 删除
            k.remove(1);
            // out.println(k.size());
            // 改 先删除再修改
            //// out.println(k.get(2));
            // bollean型
            // out.println(k.containsKey(2));//s输出为true
            // out.println(k.containsValue("rose"));
    
            // HashMap<Integer,String> k1=new HashMap<Integer,String>();
            // //增加元素
            // k1.put(11, "lgs");
            // k1.put(22, "yc");
    
            // 把一个HashMap添加到另一个HashMap里面去
            // k.putAll(k1);
            // out.println(k.size());
    
            // k.clear();清除k中的所有元素
            // out.println(k.isEmpty());
    
            // Set<Integer> s1=k.keySet();
            // for(Integer s:s1){
            // out.println(s);
            // }
            // Collection<String> c=k.values();
            // for(String s:c){
            // out.println(s);
            // }
            // //输出HashMap的内容
            // //使用entrySet()方法将键值封装成set类型的
            Set<Entry<Integer, String>> k1 = k.entrySet();
            // //遍历输出set的内容
            for (Entry<Integer, String> k2 : k1) {
                out.println(k2.getKey() + "," + k2.getValue());
            }
    
            // 拆解set里面的内容
            // 迭代输出set里面的内容
            out.println("-------迭代输出set里面的内容-------");
            Iterator<Entry<Integer, String>> i1 = k1.iterator();
            while (i1.hasNext()) {
                Entry<Integer, String> e = i1.next();
                out.println(e.getKey() + "," + e.getValue());
            }
        }
    }

    2. PriorityQueue优先队列各种方法的使用

    package com.study.test;
    
    import static java.lang.System.out;
    
    import java.util.PriorityQueue;
    
    public class Test {
        public static void main(String[] args) {
            // 队列:先进先出
            // 优先队列
            PriorityQueue<Integer> p = new PriorityQueue<Integer>();
            p.add(1);// 把元素添加到队列的尾部,如果空间不够自动开辟空间
            p.add(2);
            p.offer(3);// 把元素添加到队列的尾部,如果空间不够不会自动开辟空间,适用于空间被指定的队列集合
            // out.println(p.size());
            // p.remove();//获取队列头部的元素并删除
            // for(Integer p1:p){
            // out.println(p1);
            // }
            out.println(p.peek());// peek()方法看一下头部元素而已 不删除 队列为空时返回null
            out.println(p.size());
            out.println(p.element());// element()方法获取队列的头部元素 不删除
            out.println(p.size());
            out.println(p.poll());// poll()方法获取队列的头部元素 并删除 队列为空时返回null
            out.println(p.size());
    
            for (Integer p1 : p) {
                out.println(p1);
            }
        }
    }

    3. 双向链表LinkedList中各种方法的使用

    package com.study.test;
    
    import static java.lang.System.out;
    
    import java.util.LinkedList;
    
    public class Test {
        public static void main(String[] args) {
            // 双向队列
            LinkedList<Integer> l = new LinkedList<Integer>();
            // l.add(9);//将指定元素插入双向队列的尾部
            // l.push(18);//push()方法将一个元素放入双向队列的头部
            l.addFirst(1);// 将指定元素插入双向队列的开头 与offerFist()方法类似
            l.addFirst(2);
            l.addFirst(3);
            // l.add(9);//将指定元素插入双向队列的尾部
            // l.add(19);//将指定元素插入双向队列的尾部
            l.addLast(4);// 将指定元素插入双向队列的结尾 offerLast()方法类似
            l.addLast(1);
            // for(Integer k:l){
            // out.println(k);
            //
            // }
            // out.println(l.getFirst());//获取双向队列的第一个元素
            // out.println(l.getLast());//获取双向队列的最后一个元素
            // out.println(l.removeFirstOccurrence(1)); //删除第一个重复的
            // for(Integer k:l){
            // out.println(k);
            //
            // }
            // out.println(l.removeLastOccurrence(1)); //删除最后一个重复的
            for (Integer k : l) {
                out.println(k);
    
            }
    
            //
            // out.println(pq.peekFirst());
            // out.println(pq.peekLast());
            // out.println(pq.pollFirst());
            // out.println(pq.pollLast());
            // out.println("----------------");
            // for(Integer temp:pq)
            // out.println(temp);
            // out.println(pq.pop());
            // out.println(pq.removeFirst());
            // out.println("----------------");
            // for(Integer temp:pq)
            // out.println(temp);
        }
    }

    4. Properties的使用(自己创建读取Properties文件的过程)

    package com.study.test;
    
    import static java.lang.System.out;
    
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.util.Map.Entry;
    import java.util.Properties;
    import java.util.Set;
    
    public class Test {
    
        public static void main(String[] args) throws FileNotFoundException, IOException {
            // TODO Auto-generated method stub
            // 创建配置文件过程
            Properties pOut = new Properties();
            // 设置配置文件的属性
            pOut.setProperty("username", "pw1");
            pOut.setProperty("username1", "pw2");
            // 把文件存到硬盘上并命名
            pOut.store(new FileOutputStream("test.properties"), "ini file");
    
            // 从硬盘读取配置文件的过程
            Properties pIn = new Properties();
            pIn.load(new FileInputStream("test.properties"));
            Set<Entry<Object, Object>> s1 = pIn.entrySet();
            for (Entry<Object, Object> s : s1) {
                out.println(s.getKey() + "," + s.getValue());
            }
    
        }
    
    }

    输出结果:

    username1,pw2
    username,pw1


    作者:小不点啊
    出处:http://www.cnblogs.com/leeSmall/p/7631344.html
    版权归作者所有,转载请注明出处

  • 相关阅读:
    RA-Embedding-based Retrieval in Facebook Search
    RA-Recommending What Video to Watch Next: A Multitask Ranking System
    家事杂谈-2
    工作体会-3
    CCS
    CCS
    CCS
    CCS
    CCS
    CCS
  • 原文地址:https://www.cnblogs.com/leeSmall/p/7631344.html
Copyright © 2011-2022 走看看