1. 程式人生 > >Set,List,Map

Set,List,Map

Set(集)
List(列表)
Map(對映)

List特點:元素有放入順序,元素可重複
Map特點:元素按鍵值對儲存,無放入順序
Set特點:元素無放入順序,元素不可重複(注意:元素雖然無放入順序,但是元素在set中的位置是有該元素的HashCode決定的,其位置其實是固定的)

List介面有三個實現類:LinkedList,ArrayList,Vector
LinkedList:底層基於連結串列實現,連結串列記憶體是散亂的,每一個元素儲存本身記憶體地址的同時還儲存下一個元素的地址。連結串列增刪快,查詢慢
ArrayList和Vector的區別:ArrayList是非執行緒安全的,效率高;Vector是基於執行緒安全的,效率低

Set介面有兩個實現類:HashSet(底層由HashMap實現),LinkedHashSet
SortedSet介面有一個實現類:TreeSet(底層由平衡二叉樹實現)
Query介面有一個實現類:LinkList

Map介面有三個實現類:HashMap,HashTable,LinkeHashMap
HashMap非執行緒安全,高效,支援null;HashTable執行緒安全,低效,不支援null
SortedMap有一個實現類:TreeMap
其實最主要的是,list是用來處理序列的,而set是用來處理集的。Map是知道的,儲存的是鍵值對
set 一般無序不重複.map kv 結構 list 有序

Set:

package cn.hncu.search.set;

public class MySet {
    private Object[] objs = new Object[0];

    public boolean add(Object obj) {
        // 衛條件---相同的物件只能放一份,因此有重複的物件則放不進去
        if (contains(obj)) {
            return false;
        }

        // 經過上面的衛條件,說明當前物件在集合中不存在,可以加
        // 1先建立一個新的陣列,長度為原來的加1
Object tmpObjs[] = new Object[objs.length + 1]; // 2把原來陣列當中的元素拷到新的當中 System.arraycopy(objs, 0, tmpObjs, 0, objs.length); // 3把將要加入集合的物件obj放在新陣列中的最後一個位置 tmpObjs[objs.length] = obj; // 4把新陣列賦給objs objs = tmpObjs; return true; } public Object[] getAll() { return objs; } public boolean contains(Object obj) { for (Object tm : objs) { if (tm.equals(obj)) { return true; } } return false; } public int size() { return objs.length; } }
import org.junit.Test;

public class TestMySet {

    @Test //測試新增基本資料型別
    public void test1(){
        MySet set = new MySet();
        set.add(1);
        set.add("hello");
        set.add("+");
        set.add(1);//測試重複

        Object objs[] = set.getAll();
        for(Object obj:objs){
            System.out.println(obj);
        }
    }

    @Test //測試新增自定義型別
    public void test2(){
        MySet set = new MySet();
        Person p = new Person("Jack",20);
        Person p2 = new Person("Jack",20);//測試重複
        Person p3 = new Person("Rose",22);
        set.add(p);
        set.add(p2);
        set.add(p3);

        set.add( new A(1,23.5));
        set.add( new A(2,53.5));
        set.add( new A(100,123.5));
        set.add( new A(100,123.5));//測試重複
        set.add( new A(8,98));



        Object objs[] = set.getAll();
        for(Object obj:objs){
            System.out.println(obj);
        }
    }

}

class Person{
    private String name;
    private int age;
    public Person(String name, int age) {
        super();
        this.name = name;
        this.age = age;
    }



    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + age;
        result = prime * result + ((name == null) ? 0 : name.hashCode());
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Person other = (Person) obj;
        if (age != other.age)
            return false;
        if (name == null) {
            if (other.name != null)
                return false;
        } else if (!name.equals(other.name))
            return false;
        return true;
    }

    @Override
    public String toString() {
        return name + "," + age;
    }
}

class A{
    private int x;
    private double y;
    public A(int x, double y) {
        super();
        this.x = x;
        this.y = y;
    }

    @Override
    public int hashCode() {

        final int prime = 31;
        int result = 1;
        result = prime * result + x;
        long temp;
        temp = Double.doubleToLongBits(y);
        result = prime * result + (int) (temp ^ (temp >>> 32));
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        A other = (A) obj;
        if (x != other.x)
            return false;
        if (Double.doubleToLongBits(y) != Double.doubleToLongBits(other.y))
            return false;
        return true;
    }

    @Override
    public String toString() {
        return "[" + x + "," + y + "]";
    }

}

List:


import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

//演示集合的普通操作
public class ListDemo {

    //新增到List中的元素的順序與它的HashCode無關,是按照新增的先後順序存放
    public static void main(String[] args) {
        List list = new ArrayList();
        list.add(11);
        list.add("abc");
        list.add(45.6);
        list.add(11);//List允許新增重複的元素
        list.add(new Person("Jack",22));
        list.add(new Person("Jack",22));//List允許新增重複的元素
        list.add(new Person("Tom",21));

        //查(遍歷)--法1
        Iterator it = list.iterator();
        while(it.hasNext()){
            Object obj = it.next();
            System.out.println(obj);
        }
        System.out.println("-----------");

        //查(遍歷)--法2  ----利用與位置相關的方法來實現
        for(int i=0; i<list.size(); i++){
            System.out.println( list.get(i) );
        }

    }

}

Map:


import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
/**
 * 開發的一個Map容器
  *@author<a href="mailto:[email protected]">廖枝平</a>
  *@version 1.0 2017-1-6 上午8:55:04
  *@fileName MyMap.java
 */
public class MyMap {
    private Map map = new HashMap();
    /**
     * @param key
     * 新增加元素的鍵
     * @param value
     * 新增加元素的值
     * @return
     * 返回值是原來容器中該key所對應的value值,如果原來不存在則返回null
     */
    public Object put(Object key,Object value){
        return map.put(key, value);
    }

    //刪
    public Object remove(Object key){
        return map.remove(key);
    }

    //改
    public boolean update(Object key,Object value){
        if(map.get(key)==null){
            return false;
        }else{
            map.put(key, value);
            return true;
        }
    }

    //查(單、全、條件)
    public Object get(Object key){
        return map.get(key);
    }
    public Map getAll(){
        return map;
    }
    public Map getByCondition(String strValue){
        Map m = new HashMap();
        Set<Entry> entries = map.entrySet();
        for(Entry en:entries){
            Object value = en.getValue();
            if(value.toString().contains(strValue)){
                Object key=en.getKey();
                m.put(key, value);
            }
        }

        return m;
    }

}