20169205 2016-2017-2 《移动平台应用开发实践》第4周学习总结
20169205 2016-2017-2 《移动平台应用开发实践》第4周学习总结
教材学习内容总结
这四章的内容主要是对枚举类型、时间和日期、集合等相关类的具体介绍。
其中以集合这一部分最为重点,有下面几个注意的地方:
1、List
- 所有的List中只能容纳单个不同类型的对象组成的表,而不是Key-Value键值对。例如:[ tom,1,c ];
- 所有的List中可以有相同的元素,例如Vector中可以有 [ tom,koo,too,koo ];
- 所有的List中可以有null元素,例如[ tom,null,1 ];
- 基于Array的List(Vector,ArrayList)适合查询,而LinkedList(链表)适合添加,删除操作。
2、Set
- Set实现的基础是Map(HashMap);
- Set中的元素是不能重复的,如果使用add(Object obj)方法添加已经存在的对象,则会覆盖前面的对象
3、Map
- Map与集或列表有明显区别,Map中每个项都是成对的。Map中存储的每个对象都有一个相关的关键字(Key)对象,关键字决定了对象在映射中的存储位置,检索对象时必须提供相应的关键字,就像在字典中查单词一样。关键字应该是唯一的。
教材学习中的问题和解决过程
1、Map在并行处理中出现ConcurrentModificationException
在遍历时候通常 现获得其键值的集合Set,然后用迭代器Iterator来对Map进行遍历。
错误代码如下:
for(Person person : pList){
if(person.getGender()==Gender.MALE){
pList.remove(person);
}
}
异常提示为 java.util.ConcurrentModificationException 异常 public class ConcurrentModificationExceptionextends RuntimeException
解决
错误的原因是Iterator是工作在一个独立的线程中,并且拥有一个mutex锁。Iterator被创建之后会建立一个指向原来对象的单链索引表,当原来的对象数量发生变化时,这个索引表的内容不会同步改变,所以当索引指针往后移动的时候就找不到要迭代的对象,所以按照fail-fast原则Iterator会马上抛出java.util.ConcurrentModificationException异常。
所以 Iterator 在工作的时候是不允许被迭代的对象被改变的。但可以使用Iterator本身的方法remove()来删除对象,Iterator.remove()方法会在删除当前迭代对象的同时维护索引的一致性。
如下面所示:
Iterator iterator = pList.iterator;
for(Person person : pList){
if(person.getGender()==Gender.MALE){
iterator.remove(person);
}
}
2、字符串数组报错
错误代码:
String[] strs = new String[]{"a","b"};
List<String> strList = Arrays.asList(strs);
strList.add("c");
第三行程序抛出异常
原因是因为java源代码Arrys.asList();方法返回的不是平常熟悉的java.util.ArrayList类的对象。而是Arrays类的内部类的对象,而Arrays类里的内部类ArrayList没有实现AbstractList类的add方法,导致抛此异常! strList.add("c");下面看一下add方法实际上的定义:
public boolean add(E e) {
add(size(), e);
return true;
}
public void add(int index, E element) {
throw new UnsupportedOperationException();
}
解决方法:
String[] strs = new String[]{"a","b"};
List<String> strList = new ArrayList<String>(Arrays.asList(strs));
strList.add("c");
上周错题总结
- String[] sa=new String[4];答案应该是创建的对象数目为0.此处的变量sa存在栈中并指向堆的对象,所以这里只是生成了4个字符串对象的引用,并没有创建字符串对象。
学习进度条
码云项目地址
学习目标
时间 | 学习时间目标 | 实际进行时间 |
---|---|---|
第一周 | 8 | 8 |
第二周 | 10 | 8.5 |
第三周 | 12 | 10.5 |
第三周 | 12 | 12 |
希望能够通过系统地学习,探索一些开源项目并改进功能,养成良好的开发习惯,形成一套完整的android生态知识体系,并能完全自主开发一款具有一定实用价值的app。