zoukankan      html  css  js  c++  java
  • 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。

  • 相关阅读:
    ByteBuffer的slice()方法
    Kafka多个消费者的小例子
    设计模式之迭代器模式
    设计模式之责任链模式
    @ComponentScan的scopeResolver属性详解
    ES中的文档更新
    ElasticSearch学习:安装
    强、软、弱、虚四大引用示例
    20个有用的小片段
    spring mvc 执行流程
  • 原文地址:https://www.cnblogs.com/wule/p/6604036.html
Copyright © 2011-2022 走看看