java基礎(chǔ)(三)--集合

Collection:

添加:add(Obj); 刪除:remove(Obj);判斷:contains(Obj),isEmpty() 個(gè)數(shù):size();

List:有序,可以元素重復(fù),元素都有索引。

添加:add(index,Obj) ;刪除:remove(index) 取出:get(index) ;修改: set(index,Obj) 索引:indexOf(Obj); 子列表:subList(start,end)

ArrayList:

數(shù)據(jù)結(jié)構(gòu)是:數(shù)組,線程不安全的,查詢速度快。

Vector:

數(shù)據(jù)結(jié)構(gòu):數(shù)組,線程安全。無論增刪或者查詢效率都很低。被ArrayList替代。

LinkedList:

數(shù)據(jù)結(jié)構(gòu):鏈表。線程不安全的,增刪速度很快。

Set:無序,不可以元素重復(fù),其中的方法和Collection一致。

HashSet:

數(shù)據(jù)結(jié)構(gòu):哈希表。如何保證元素唯一性的呢? 元素的兩個(gè)方法,hashCode,equals來完成元素唯一性。先判斷hashCode是否想等,如果相等才會(huì)判斷equals。

TreeSet:

數(shù)據(jù)結(jié)構(gòu):二叉樹。可以對(duì)Set集合中的元素進(jìn)行自定義的排序。那么排序就需進(jìn)行比較。
元素的比較方式一:
讓元素自身具備比較性,需要實(shí)現(xiàn)Comparable,覆蓋compareTo(obj)方法。
元素的比較方式二:
當(dāng)元素自身不具備比較性,或者元素具備的比較性不是所需要,這時(shí)就必須用第二種方式。
讓容器具備比較性。定義一個(gè)類去實(shí)現(xiàn)Comparator接口,并覆蓋compare(obj1,obj2)方法。
并將Comparator接口的子類對(duì)象作為參數(shù)傳遞TreeSet集合的構(gòu)造函數(shù)。
TreeSet集合如何保證元素唯一性的呢?通過return 0;
相對(duì)而言,第二種方式較為常用。
注意:在進(jìn)行比較的時(shí),一定要明確主要條件和次要條件。
技巧:
當(dāng)看到Hash開頭的對(duì)象,底層用的是哈希表。就要想到hashCode方法和equals方法。
當(dāng)看到Tree開頭,就要想到二叉樹。就要想到兩個(gè)接口,
一個(gè)是Comparable,一個(gè)是Comparator。

Vector是JDK1.0版本出現(xiàn),里面有一種取出方式:枚舉Enumeration。
該枚舉中有兩個(gè)方法: hasMoreElements() nextElement()
因?yàn)槊Q過長(zhǎng),被迭代器Iterator替代:
hasNext() next() 明確的是枚舉和迭代的功能是一致的。

迭代器(Iterator):

其實(shí)就是一種取出方式,加上循環(huán)可以取出容器中所有元素。 相當(dāng)于,大型游戲廳里的 抓娃娃的游戲。迭代器就是這個(gè)游戲中的夾子。 是一種規(guī)則,每一個(gè)容器都在內(nèi)部實(shí)現(xiàn)了這個(gè)取出規(guī)則。 每一個(gè)容器都通過一個(gè)方法返回了一個(gè)符合規(guī)則的對(duì)象,這個(gè)方法就是iterator();該法方法在JDK1.5被抽取到了Iterable接口中,Iterable接口是Collection的父接口,它的出現(xiàn)提供了一個(gè)增強(qiáng)的for循環(huán)。

ArrayList al = new ArrayList();
al.add("abc");
for(Iterator it = al.iterator(); it.hasNext(); )
        {
            Object obj = it.next();

            //只使用Object中的方法可以不用強(qiáng)轉(zhuǎn)。
            System.out.println(obj.toString());//打印的是abc。

            //如果想打印元素的長(zhǎng)度。就必須要強(qiáng)轉(zhuǎn),因?yàn)橛玫搅嗽氐奶赜蟹椒ā?            String s = (String)obj;
            System.out.println(s.length());

        }

因?yàn)槿萜骺梢源娣挪煌愋偷膶?duì)象,在添加的時(shí)候,add方法必須通過參數(shù)Object來接收。
add(new Demo());//Object obj = new Demo();
通過add方法,元素都被提升成了object 。
所以取出的一定是Object,那么如果只使用Object類中的方法,可以不需要強(qiáng)轉(zhuǎn)。
如果要使用元素的特有方法,必須要強(qiáng)轉(zhuǎn)。代碼如上。
在實(shí)際開發(fā)時(shí),對(duì)于事物的描述。取出特有屬性和行為外,
最好重寫hashCode方法和equals方法,同時(shí)實(shí)現(xiàn)Comparable接口。定義該事物自然比較方式。

class Student implements Comparable
    {
        private String name;
        private int age;
        Student(String name,int age)
        {
            this.name = name;
            this.age = age;
        }
        public int compareTo(Object obj)
        {
            Student s = (Student)obj;
            if(this.age>s.age)
                return 1;
            if(this.age==s.age)
                return this.name.compareTo(s.name);
            return -1;
        }
        public boolean equals(Object obj)
        {
            if(!(obj instanceOf Student))
                return false;
            Student s = (Student)obj;

            return this.name.equals(s.name) && this.age == s.age;
                
        }
        public int hashCode()
        {
            return name.hashCode()+age*39;
        }

        public String getName()
        {
            return name;
        }
        public String toString()
        {
            return name+":::"+age;
        }
    }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容