20162308 2016-2017-2 《程序设计与数据结构》第4周学习总结
20162308 2016-2017-2 《程序设计与数据结构》第4周学习总结
教材学习内容总结
- Java OOP编程
- 数组
- 条件和循环
教材学习中的问题和解决过程
- 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” 问题即可解决。
代码托管
- 代码提交过程 & 代码量截图:
上周考试错题总结
- 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小时