转载和引用,请注明原文出处! Fork me on GitHub
结局很美妙的事,开头并非如此!

集合

一、为什么要使用集合

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

二、集合间的区别

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
版权归作者所有,转载请注明出处

posted @ 2017-10-06 12:05  小不点啊  阅读(472)  评论(0编辑  收藏  举报