一点小心得(2017.7.7)
- 裴新老师讲课好快啊!内容密度好高啊!消化好困难啊!
- 我发现以讲求质量,不骗自己为标准,完全不可能做到339的量,慢慢来吧,先调整为333,之后每3天加1课。
- 我发现:面对一个不知道怎么下手的题目,最好的办法就是最朴素的办法,以终为始,不断拆分,最近这七个周期,就训练这个简单的思维模型了。
第119集:自定义实现迭代器、深入迭代器、迭代器原理、面向对象实现
迭代器为什么是内部类?
答:节约内存,提高效率。如下例所示,若不使用内部类,每一次迭代都需要重新创建一个容器对象,而使用内部类则不一样,可以只是重新调用迭代器的方法新建一个内部类对象,大大节约了内存。
例1:不用内部类的情形
package test119;
import java.util.Iterator;
public class MyArrayList2 {
private String[] elem = {"a","b","c"};
private int cursor = -1;
private int size = elem.length;
public boolean hasNext(){
return cursor!=size-1;
}
public String next(){
cursor++;
return elem[cursor];
}
public void remove(){
//这里写实现
}
public static void main(String[] args){
//遍历第一遍 创建一个容器对象
MyArrayList2 list = new MyArrayList2();
while(list.hasNext()){
String str = list.next();
System.out.println(str);
}
//遍历第二遍 再创建一个容器对象
MyArrayList2 list2 = new MyArrayList2();
while(list2.hasNext()){
String str = list2.next();
System.out.println(str);
}
}
}
例2:用了内部类的情形
package test119;
import java.util.Iterator;
public class MyArrayList2 {
private String[] elem = {"a","b","c"};
private class M implements Iterator<String>{
private int cursor = -1;
private int size = elem.length;
public boolean hasNext(){
return cursor!=size-1;
}
public String next(){
cursor++;
return elem[cursor];
}
public void remove(){
//这里写实现
}
}
public Iterator<String> iterator(){
return new M();
}
public static void main(String[] args){
//遍历第一遍 创建一个迭代器
MyArrayList2 list = new MyArrayList2();
Iterator<String> itr = list.iterator();
while(itr.hasNext()){
String str = itr.next();
System.out.println(str);
}
//遍历第二遍 再创建一个迭代器,
Iterator<String> itr2 = list.iterator();
while(itr2.hasNext()){
String str = itr2.next();
System.out.println(str);
}
}
}
例3:进一步改良:改写为匿名内部类
package test119;
import java.util.Iterator;
public class MyArrayList3 {
private String[] elem = {"a","b","c"};
public Iterator<String> iterator(){
return new Iterator<String>(){ //因为上例M只使用了一次,所以这里直接使用匿名内部类了
private int cursor = -1;
private int size = elem.length;
public boolean hasNext(){
return cursor!=size-1;
}
public String next(){
cursor++;
return elem[cursor];
}
public void remove(){
//这里写实现
}
};
}
public static void main(String[] args){
MyArrayList3 list = new MyArrayList3();
Iterator<String> itr = list.iterator();
while(itr.hasNext()){
String str = itr.next();
System.out.println(str);
}
}
}
例4:进一步改良:使用增强for循环
- 使用增强for循环必须实现java.lang.Iterable<T>接口,重写iterator方法。
- 注意区分Iterable<T>接口和Iterator<T>接口
- Iterable<T>接口里面的重要方法:Iterator<T> iterator();
- Iterator<E>接口里面的重要方法:
- boolean hasNext();
- E next();
- default void remove();
package test119;
import java.util.Iterator;
public class MyArrayList4 implements Iterable<String>{
private String[] elem = {"a","b","c"};
public Iterator<String> iterator(){
return new Iterator<String>(){ //因为上例M只使用了一次,所以这里直接使用匿名内部类了
private int cursor = -1;
private int size = elem.length;
public boolean hasNext(){
return cursor!=size-1;
}
public String next(){
cursor++;
return elem[cursor];
}
public void remove(){
//这里写实现
}
};
}
public static void main(String[] args){
MyArrayList4 list = new MyArrayList4();
Iterator<String> itr = list.iterator();
for(String temp:list){
System.out.println(temp);
}
}
}
第120集:HashMap、经典存储分拣思路
package test120;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
/**
* @author wangtao
* 往Map里面存数据的两种分拣思路
*/
public class Test {
public static void main(String[] args){
String test = "this is a cat and this is a dog";
String[] arr = test.split(" ");
Map<String,Letter> letters = new HashMap<String,Letter>();
//思路一:先为每一个key创建容器,再装数据
// for(String temp:arr){
// if(!letters.containsKey(temp)){
// letters.put(temp, new Letter());
// }
// Letter col = letters.get(temp);
// col.setCount(col.getCount()+1);
// }
//思路二:遇见一个key,进行一次检查(有无容器),若有,直接装数据;若无,创建一个容器再装数据。
// for(String temp:arr){
// if(!letters.containsKey(temp)){
// Letter col = new Letter();
// col.setCount(1);
// letters.put(temp,col);
// } else {
// Letter col = letters.get(temp);
// col.setCount(col.getCount()+1);
// }
// }
//思路二的另一种写法
Letter col = null;
for(String temp:arr){
if(null==(col = letters.get(temp))){
col = new Letter();
col.setCount(1);
letters.put(temp, col);
}else{
col.setCount(col.getCount()+1);
}
}
//遍历已经存了数据的Map
Set<String> a = new HashSet<String>();
a = letters.keySet();
for(Iterator<String> itr = a.iterator();itr.hasNext();){
String key = (String)itr.next();
System.out.println("单词:"+key+" 次数:"+letters.get(key).getCount());
}
}
}