JAVA類集(1)簡單操作
本博文將簡單簡單講解JAVA類集的使用.
在整個JAVA類集中,最常用的類集介面是:
Collection,List,Set,Map,Iterator,ListIterator,Enmueration,SortedSet,SortedMap,Queue,Map.Entry
這些介面的繼承關係如下:
提示:SortedXX介面都是可排序的介面.
一. Collection介面
collection是單值儲存的最大父介面
在開發中,往往很少直接使用Collection介面,而是使用其子介面,其子介面有:List,Set,Queue,SortedSet
List:可以存放重複內容
Set:不能存放重複內容,重複物件需使用hashCode()和equals()方法
Queue:佇列介面
SortedSet:可以對集合中的資料進行排序
二. List介面
List是Collection的子介面,儲存了許多重複的內容,但List也擴充套件了Collection介面,定義了更多的方法.
List也是一個介面,要想使用List,必須使用其子類進行例項化.
2.1 子介面—ArrayList
ArrayList是List的介面,可以直接使用ArrayList為List介面例項化.
向集合中增加元素:
//Collection的方法
public boolean add(E o);
public boolean addAll(Collection<? Extends E> c);
//也可以直接使用List特有的方法
public void add(int index,E element);
刪除元素:
//Collection的方法
public boolean remove(Object o);
public boolean removeAll(Collection<?> c);
//也可以直接使用List特有的方法
public E add(int index);
注意:
如果自定義的類使用上述方法進行刪除元素,則必須覆寫Object類的equals()和hashCode()方法.
輸出List中的內容:
//使用兩個方法在配合for迴圈可以遍歷List的輸出
//collection中的size()
//List中的get(int index)
將集合變為物件陣列
//Collection的toArray()方法
2.2 Vector
從JAVA的整個發展歷程來看,Vector是一個元老級的類,在JDK1.0就 已經存在.到了JAVA2之後,重點強調了集合框架的概念,所以定義了很多新的介面,但是考慮到一部分人已經習慣了使用vector,所以就讓其實現了List介面,將其保留了下來.
如果直接使用Vector例項化List,那麼其使用與ArrayList沒沒有太大差別,但是Vector由於出現比較早,其自身也有一些List沒有的方法.
ArrayList與Vector的區別:
2.3 LinkedList介面與Queue介面
LinkedList表示連結串列類,Queue表示的是佇列操作,採用先進先出(FIFO)的方式操作.
定義如下:
可以看出,不但實現了List介面,還實現了Queue介面
LinkedList除了具有上述佇列的方法之外,還具有以下連結串列的操作方法:
三. Set介面
Set也是Collection的子介面,但是Set並未對Collection進行擴充套件,只是比Collection介面的要求更加嚴格了,不能增加重複元素.
此外,Set不能像List那樣進行雙向輸出,因為此介面沒有像List介面的get(int index)方法.
3.1 HashSet
HashSet特點:元素不重複,雜湊儲存沒有順序,集合的輸出順序並不是集合的儲存順序
3.2 TreeSet
TreeSet特點:元素不重複,有序儲存,向集合中插入時無序,但輸出時有序
3.3 關於TreeSet的排序說明
如果自定義的類要對TreeSet中的元素進行排序,因為TreeSet中的元素是有序排放的,所以對於一個物件必須指定其排序規則,且TreeSet每個物件所在的類都必須實現Comparable接口才能正常使用.
自定義Person1類:
class Person1 implements Comparable<Person1>{
private String name;
private int age;
public Person1(){}
public Person1(String name , int age){
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "姓名:" + this.name + " 年齡:" + this.age;
}
@Override
public int compareTo(Person1 p) {
if(this.age > p.age)
return 1;
else if(this.age < p.age)
return -1;
else
return this.name.compareTo(p.name);
}
}
package cn.mysql;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
import java.util.TreeSet;
public class CollectionDemo {
public static void main(String[] args) {
Set<Person1> tree = new TreeSet<Person1>();
tree.add(new Person2("張三",26));
tree.add(new Person2("李四",25));
tree.add(new Person2("王五",20));
tree.add(new Person2("馬六",26));
tree.add(new Person2("張三",26));
tree.add(new Person2("王五",27));
tree.add(new Person2("趙七",26));
System.out.println(tree);
}
}
以上程式碼可以去掉重複元素,但是靠Comparable實現的,如果換成hashSet則還會出現重複的內容,如果要想真正去掉重複元素,必須深入研究Object類.
要想去掉重複元素,必須首先進行物件是否重複的判斷,而要想進行這樣的判斷,就必須覆寫Object類的equals()方法,才能完成物件是否相等的判斷,而且只覆寫equals()是不夠的,還要覆寫hashCode()方法,以求出不會重複的雜湊碼值.
自定義Person2類:
class Person2{
private String name;
private int age;
public Person2(){}
public Person2(String name , int age){
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "姓名:" + this.name + " 年齡:" + this.age;
}
@Override
public boolean equals(Object p) {
if(this == p)
return true;
if(!(p instanceof Person2))
return false;
Person2 pp = (Person2)p;
if(this.name.equals(pp.name) && this.age == pp.age)
return true;
else
return false;
}
@Override
public int hashCode() {
return this.name.hashCode() * this.age;
}
}
package cn.mysql;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
import java.util.TreeSet;
public class CollectionDemo {
public static void main(String[] args) {
Set<Person2> tree = new HashSet<Person2>();
tree.add(new Person2("張三",26));
tree.add(new Person2("李四",25));
tree.add(new Person2("王五",20));
tree.add(new Person2("馬六",26));
tree.add(new Person2("張三",26));
tree.add(new Person2("王五",27));
tree.add(new Person2("趙七",26));
System.out.println(tree);
}
}
$$ : 一個完整的類,最好覆寫Object類的toString(),hashCode()和equals()方法