---------------------- android培訓、java培訓、期待與您交流! ----------------------
所謂的集合就是指 一個長度可以變化的類似於(或等於)數組的東西。
Collection<T>接口有兩個子接口:List<T>和Set<T>
1.List
List接口及其子類最大的特點就是允許元素重複。
· List接口中最常見的三個子類:
ArrayList<E> 此類最最常用。
Vector<E>
LinkedList<E>
ArrayList<E>
常用方法舉例:
1.add()增加元素
import java.util.*;
public class ArrayListDemo {
public static void main(String[] args){
List<String> array = new ArrayList<String>();
array.add("Hello World"); // 在最後增加元素
array.add("世界,你好!");
array.add("Hello World");
array.add(0,"cxy"); //在指定位置增加元素 下標從0開始
System.out.println(array); // ArrayList類已經重寫了toString方法
}
}
2.remove()刪除元素
import java.util.*;
public class ArrayListDemo {
public static void main(String[] args){
List<String> array = new ArrayList<String>();
array.add("Hello World");
array.add("世界,你好!");
array.add("Hello World");
array.remove(2); // 指定位置刪除 下標從0開始
array.remove("世界,你好!"); //指定元素刪除
array.clear(); //刪除所有元素
System.out.println(array);
}
}
· 使用remove()方法刪除元素時 會拿指定的元素依次從集合第一個元素開始比較 如果比較的結果相同 可就刪除該元素。 比較的時候會調用equals()方法 · 因爲在String類中重寫了此方法 所以可以找到併成功刪除。 · 但是如果是用戶自定義類的匿名對象在沒有重寫equals()方法的前提下 就無法刪除這個匿名對象了。 |
equals()方法的重寫:
public class Person {
private String name;
private int age;
public Person(String name, int age){
this.name = name;
this.age =age;
}
public boolean equals(Object obj){
if(this == obj)
return true;
if(!(obj instanceof Person))
return false;
Person temp = (Person) obj;
if(this.name.equals(temp.name) && this.age == temp.age)
return true;
return false;
}
這樣就可以把person的對象刪除了。
3.get()得到指定下標的元素:
import java.util.*;
public class ArrayListDemo {
public static void main(String[] args){
List<String> array = new ArrayList<String>();
array.add("Hello World");
array.add("世界,你好!");
array.add("Hello World");
for(int i=0; i<array.size(); i++) // size()得到當前集合中元素個數
System.out.print(array.get(i)+"、"); //獲得指定位置上的元素
}
}
4.toArray()轉成數組:
import java.util.*;
public class ArrayListDemo {
public static void main(String[] args){
List<String> array = new ArrayList<String>();
array.add("Hello World");
array.add("世界,你好!");
array.add("Hello World");
//轉換成指定數據類型的數組
String[] str = array.toArray(new String[]{});
for(String s : str)
System.out.print(s+" <--> ");
}
}
Vector<E>
Vector<E>的用法和ArrayList<E>用法一樣,他們的區別在於Vector<E>是線程安全的。
所謂的線程安全就是指所有的方法都是用synchronized修飾。
使用此關鍵字修飾的方法同一時間只能被一個線程訪問 其他線程必須等待 因此就造成程序執行時間較長的缺點。 正因爲此 才說Vector類效率低 且是同步操作。 只有在一些對安全性要求高的場合下才考慮使用Vector類。
LinkedList<E>
LinkedList<E> 類表示一個鏈表類。 它實現了Queue< E >接口。
用法舉例:
import java.util.LinkedList;
public class LinkedListDemo {
public static void main(String[] args){
LinkedList<String> line = new LinkedList<String>();
line.add("No.1"); //在表尾增加元素
line.add(0,"No.2"); //在指定位置增加元素
line.push("No.5"); //在表頭增加元素
line.addFirst("No.3"); //在表頭增加元素
line.addLast("No.4"); //在表尾增加元素
System.out.println(line);
System.out.println("只查看錶頭:"+line.getFirst());
System.out.println("查看並刪除表頭:"+line.pop());
System.out.println("只查看錶頭:"+line.peek());
System.out.println("只查看錶尾:"+line.getLast());
System.out.println("查看並刪除表尾:"
+line.remove(line.size()-1));
String[] array = line.toArray(new String[]{});
for(String str : array)
System.out.print(str+" ");
}
}
ArrayList其實代表一個數組 數據存儲在一片連續的空間。 數據量小時使用此類。
LinkedList是代表鏈表 數據分散存儲在內存中的各個角落。 數據量稍大時使用此類。 Set<E>接口
· set接口及其子類最大的特點就是不允許元素重複。
· set接口中最常見的兩個子類:
1. HashSet< E > :無序排列 但是可以高速存取。
2. TreeSet< E > : 自動排序。
HashSet<E>
如果想完整的使用HashSet<E>類 那麼最少要重寫equals()和hashCode()方法。
重寫hashCode() 用於獲得元素的存儲位置。
重寫equals() 用於在兩個元素的位置相同的時候 比較兩個元素是否相等。
範例:重寫hashCode().
public int hashCode(){ return this.name.hashCode()*age-age/100; } |
內容胡亂寫就可以,前提是兩個不同對象的hashCode返回值不同就可以。
HashSet的一個特性:元素存儲位置是由元素的hash碼來確定的。它是無序存放的。
TreeSet< E >
和HashSet相比,此類多了一個自動排序的功能。
但是 TreeSet的自動排序功能是有條件的:
TreeSet<T> 中的 T 必須是實現了Comparable<T> 接口。
否則 程序運行時拋異常。
範例:在Person類中實現Comparable<T>接口並重寫方法。
public int compareTo(Person arg0) {
if(this.age>arg0.age)
return 1;
else if(this.age<arg0.age)
return -1;
else{
return this.name.compareTo(arg0.name);
}
}
如果compareTo()方法返回0 則意味着正在比較的2個對象相等。
而兩個對象相等在Set中是不允許出現的。
因此 重寫compareTo()方法時 要將對象的所有字段都進行比較。
要保證只有在兩個對象的各個屬性的值都相同的情況下才返回0。否則就返回1或-1。
集合的輸出
範例1:Iterator遍歷集合
import java.util.*;
public class Demo{
public static void main(String[] args){
Collection<String> array = new ArrayList<String>();
array.add("No.45");
array.add("No.15");
array.add("No.23");
array.add("No.14");
array.add("No.65");
array.add("No.12");
Iterator<String> iter = array.iterator();
while(iter.hasNext()){
System.out.println(iter.next());
}
}
}
範例2:使用foreach遍歷集合
import java.util.*;
public class Demo{
public static void main(String[] args){
List<String> array = new ArrayList<String>();
array.add("No.45");
array.add("No.15");
array.add("No.65");
for(String str : array)
System.out.println("☆"+str+"☆");
}
}
---------------------- android培訓、java培訓、期待與您交流! ----------------------