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;
}
}