20155320 2016-2017-2 《Java程序设计》第六周学习总结
教材学习内容总结
输入输出
- InputStream的read()方法每次都会尝试读入byte数组长度的数据,并返回实际读入的字节(只要不是-1就表示读到数据),OutoutStream的write()方法可指定要写出的byte数组、初始索引和数据长度。
- 只要指定网址,URL实例会自动进行HTTP协议;用openStream()方法取得的InputStream实例,代表与网站连接的数据串流。
- 无论来源和目的地实体形式是什么,只要取得InputStream和OutputStream,就只是调用InputStream和OutputStream的相关方法。
- Systemd的setIn()方法指定InputStream实例,重新指定标准输入来源,setOut()方法指定PrintStream实例,将结果输出至指定目的地。
- BufferInputStream与BufferOutputStream会将数据尽量地读取或者写入到缓冲区,从而提高效率
- DataInputStream与DataOutputStream提供读取写入java基本类型的方法.
- ObjectInputStream与ObjectInputStream将数据读入或写出为对象.
- FileReader、FileWriter可以对文档作读取或写入,默认会使用操作系统默认编码。
- 抽象化了数据读入和写出的目的地,会将读入的数据植入char数组中.
- 字符处理装饰器可以使用BufferReader和BufferWriter将数据进行缓冲,增加读取写入效率。
线程与并行API
-
继承Thread类也可以进行多个进程,但没有Runnable的弹性好,运用Lambda表达式也可以简化程序。
-
Daemon:在所有的非Daemon线程结束时,JVM就会自动终止
-
生命周期的五种状态
-
新建(new Thread):当创建Thread类的一个实例(对象)时,此线程进入新建状态(未被启动)。例如:Thread t1=new Thread();
-
就绪(runnable):线程已经被启动,正在等待被分配给CPU时间片,也就是说此时线程正在就绪队列中排队等候得到CPU资源。例如:t1.start();
-
运行(running):线程获得CPU资源正在执行任务(run()方法),此时除非此线程自动放弃CPU资源或者有优先级更高的线程进入,线程将一直运行到结束。
-
死亡(dead):当线程执行完毕或被其它线程杀死,线程就进入死亡状态,这时线程不可能再进入就绪状态等待执行。自然终止:正常运行run()方法后终止。异常终止:调用stop()方法让一个线程终止运行。
-
堵塞(blocked):由于某种原因导致正在运行的线程让出CPU并暂停自己的执行,即进入堵塞状态。正在睡眠:用sleep(long t) 方法可使线程进入睡眠方式。一个睡眠着的线程在指定的时间过去可进入就绪状态。正在等待:调用wait()方法。(调用motify()方法回到就绪状态)。被另一个线程所阻塞:调用suspend()方法。(调用resume()方法恢复)
-
sleep、wait阻断等都会让线程进入blocked状态,运用多线程,避免cpu空闲下来,是改进效能的方式之一。
-
Lock是锁对象,与Thread模型的隐式的锁对象相比,Lock提供了显式的锁操作从而简化应用程序。
-
Executors:提供了一组HighLevelAPI用来执行和管理并行任务。
-
ConcurrentCollections(并行集合):包含了一组支持并行处理的数据结构,大大简化了并行编程难度。
-
AtomicVariables(原子变量):减少了同步操作并且避免数据不一致。
-
用来管理群组中的线程,enumerate可以取得群组中的所有线程,activecount()用来取得线程的数量
-
被表示为synchronized的区块会被监控(monitor),需要先取得指定对象锁定后才能执行,线程因synchronized区块而进入blocked,在取得锁定之后,会先回到runnable状态,不正确地使用synchronized可能会造成效能低落或者死结。
-
volatile 变量上声明,表示该变量是不稳定的、易变的,并且不允许线程快取,保证单一变数的可见性。
教材学习中的问题和解决过程
- 问题1:关于FileInputStream()与FileOutputStream()的具体用法及作用
- 问题1解决方案:通过百度我发现了两篇博客详细解释了这个问题,一个是关于javaio的博客还有一个是FileInputStream与FileOutputStream
FileInputStream 是文件输入流,它继承于InputStream。
通常,我们使用FileInputStream从某个文件中获得输入字节。
FileOutputStream 是文件输出流,它继承于OutputStream。
通常,我们使用FileOutputStream 将数据写入 File 或 FileDescriptor 的输出流
代码调试中的问题和解决过程
- 问题1:在编写代码charutil2时出现了如下错误显示:
- 问题1解决方案:我发现这是由于我在运行提供给的代码时新建工程后取的
class
名与实际的public class
名不符所致,因此我改变了原public class 名一致后解决了错误。
代码托管
上周考试错题总结
import java.util.*;
Class FindStuff {
public static void main (String[]args) {
//insert code here
c.put ("X", 123);
}
}
分别插入到第5行,哪几行允许代码编译?(BDF)
A . Map c= new SortedMap();
B . HashMap c= new HashMap();
C . HashMap c= new Hashtable();
D .SortedMap c= new TreeMap();
E .ArrayList c= new ArrayList();
F .Map c = new LinkedHashMap();
- 4.现有:
list是一个合法的集合引用,getCollection()返回一个合法集合的引用, 哪个是合法的?(BE)
A . or(Object o ; list)
B . for(Object o : getCollection())
C . for(Object o : list.iterator())
D . for(lterator i ; list.iterator() ; i.hasNext () )
E . for(lterator i=list.iterator(); i.hasNext (); )
- 7.创建一个只能存放String的泛型ArrayList的语句是哪项?(B)
A .ArrayList
B . ArrayList
C .ArrayList al=new ArrayList
D .ArrayList
- 12.集合API 中Set接口的特点是?(D)
A .不允许重复元素,元素有顺序
B .允许重复元素,元素无顺序
C .允许重复元素,元素有顺序
D .不允许重复元素,元素无顺序
- 5.现有:
import java.util.*;
class ForInTest {
static List list=new ArrayList();
}
public static void main (String [] args) {
list. add("a"); list. add("b");list. add( "c");
//insert code here
System.out.print (o);
}
}
哪一行插入到第9行将导致输出“abc"?(D)
A .for (Iterator o : list.iterator(); o.hasNext (); )
B .for (Iterator o : list)
C .for (Object o : list.iterator())
D . for (Object o : list)
结对及互评
点评过的同学博客和代码
其他(感悟、思考等,可选)
本周尝试了一下课上娄老师推荐的学习方法虽然略有推迟但是感觉还是不错的,先看了一下老师发在资源里的视频,然后是看书上的内容,以前的代码都是自己打,但是这次我尝试先看再改提供的代码,虽然有一些无法运行,但是感觉节省了许多时间,也轻松了许多。
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 15篇 | 400小时 | |
第一周 | 20/20 | 1/4 | 20/20 | 安装了JDK及IDEA |
第二周 | 144/164 | 1/5 | 18/38 | 学习了java语言的基本语法 |
第三周 | 447/567 | 1/6 | 20/ 58 | 掌握了一些有关对象和封装的内容 |
第四周 | 875/ 1442 | 1/7 | 23/81 | 学习了解了继承、接口和多态的相关问题 |
第五周 | 775/2250 | 1/8 | 25/106 | 学习了异常处理以及Collection与Map相关的内容 |
第六周 | 487/ 2706 | 1/8 | 22/128 | 学习了输入输出 |
尝试一下记录「计划学习时间」和「实际学习时间」,到期末看看能不能改进自己的计划能力。这个工作学习中很重要,也很有用。
耗时估计的公式
:Y=X+X/N ,Y=X-X/N,训练次数多了,X、Y就接近了。
-
计划学习时间:25小时
-
实际学习时间:22小时
-
改进情况:本周与结对同学一起学习,本计划时间更充裕一点,然而合作却出乎意料的顺利,就是花在第11章中的代码中的时间更多。
(有空多看看现代软件工程 课件
软件工程师能力自我评价表)