前言
本周是學習java的第六周,把容器大部分內(nèi)容學完了。
參考教程:
本周學習要點:
1.Map中的HashMap和TreeMap區(qū)別不大,效率上使用HashMap,需要用到排序時使用TreeMap。
2.TreeMap是典型的紅黑二叉樹的實現(xiàn)。
3.TreeMap會按照key遞增的方式排序,在使用自己定義的類時需要實現(xiàn)comparable接口并重寫CompareTo方法。
4.HashMap和HashTable:前者線程不安全,效率高,允許key或value為null;后者線程安全效率低,不運行key或value為null。
5.HashSet是set的實現(xiàn)類,set內(nèi)的元素沒有順序且不可重復,使用add方法加入重復的元素則會加入失敗,其底層由HashMap實現(xiàn)。
6.TreeSet底層用TreeMap實現(xiàn),同樣的需要實現(xiàn)compareable接口
7.collection是一個接口,collections是一個包裝類。
實現(xiàn)comparable接口并重寫CompareTo方法
class Emp implements Comparable<Emp>{
int id;
String name;
double salary;
public Emp(int id, String name, double salary) {
super();
this.id = id;
this.name = name;
this.salary = salary;
}
@Override
public int compareTo(Emp o) {
if(this.salary>o.salary){
return 1;
}else if (this.salary<o.salary) {
return -1;
}else {
if(this.id>o.id){
return 1;
}
else if (this.id<o.id) {
return -1;
}else {
return 0;
}
}
}
}
對于這個重寫的方法,規(guī)定了自定義的比較后的返回值。大于時返回1,小于時返回-1,等于時返回0。在這里我比較了salary,當salary出現(xiàn)相等的情況時則比較id,若id出現(xiàn)相等的情況時則返回0,即表示相等,當然了,還可以繼續(xù)延展下去,如id相等時在嵌套if,elseif語句來比較name是否相等。
遍歷容器的方式
一般的有四種:
1.for循環(huán)
2.增強for循環(huán)(foreach)
3.for循環(huán)+迭代器
4.while循環(huán)+迭代器
迭代器遍歷容器元素
迭代器是一種設計模式,它是一個對象,它可以遍歷并選擇序列中的對象,而開發(fā)人員不需要了解該序列的底層結構。迭代器通常被稱為“輕量級”對象,因為創(chuàng)建它的代價小。
Java中的Iterator功能比較簡單,并且只能單向移動:
(1) 使用方法iterator()要求容器返回一個Iterator。第一次調(diào)用Iterator的next()方法時,它返回序列的第一個元素。注意:iterator()方法是java.lang.Iterable接口,被Collection繼承。
(2) 使用next()獲得序列中的下一個元素。
(3) 使用hasNext()檢查序列中是否還有元素。
(4) 使用remove()將迭代器新返回的元素刪除。
Iterator是Java迭代器最簡單的實現(xiàn),為List設計的ListIterator具有更多的功能,它可以從兩個方向遍歷List,也可以從List中插入和刪除元素。
遍歷list:
public static void testIteratorList() {
List<String> list = new ArrayList<>();
list.add("a");
list.add("b");
for(Iterator<String> iter=list.iterator();iter.hasNext();){
String temp = iter.next();
System.out.println(temp);
}
}
遍歷set:
public static void testIteratorSet() {
Set<String> set = new HashSet<>();
set.add("aa");
set.add("bb");
for(Iterator<String> iter=set.iterator();iter.hasNext();){
String temp = iter.next();
System.out.println(temp);
}
}
遍歷map:
public static void testIteratorMap() {
Map<Integer, String> map = new HashMap<>();
map.put(1, "aa");
map.put(2, "ss");
//第一種方式
Set<Entry<Integer, String>> ss = map.entrySet();
for(Iterator<Entry<Integer,String>> iter=ss.iterator();iter.hasNext();){
Entry<Integer,String> temp=iter.next();
System.out.println(temp.getKey()+"--"+temp.getValue());
}
//第二種方式
Set<Integer> keySet = map.keySet();
for(Iterator<Integer> iter=keySet.iterator();iter.hasNext();){
Integer key = iter.next();
System.out.println(key+"--"+map.get(key));
}
}