Java集合
- Collection接口
- Map接口:具有映射關系的“key-Value對”,類似于函數,一個key對象一個Value
Java的Collection接口
Collection接口關系圖:
- Set接口:元素沒有順序,不可以重複的結合類似高中的集合
- List接口:元素有順序,但是可以重複動态數組
結合元素的周遊
使用Itertor接口
适用于所有的Collection對象,包括其子接口實作類的對象
Iterator it = coll.iterator();
while(it.hasNext()) {
System.out.println(it.next());
}
使用增強for循環
for(Person p : persons) {//persons為集合
System.out.println(p.getName());
}
List接口
特點:元素有順序,可以重複
ArrayList
ArrayList類是List的一個實作類,線程不安全的,底層是使用的變長數組
LinkedList
LinkedList是List的一個實作類,對于頻繁的插入删除操作,建議使用LinkedLIst,底層使用的連結清單
Vector
線程安全的,太老了,不建議使用
Set接口
特點:元素沒順序,不可以重複
HashSet
HashSet是Set接口的一個典型實作,大多數使用Set的時候都是使用這個類的
特點:
- 不能保證元素的排列順序,周遊是列印出來的不一定是插入的順序
- HashSet不是線程安全的
- 集合元素可以是null
關于存儲順序
當想HashSet集合中存放一個元素的時候,HashSet會調用該對象的HashCode()方法來得到該對象那個的hashcode值決定這個對象存儲的位置。
判斷兩個元素相等:
兩個對象通過HashCode()方法比較相等,并且兩個對象的equals()方法傳回也要相等
是以Set集合要求重寫對象的equals()方法和HashCode()方法。
LinkedHashSet
- LinkedHashSet是HashSet的子類
- LinkedHashSet根據元素的HashCode值來決定元素的存放位置,但是他使用的是連結清單,是以周遊的時候,看起來元素還是按照原來插入順序儲存的
- 插入性能低,通路性能高
TreeSet
TreeSet是SortedSet接口的實作類,插入的元素會按照一定的規則排列順序
- 往裡添加的元素必須是同一個類型的,要麼全是integer類型要麼我全是String類型的。
- 可以按照指定的順序周遊,像String是按照從小到大的順序周遊的
- 對于自定義的類周遊,必須實作排序方式,不然TreeSet不知道按照什麼方法周遊元素,是以插不進去,
- 自定義類有兩種方法,1,自然排序 2,定制排序 (定制排序)關于這兩個排序參考筆記(TreeSet中的自然排序和定制排序)
- 往TreeSet中添加元素的時候會首先比較compareTo()方法,一旦傳回0,雖然兩個對象僅僅此屬性相同,但是程式還是會認為這兩個元素是相同的,是以後面那個元素無法插入集合中!
- 添加到treeSet中的元素類必須保證compareTo()方法,HashCode()方法還有equals()方法一緻
TreeSet有兩種排序方式
要想插入TreeSet中,對象必須至少實作了下面兩種排的中一種,這樣集合才知道怎麼排列這些元素,并且插入的這個元素必須是同一種類型
1. 自然排序(預設情況)
2. 定制排序
自然排序
- 實作Comparable接口
- 重寫compareTo()方法
- 重寫hashCode(),equals()方法
- 保證compareTo(),hashCode(),equals()方法一緻
public class Employee implements Comparable{
private String name;
private int age;
private MyDate birthday;
//重寫compareTo方法
@Override
public int compareTo(Object o) {
if(o instanceof Employee) {
Employee e = (Employee)o;
return this.getName().compareTo(e.getName());
}
return ;
}
//重寫hashCode()方法
@Override
public int hashCode() {
final int prime = ;
int result = ;
result = prime * result + age;
result = prime * result
+ ((birthday == null) ? : birthday.hashCode());
result = prime * result + ((name == null) ? : name.hashCode());
return result;
}
//重寫equals()方法
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Employee other = (Employee) obj;
if (age != other.age)
return false;
if (birthday == null) {
if (other.birthday != null)
return false;
} else if (!birthday.equals(other.birthday))
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
}
定制排序
TreeSet的自然排序是根據元素大小進行升序排列的,如果想要按照降序排列的話就需要定制排序
- 構造TreeSet對象的時候,将COmparator接口的執行個體作為形參,傳遞給TreeSet的構造器
- 重寫compare方法
- compare(T t1, T t2);傳回0則t1 = t2; 傳回1 則t1 > t2
TreeSet set = new TreeSet(new Comparator() {
//重寫compare方法
@Override
public int compare(Object o1, Object o2) {
if(o1 instanceof Employee && o2 instanceof Employee) {
Employee e1 = (Employee)o1;
Employee e2 = (Employee)o2;
return e1.getName().compareTo(e2.getName());
}
return ;
}
});