集合知識點總結1
集合就是一個已經封裝好的物件
集合三大介面
Collection 所有集合類的跟介面
Map 對映介面,存放鍵值對
Iterator 遍歷集合的迭代介面
Java的集合框架是由很多介面、抽象類、具體類組成的,都位於java.util包中。除Comparable位於Java.lang包
Collection(單列集合的跟介面)<E>(泛型)1.2JDK版本
collection因為是介面不能例項化不能新建物件,所以要用實現類,那麼要父類引用指向子類物件。
list有序(存和取的順序一致),有索引可以儲存重複
ArrayList-字首告訴底層是陣列,LinkedList-字首告訴底層是連結串列實現的,Vector-字首底層也是陣列實現的,但是不遵循list命名。Vector出現比ArrayList要早,在JDK1.0版本的時候出現的,ArrayList則在1.2版本的時候出現的。
@SupperWarning(“rawtypes”,"unchecked")//保持型別,不檢查,但沒有加泛型,有一定的安全隱患
Collection a=new ArrayList();//父類引用指向子類物件
boolean b= a.add("abc");
boolean c=a.add(true);//自動裝箱new boolean(true);
boolean d=a.add(100);
boolean e=a.add(new Client(“李四”,23));//將Client類的封裝;
boolean f=a.add("abc")//能放進來重複的元素;
System.out.println(c);//==System.out.println(c.toString);實質上重寫了,要往上父類、爺爺類查詢。
return true;
return true;
return true;
return true;
return true;
[abc,true,100,Client[name=李四,age=23],abc]
如果是List集合一直返回true,因為可以儲存重複元素。如果是Set集合當儲存重複元素時候,就會返回false。
set無序(存和取的順序不一致),無索引不可以儲存重複,Set集合由Set介面和Set介面的實現類組成。Set介面繼承了Collection介面,因此包含Collection介面的所有方法。Set介面中的方法和Collection介面一致。
HashSet-底層雜湊演算法 TreeSet-底層二叉樹演算法
Set介面的常見實現類:
HashSet:內部資料結構是雜湊表,是不同步的。
HashSet如何保證該集合中元素的唯一性:
是通過物件的hashCode和equals方法啊來完成物件的唯一性的。如果物件的hashCode值不同,那麼不用判斷equals方法,就直接儲存到雜湊表中。如果物件的hashCode值相同,那麼要再次判斷物件的equals方法是否為true。如果為true,視為相同元素,不存。如果為false。那麼視為不同元素,就進行儲存。
如果元素儲存到HashSet集合中,必須覆蓋hashCode方法和equals方法。一般情況下,如果定義的類會產生很多物件,比如人,學生,書,通常都需要覆蓋equals方法和hashCode方法,建立物件判斷是否相同的依據。
HashSet是無序的,但是下面的子介面LinkedHashSet是具有可預知迭代順序的set介面的雜湊表和連結串列實現的,有序。
TreeSet:可以對Set集合中的元素進行指定順序的排序。是不同步的。
TreeSet如何保證該集合中元素的唯一性:
就是根據比較方法compareTo的返回結果是否是0,是0,就判定為相同元素,不存。
TreeSet對元素進行排序的方式一:
讓元素自身具備比較功能,就需要實現Comparable介面。覆蓋CompareTo方法。
如果不要按照物件中具備的自然順序進行排序。如果物件中不具備自然順序。這個時候可以使用TreeSet集合的第二種排序方式。
TreeSet集合的第二種排序方式二:
讓集合自身具備比較功能,定義一個類實現Comparator介面。覆蓋compare方法。將該類物件作為引數傳遞給TreeSet集合的建構函式。相對來說,這個方法比較常見。
HashSet例一:往hashSet集合中儲存Person物件,如果姓名和年齡相同,視為同一個人(相同元素)。
先新建一類Person:
public class Person {
private String name;
private int age;
public Person() {
super();
}
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
/**
* 覆蓋Object類中的hashCode方法。建立Person物件自己特點的雜湊值演算法。
*/
public int hashCode(){
//System.out.println(this+"...hascode...");
return name.hashCode() + age*27;//乘以27是為了儘量保證雜湊值唯一。
}
/**
* 覆蓋Object類中的equals方法,建立Person物件判斷是否相同的依據。 根據Person自身的特點來判斷。
*/
public boolean equals(Object obj){
//System.out.println(this+"...equals..."+obj);
if(!(obj instanceof Person))
return false;
Person p = (Person)obj;
return this.name.equals(p.name) && this.age == p.age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return name+":"+age;
}
再新建HashSetTest類,進行儲存與取出Person物件的操作:
/*
往hashSet集合中儲存Person物件,如果姓名和年齡相同,視為同一個人(相同元素)。
* */
public class HashSetTest {
public static void main(String[] args) {
HashSet hs=new HashSet();
/*HashSet集合資料結構是雜湊表,所以儲存元素的時候,使用的元素的hashCode方法來確定位置,如果位置相同,再通過元素的equals來確定是否相同。*/
hs.add(new Person("abc1",21));
hs.add(new Person("abc2",22));
hs.add(new Person("abc3",23));
hs.add(new Person("abc4",24));
hs.add(new Person("abc2",22));
Iterator it=hs.iterator();
while(it.hasNext()){
Person p=(Person)it.next();//因為存入集合容器中的元素都會向上轉型為Object類,會丟失掉Person類的特有屬性,所以必須強制向下轉型為Person類,才可以拿到它的name和age屬性;另外,由於同時要拿兩個屬性,所以等於說it.next()取到的物件不止使用一次,必須用一個變數來接收。
System.out.println(p.getName()+":"+p.getAge());
}
}
}
結果輸出為:
abc3:23
abc2:22
abc4:24
abc1:21
Java集合關係圖: