1. 程式人生 > >Java中Collection介面及其子介面List、Set

Java中Collection介面及其子介面List、Set

一、Collection集合介面
Collection是單個集合儲存的最大父介面。Collection介面的定義:
public interface Collection<E> extends Iterable<E>

此介面的常用方法如下:


Collection介面定義:


二、List介面

1.List介面中兩個重要的擴充方法:


2.List介面下有三個常用子類:ArrayList、Vector、LinkedList


3.ArrayList子類
ArrayList是一個針對於List介面的陣列實現。List允許儲存重複資料。

如:List的基本操作

public class Test {
	public static void main(String[] args) {
		List<String> list = new ArrayList<>();
		System.out.println(list.size() + "," + list.isEmpty()); //檢視list的大小,list是否為空
		list.add("hello");
		list.add("hello");
		list.add("world");
		System.out.println(list.size() + "," + list.isEmpty());
		System.out.println(list);  //列印list
		System.out.println(list.remove("hello"));  //刪除hello
		System.out.println(list.contains("ABC"));  //檢視list是否包含ABC;若包含,返回true;否則,返回false
		System.out.println(list.contains("world"));  //檢視list是否包含world;若包含,返回true;否則,返回false
		System.out.println(list);  //列印list
		
		//利用get()結合索引取得資料
		for(int i = 0;i < list.size();i++) {
			System.out.println(list.get(i));
		}
		
	}
}

如:集合與簡單Java類

class Person{
	private String name;
	private int age;
	public Person(String name,int age) {
		this.name = name;
		this.age = age;
	}
	@Override
	public String toString() {
		return "Person [name=" + name + ", age=" + 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 boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Person other = (Person) obj;
		if (age != other.age)
			return false;
		if (name == null) {
			if (other.name != null)
				return false;
		} else if (!name.equals(other.name))
			return false;
		return true;
	}
}
public class Test{
	public static void main(String[] args) {
		List<Person> pList = new ArrayList<>();
		pList.add(new Person("小明", 10));
		pList.add(new Person("小李", 20));
		pList.add(new Person("小王", 30));
		
		//集合類中的contains()、remove()方法需要equals()支援
		System.out.println(pList.remove(new Person("小王", 30)));
		System.out.println(pList.contains(new Person("小吳", 10)));
		for (Person person : pList) {
			System.out.println(person);
		}
	}
}
4.子類Vector

如:使用Vector

public class Test{
	public static void main(String[] args) {
		List<String> list = new Vector<>();
		list.add("A");
		list.add("A");
		list.add("B");
		list.add("C");
		System.out.println(list);
		list.remove("C");
		System.out.println(list);
	}
}
注意:ArrayList與Vector的區別
(1)歷史時間:ArrayList是JDK1.2提供的,Vector是JDK1.0提供的。
(2)處理形式:ArrayList是非同步處理,效能更高;Vector是同步處理,效能較低。
(3)資料安全:ArrayList非執行緒安全,Vector執行緒安全。
(4)輸出形式:ArrayList支援Iterator、ListIterator、foreach;Vector支援Iterator、ListIterator、foreach、Enumeration。
5.子類LinkedList

如:使用LinkedList

public class Test{
	public static void main(String[] args) {
		List<String> list = new LinkedList<>();
		list.add("A");
		list.add("B");
		list.add("C");
		System.out.println(list);
		list.remove("A");
		System.out.println(list);
	}
}
注意:ArrayList與LinkedList的區別
(1)ArrayList由陣列實現;
(2)LinkedList由連結串列實現。
四、Set集合介面
1.Set介面與List介面最大的不同在於Set介面中的內容是不允許重複的。同時,Set介面中沒有get()方法。

在Set子介面中有兩個常用子類:HashSet(無序儲存)、TreeSet(有序儲存)。


如:HashSet使用

public class Test{
	public static void main(String[] args) {
		Set<String> set = new HashSet<>();
		set.add("A");
		set.add("A");
		set.add("B");
		set.add("C");
		System.out.println(set);  //輸出:[A, B, C]
	}
}

如:TreeSet使用

public class Test{
	public static void main(String[] args) {
		Set<String> set = new TreeSet<>();
		set.add("D");
		set.add("A");
		set.add("B");
		set.add("A");
		set.add("C");
		System.out.println(set);  //輸出:[A, B, C, D]
	}
}
TreeSet使用的是升序進行排列。
2.TreeSet排序
利用TreeSet進行物件陣列的排序,物件所在的類要實現Comparable介面,並且覆寫compareTo()方法。如果使用Comparable介面進行大小關係匹配,所有屬性必須全部進行比較操作。

如:使用TreeSet排序

class Person implements Comparable<Person>{
	private String name;
	private int age;
	@Override
	public String toString() {
		return "Person [name=" + name + ", age=" + age + "]";
	}
	public Person(String name,int age) {
		this.name = name;
		this.age = 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 int compareTo(Person o) {
		if(this.age > o.age) {
			return 1;
		}else if(this.age < o.age) {
			return -1;
		}else {
			return this.name.compareTo(o.name);
		}
	}
}
public class Test{
	public static void main(String[] args) {
		Set<Person> set = new TreeSet<>();
		set.add(new Person("李四", 10));
		set.add(new Person("張三", 10));
		set.add(new Person("張三", 10));
		set.add(new Person("王五", 5));
		System.out.println(set);  //輸出:[Person [name=王五, age=5], Person [name=張三, age=10], Person [name=李四, age=10]]
	}
}
3.使用HashSet
HashSet判斷重複元素的方式依靠的是Object類中的兩個方法:
(1)hash碼:public native int hashCode();
(2)物件比較:public boolean equals(Object obj);
在Java中進行物件比較的操作有兩步:第一步要通過一個物件的唯一編碼找到一個物件的資訊,第二步當編碼匹配之後再呼叫equals()方法進行內容的比較。

如:使用hashCode()與equals()消除重複

class Person{
	private String name;
	private int age;
	@Override
	public String toString() {
		return "Person [name=" + name + ", age=" + age + "]";
	}
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + age;
		result = prime * result + ((name == null) ? 0 : name.hashCode());
		return result;
	}
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Person other = (Person) obj;
		if (age != other.age)
			return false;
		if (name == null) {
			if (other.name != null)
				return false;
		} else if (!name.equals(other.name))
			return false;
		return true;
	}
	public Person(String name,int age) {
		this.name = name;
		this.age = 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;
	}
	
}
public class Test{
	public static void main(String[] args) {
		Set<Person> set = new HashSet<>();
		set.add(new Person("李四", 10));
		set.add(new Person("張三", 10));
		set.add(new Person("張三", 10));
		set.add(new Person("王五", 5));
		System.out.println(set);  //輸出:[Person [name=李四, age=10], Person [name=張三, age=10], Person [name=王五, age=5]]
	}
}
4.總結
(1)HashSet:無序儲存,允許null,有且只有一個null;判斷重複,需要覆寫Object中的hashCode()以及equals()方法;只有兩個物件的hashCode()以及equals()方法均返回true才認為兩者相等。
(2)TreeSet:有序儲存,不允許為null;如果要進行自定義類作為TreeSet儲存,該類必須覆寫Comparable介面
(3)Comparable:public int compareTo(Object o),類中所有屬性都要參與運算
當>0,表示當前物件大於比較物件;
當=0,表示當前物件等於比較物件;
當<0,表示當前物件小於比較物件;