- BufferedReader属于哪种流,它主要是用来做什么的
属于处理流中的缓冲流,可以将读取的内容存在内存里面 - 流一般需要不需要关闭,如果关闭的话在用什么方法,一般要在那个代码块里面关闭比较好,处理流是怎么关闭的,如果有多个流互相调用传入是怎么关闭的?
流一旦打开就必须关闭,使用close方法
放入finally语句块中(finally 语句一定会执行)
调用的处理流就关闭处理流
多个流互相调用只关闭最外层的流 - 什么叫对象序列化,什么是反序列化,实现对象序列化需要做哪些工作
对象序列化,将对象以二进制的形式保存在硬盘上
反序列化;将二进制的文件转化为对象读取
实现serializable接口
不想让字段放在硬盘上就加transient或者static静态处理 - 在实现序列化接口是时候一般要生成一个serialVersionUID字段,它叫做什么,一般有什么用
是版本号,要保持版本号的一致 来进行序列化
为了防止序列化出错 - 什么是内存流?有什么作用
将输出输入的位置设置在内存上,此时的操作应该以内存为操作点,在网络信息的传输上会有作用,可以将传入的信息保存到内存然后进行读写,速度快 - 什么是节点流,什么是处理流,它们各有什么用处,处理流的创建有什么特征
节点流: 直接与数据源相连,用于输入或者输出
处理流:在节点流的基础上对之进行加工,进行一些功能的扩展
处理流的构造器必须要传入节点流的子类 - this与super的区别?
(1)this既可以访问本类的属性和方法,又可以访问父类可见的属性和方法;super只能访问父类的属性和方法
(2)this可作为参数进行传递;super不能作为参数
(3)this调用的是本类构造方法;super调用的是父类的构造方法
(4)this()和super()不能同时使用,并且是构造方法第一条语句 - 编写多线程应用程序,模拟多个人通过一个山洞的模拟。这个山洞每次只能通过一个人,每个人通过山洞的时间为5秒,随机生成10个人,同时准备过此山洞,显示一下每次通过山洞人的姓名。
第一种办法,非线程同步
public class GuoShanDong implements Runnable {
//这里deng的时间为static修饰,目的是使时间累加,保证后面集合的元素遍历执行线程,按照5秒的等差唤醒
private static int deng=0;
@Override
public void run() {
deng= deng+5000;
try{
Thread.sleep(deng);
} catch (InterruptedException e){
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() +" 过山洞");
}
public static void main(String[] args) {
ArrayList<String> strings = new ArrayList<>();
Collections.addAll(strings, "赵","钱","孙","李","周","吴","郑","王","冯","陈");
//随机乱序处理
Collections.shuffle(strings);
//创建线程
GuoShanDong guoShanDong = new GuoShanDong();
//集合遍历,分别执行线程
for (String string : strings) {
new Thread(guoShanDong, string).start();
}
}
第二种办法,线程同步
public class GuoShanDong extends Thread {
String name;
public GuoShanDong() {
}
public GuoShanDong(String name) {
this.name = name;
}
@Override
public void run() {
synchronized (GuoShanDong.class) {
try {
System.out.println(this.name + "通过了山洞");
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public class Test {
public static void main(String[] args) {
new GuoShanDong("赵").start();
new GuoShanDong("钱").start();
new GuoShanDong("孙").start();
new GuoShanDong("李").start();
new GuoShanDong("周").start();
new GuoShanDong("吴").start();
new GuoShanDong("郑").start();
new GuoShanDong("王").start();
new GuoShanDong("冯").start();
new GuoShanDong("陈").start();
}
}
- 计算任意两个年月日天数之差
public class Demo2 {
public static void main(String[] args) throws ParseException {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
String str1 = "2018-10-31";
String str2 = "2018-10-30";
//parse根据前面定制的日期格式解析字符串,严格解析,得到date
Date date1 = simpleDateFormat.parse(str1);
Date date2 = simpleDateFormat.parse(str2);
System.out.println(((date2.getTime() -
date1.getTime()) / (24 * 60 * 60 * 1000)));
}
}
- 线程和方法的最大区别。
方法的执行依赖于主线程main,如果方法不结束,main不会停止,倘若在方法外有循环,则循环会卡在方法不再执行。
而线程和主线程main是同级关系,主线程的循环体继续执行到结束,循环里面创建的多个子线程继续执行自己的代码,不会因为main结束而结束,直到所有线程结束,程序退出。