前言
本周是學(xué)習(xí)java的第六周序厉,把容器大部分內(nèi)容學(xué)完了淮逻。
參考教程:
本周學(xué)習(xí)要點(diǎn):
1.Map中的HashMap
和TreeMap
區(qū)別不大者娱,效率上使用HashMap
肃晚,需要用到排序時(shí)使用TreeMap
。
2.TreeMap
是典型的紅黑二叉樹(shù)的實(shí)現(xiàn)欢策。
3.TreeMap
會(huì)按照key遞增的方式排序吆寨,在使用自己定義的類時(shí)需要實(shí)現(xiàn)comparable接口并重寫CompareTo方法。
4.HashMap
和HashTable
:前者線程不安全踩寇,效率高啄清,允許key或value為null;后者線程安全效率低俺孙,不運(yùn)行key或value為null辣卒。
5.HashSet
是set的實(shí)現(xiàn)類,set內(nèi)的元素沒(méi)有順序且不可重復(fù)睛榄,使用add方法加入重復(fù)的元素則會(huì)加入失敗荣茫,其底層由HashMap
實(shí)現(xiàn)。
6.TreeSet
底層用TreeMap
實(shí)現(xiàn)场靴,同樣的需要實(shí)現(xiàn)compareable接口
7.collection是一個(gè)接口啡莉,collections是一個(gè)包裝類。
實(shí)現(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;
}
}
}
}
對(duì)于這個(gè)重寫的方法旨剥,規(guī)定了自定義的比較后的返回值咧欣。大于時(shí)返回1,小于時(shí)返回-1泞边,等于時(shí)返回0该押。在這里我比較了salary疗杉,當(dāng)salary出現(xiàn)相等的情況時(shí)則比較id阵谚,若id出現(xiàn)相等的情況時(shí)則返回0蚕礼,即表示相等,當(dāng)然了梢什,還可以繼續(xù)延展下去奠蹬,如id相等時(shí)在嵌套if,elseif語(yǔ)句來(lái)比較name是否相等嗡午。
遍歷容器的方式
一般的有四種:
1.for循環(huán)
2.增強(qiáng)for循環(huán)(foreach)
3.for循環(huán)+迭代器
4.while循環(huán)+迭代器
迭代器遍歷容器元素
迭代器是一種設(shè)計(jì)模式囤躁,它是一個(gè)對(duì)象,它可以遍歷并選擇序列中的對(duì)象荔睹,而開(kāi)發(fā)人員不需要了解該序列的底層結(jié)構(gòu)狸演。迭代器通常被稱為“輕量級(jí)”對(duì)象,因?yàn)閯?chuàng)建它的代價(jià)小僻他。
Java中的Iterator功能比較簡(jiǎn)單宵距,并且只能單向移動(dòng):
(1) 使用方法iterator()要求容器返回一個(gè)Iterator。第一次調(diào)用Iterator的next()方法時(shí)吨拗,它返回序列的第一個(gè)元素满哪。注意:iterator()方法是java.lang.Iterable接口,被Collection繼承。
(2) 使用next()獲得序列中的下一個(gè)元素劝篷。
(3) 使用hasNext()檢查序列中是否還有元素哨鸭。
(4) 使用remove()將迭代器新返回的元素刪除。
Iterator是Java迭代器最簡(jiǎn)單的實(shí)現(xiàn)娇妓,為L(zhǎng)ist設(shè)計(jì)的ListIterator具有更多的功能像鸡,它可以從兩個(gè)方向遍歷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));
}
}