Java中Collection介面及其子介面List、Set
阿新 • • 發佈:2018-12-27
一、Collection集合介面
Collection是單個集合儲存的最大父介面。Collection介面的定義:
(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
(1)ArrayList由陣列實現;
(2)LinkedList由連結串列實現。
四、Set集合介面
1.Set介面與List介面最大的不同在於Set介面中的內容是不允許重複的。同時,Set介面中沒有get()方法。
2.TreeSet排序
利用TreeSet進行物件陣列的排序,物件所在的類要實現Comparable介面,並且覆寫compareTo()方法。如果使用Comparable介面進行大小關係匹配,所有屬性必須全部進行比較操作。
HashSet判斷重複元素的方式依靠的是Object類中的兩個方法:
(1)hash碼:public native int hashCode();
(2)物件比較:public boolean equals(Object obj);
在Java中進行物件比較的操作有兩步:第一步要通過一個物件的唯一編碼找到一個物件的資訊,第二步當編碼匹配之後再呼叫equals()方法進行內容的比較。
(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,表示當前物件小於比較物件;
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類
4.子類Vectorclass 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); } } }
如:使用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.使用HashSetHashSet判斷重複元素的方式依靠的是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,表示當前物件小於比較物件;