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。

posted @ 2017-03-23 11:06  20169205-lewo  阅读(269)  评论(5编辑  收藏  举报