20162308 2016-2017-2 《程序设计与数据结构》第4周学习总结

20162308 2016-2017-2 《程序设计与数据结构》第4周学习总结

教材学习内容总结

  1. Java OOP编程
  2. 数组
  3. 条件和循环

教材学习中的问题和解决过程

  • 1 关于 迭代器(Iterator)
  • 阅读资料:
    Java Doc
    java集合遍历的几种方式总结及比较
    详解Java中Iterator迭代器的用法
    Java学习之Iterator(迭代器)的一般用法
    💪💪💪Java设计模式之迭代子模式
  • 1.1 迭代器和数组在for循环中有什么区别?
  • Ans:
    a. 数组可以通过 array.interator() 方法来转化为迭代器进行loop,也可以直接使用传统的基于计数器的for循环。
    b. 迭代器可以使用 for(Object obj : interator){loop} 语句来进行循环;也可以使用 while(interator.hasNext()){loop} 语句对迭代器内的元素进行操作。
    c. java集合遍历的几种方式总结及比较这篇文章很详细地介绍了遍历list和哈希表的几种方法。
  • 1.2 迭代和枚举有什么具体的区别?
  • 枚举比迭代快两倍而且消耗更少的内存。

    枚举更适合基本需求,而迭代是相对更安全,

    因为在遍历集合的时候,迭代器会阻止其他线程修改集合对象。

    如果有其他线程要修改集合对象,会立即抛出ConcurrentModificationException。

    我们称其为快速失败迭代器,因为它快速、明了地抛出了异常。

  • 1.3 怎样创建可迭代对象?
  • 这个方面内容很多,而且我讲的不一定能够让别人听得明白。列出我的学习路径。
  • 学习路径:
    教材 4.8.1 迭代器和for循环
    教材 9.3 接口
    博客 Java设计模式之迭代子模式 这篇博客从代码实现到设计哲学都解释地非常深刻,值得学习。
  • 2 数组
  • 阅读资料:
    Java 集合系列03之 ArrayList详细介绍(源码解析)和使用示例
    sun.misc.unsafe类的使用
  • 2.1 怎样创建动态数组
  • 在C语言中可以通过手动申请一定的内存空间来间接生成一个动态数组,在Java中可以通过链表来间接实现动态数组的功能,但是Java也提供了一个直接生成动态数组的API,即java.util.ArrayList。但是Java中实现动态数组的方式与C语言不同,ArrayList是先创建一个大小为10的数组,当容量不够时,再新建一个容量是原数组1.5倍+1大小的数组存储数据。
// 默认构造函数
ArrayList()
// capacity是ArrayList的默认容量大小。
ArrayList(int capacity)
  • 2.2 动态数组使用实例
import java.util.*;
public class Test{
    public static main(String[] args){
        ArrayList lst = new ArrayList();
        //添加元素
        lst.add('test0');
        lst.add('test1');
        lst.add('test3');
        //获取第一个元素
        String str = lst.get(0);
        //删除'test0'
        lst.remove('test0');
        //转化为迭代器进行循环
        for(Iterator iter = lst.iterator(); iter.hasNext(); ) {
        System.out.println("next is: "+ iter.next());
        }
    }
}
  • 2.3 怎么申请超过 Interger.MAX_VALUE 长度的数组/怎么使用malloc方法直接对内存进行操作?
  • Java还是提供了API,直接对内存进行操作,但在大多数情况下不建议这么使用。
import sun.misc.Unsafe;
//SuperArray.java
public class SuperArray{
    public static Unsafe getUnsafe() {
       Field f = Unsafe.class.getDeclaredField("theUnsafe");
       f.setAccessible(true);
       return (Unsafe)f.get(null);
    }
	private long size;
    private long address;
    public SuperArray(long size){
    	this.size = size;
        address = getUnsafe().allocateMemory(size * BYTE);
    }
    public void set(long i, byte value) {  
        getUnsafe().putByte(address + i * BYTE, value);  
    }
    public void get(long index){
    	return getUnsafe().getByte(address + index * BYTE);
    }
    public long size(){
    	return size;
    }
}
public class Example{
	public static void main(String[] args){
    	//实例化一个大小为 Interger.MAX_VALUE + 100 BYTE的动态数组
    	SuperArray arr = new SuperArray((long)(Interger.MAX_VALUE + 100));
    }
}

代码调试中的问题和解决过程

  • 运行命令"javac -d bin src/GradeRange.java"时报错
  • GradeRange.java中引用了Grade.java中的Grade类,需要在src目录下执行“javac GradeRange.java” 问题即可解决。

代码托管

  • 代码提交过程 & 代码量截图:
    2017-03-25.png

上周考试错题总结

  • Java中类方法使用(static)关键字声明。

    用static关键字声明的函数是该类的所有实例共同使用的,不需要每次实例化一个对象时生成一个函数。
  • Java中生成对象必须使用new关键字。(X)

    Java提供了静态方法能够直接返回一个对象。

结对及互评

张师瑜的博客课余时间学习Java学的很认真。

其他(感悟、思考等,可选)

  • 选择合适的方法、找到自己的节奏

    这周很多同学说学的很累。其实我自己学的也很累。我觉得很大的原因还是时间利用上的问题。效率往往太过低下,书上的知识点没有抓住重点来学习,往往拘泥于一些比较零散、琐碎的知识点。

    接下来的学习一定要好好改一改这种低效的学习方式。因为之前都是看书为主,然后脑洞大开地想几个有意思的问题,最后完成书上PP的练习题。虽然效果不错,但是那几个脑洞大开的问题会耗费我大量的时间去找到答案。

    感觉这种学习方法虽然很有乐趣,但是太浪费时间了。所以还是决定规定一下脑洞大开的数量!每周一个。然后把这个问题好好琢磨明白,再看半个小时网课,时间允许的话,再学一个算法。

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时
第一周 26/26 1/1 7/7
第二周 81/107 1/2 8/15 String类型的使用
第三周 80/187 1/3 5/20 位运算
第四周 300/487 1/4 8/28 动态数组和迭代器
  • 计划学习时间:5小时

  • 实际学习时间:8小时

参考资料

posted @ 2017-03-26 14:39  20162308马平川  阅读(257)  评论(21编辑  收藏  举报