Java 集合總結

openkk 13年前發布 | 29K 次閱讀 Java Java開發

Iterator:迭代器。
    用來取出Collection集合中的元素。
    每一個集合都在內部根據自己的特有數據結構對該結構通過內部類完成出去動作的實現。
    并通過iterator()可以獲取到迭代器對象。
    通過該對象hasNext()判斷集合中是否有下一個元素。在通過next方法取出元素。
    注意:next()方法每調用一次,內部指針就會向下偏移。next在迭代過程被調用多次,有可能發生NoSuchElementException.

迭代器就像大型游戲中的抓布娃娃的游戲中的夾子。

通過AbstractList的源碼可以查看內部類的具體實現。


在使用Iterator的時候,迭代元素的過程中,如果有對元素的操作,只可以使用remove方法。
不可以直接在迭代時使用集合對象的操作方法操作正在被迭代的數據,因為會發生ConcurrentModificationException。

如果想要對迭代中的元素進行增刪操作,需要使用ListIterator這個Iterator的子接口。

注意:ListIterator只能對List集合有效。參考day12\IteratorDemo.java.


JDK1.5以后,將Collection中的方法,抽取到了一個父接口中,Iterable該接口的出現,提供了增強型的for循環。


List集合中有一個Vector子類,該子類是jdk1.0出現的,該子類中有自己獨特的獲取元素的方式:枚舉Enumeration。 枚舉和迭代功能是一致的,很遺憾,因為名稱過長,建議使用迭代。

枚舉中的方法:hasMoreElements()  nextElement().

ArrayList有兩種取出方式:1,迭代。2,get(index).
Vector有四種方式:1,迭代。2,get(index).3,elementAt(index) 4,枚舉。


Vector的特點:1,數組數據結構,2,線程安全,3,自動延長通過100%方式。

因為Vector的低效被ArrayList取代。



LinkedList: 特點:1,鏈表數據結構,2,線程是不安全。3,對元素增刪速度很快。

與ArrayList的不同的是,ArrayList查詢速度很快。

特有方法:
addFirst():
addLast();
jdk1.6出現新的方法:
offsetFirst();
offsetLast();


getFirst():獲取元素,但不刪除,
getLast();
jdk1.6出現新的方法:
peekFirst();
peekLast();

removeFirst():獲取元素,但刪除。
removeLast();
jdk1.6出現新的方法:
pollFirst();
pollLast();



Example: 1,如果通過枚舉取出ArrayList中的元素。 public void getElmementByEnumeration() { ArrayList al =new ArrayList(); al.add("abc1");

        final Iterator it = al.iterator();

        Enumeration en = new Enumeration()
        {
            public boolean hasMoreElements()
            {
                return it.hasNext();
            }
            public Object nextElement()
            {
                return it.next();
            }
        };

        while(en.hasMoreElements())
        {
            System.out.println(en.nextElement());
        }
    }

2,去除ArrayList中重復元素。

    public List getSingleElementList(List list)
    {
        List l = new ArrayList();
        Iterator it = list.iterator();

        while(it.hasNext())
        {
            Object obj = it.next();
            if(!l.contains(obj))
                l.add(obj); 
        }
        return l;
    }

3,模擬一個隊列或者堆棧數據結構,通過LinkedList完成。
    隊列:先進先出。
    堆棧:先進后出。
    class DuiLie
    {
        private LinkedList ll;
        DuiLie()
        {
            ll = new LinkedList();
        }

        public void myAdd(Object obj)
        {
            ll.addFirst(obj);
        }
        public Object myGet()
        {
            ll.removeLast();
        }
        public boolean isNull()
        {
            return ll.isEmpty();
        }
    }
    main()
    {
        DuiLie dl = new DieLie();
        dl.myAdd("abc1");
        dl.myAdd("abc3");

        while(!dl.isNull())
        {
            System.out.println(dl.myGet());
        }
    }



Set:無序,不可以重復元素。方法和Collection一致。 取出方法只有一個就是迭代器。而且set集合不可以修改元素。 |--HashSet:底層數據結果是哈希表,如何保證元素唯一性的呢? 通過每一個元素的hashCode方法返回值相同,并equals方法返回true來判斷元素唯一性。 如果hashCode值相等,才會判斷equals方法。

class Demo
{
    public static void main(String[] args)
    {
        HashSet hs = new HashSet();
        //hs.add("abc1");
        //hs.add("abc2");
        //hs.add("abc1");//返回值是false。因為String有自己的hashCode和equals方法。


        hs.add(new Student("lisi1",20));
        hs.add(new Student("lisi2",20));
        hs.add(new Student("lisi3",20));
        hs.add(new Student("lisi1",20));

        System.out.println(hs.size());//4,對于同名同年齡的學生被視為相同對象,但已經存入。
                        //原因:因為在進行hashCode方法和equals方法判斷的時候使用的是、、//Object類中的方法。

                        //為了保證符合自定義條件的對象相同。需要復寫hashCode和equals方法。
    }
}


class Student
{
    private String name;
    private int age;
    Student(String name,int age)
    {
        this.name = name;
        this.age = age;
    }

    public boolean equals(Object obj)
    {

        if(this==obj)
            return true;
        if(!(obj instanceOf Student))
            return false;
        Student s = (Student)obj;
        //System.out.println(this.name+"..."+s.name);
        return this.name.equals(s.name) && this.age == s.age;
    }
    public int hashCode()
    {
        return name.hashCode()+age*27;
    }
    public String getName()
    {
        return name;
    }
    public String getAge()
    {
        return age;
    }
}

在HashSet判斷是否包含指定元素時,使用Contains方法判斷,依據哪些方法:
    hashCode(),,equals();
    一看hash,就要想到hash表,想到hash表,就必須要覆蓋hashCode和equals方法。

在ArrayList判斷是否包含指定元素,使用Contains方法判斷依據是:equals。



Map集合: 特點:一次存入一對元素(key Value)一定要保證鍵的唯一性。

添加:v put(k,v):返回去k關聯的前一個值,如果沒有,返回null。
刪除:v remove(k);
獲取: v get(k):好處,可以判斷某一個鍵是否存在。但是注意。有null的值情況。
判斷:containsKey(k).containsValue(v);

獲取所有:
    Set<K> keySet():將map集合中的所有鍵取出存入到Set集合中。在通過迭代器取出所欲的鍵,
        并通過map的get方法獲取鍵所對應的值。

    Set<Map.Entry<K,V>> entrySet():將map集合中的所有鍵值關系封裝成Map.Entry類型的對象,存入到Set集合中。
                    該關系的類型為Map.Entry.通過迭代器取出Map.Entry對象并通過getKey。
                    getValue方法獲取所有元素。

    原理:就是將Map集合轉成Set集合。在進行迭代。

獲取所有值:Collection<V> values();

|--HashMap:底層是哈希表,線程不同步,可以存入null鍵null值。
|--Hashtable:底層也是哈希表,線程是安全的,不可以存入null鍵null值。
|--TreeMap:可以對map集合中的鍵進行排序。線程不安全的。


什么時候使用Map集合呢?
當對象鍵有映射關系時。。</pre><br />
 本文由用戶 openkk 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!