面试题集锦(二)

  1. BufferedReader属于哪种流,它主要是用来做什么的
    属于处理流中的缓冲流,可以将读取的内容存在内存里面
  2. 流一般需要不需要关闭,如果关闭的话在用什么方法,一般要在那个代码块里面关闭比较好,处理流是怎么关闭的,如果有多个流互相调用传入是怎么关闭的?
    流一旦打开就必须关闭,使用close方法
    放入finally语句块中(finally 语句一定会执行)
    调用的处理流就关闭处理流
    多个流互相调用只关闭最外层的流
  3. 什么叫对象序列化,什么是反序列化,实现对象序列化需要做哪些工作
    对象序列化,将对象以二进制的形式保存在硬盘上
    反序列化;将二进制的文件转化为对象读取
    实现serializable接口
    不想让字段放在硬盘上就加transient或者static静态处理
  4. 在实现序列化接口是时候一般要生成一个serialVersionUID字段,它叫做什么,一般有什么用
    是版本号,要保持版本号的一致 来进行序列化
    为了防止序列化出错
  5. 什么是内存流?有什么作用
    将输出输入的位置设置在内存上,此时的操作应该以内存为操作点,在网络信息的传输上会有作用,可以将传入的信息保存到内存然后进行读写,速度快
  6. 什么是节点流,什么是处理流,它们各有什么用处,处理流的创建有什么特征
    节点流: 直接与数据源相连,用于输入或者输出
    处理流:在节点流的基础上对之进行加工,进行一些功能的扩展
    处理流的构造器必须要传入节点流的子类
  7. this与super的区别?
    (1)this既可以访问本类的属性和方法,又可以访问父类可见的属性和方法;super只能访问父类的属性和方法
    (2)this可作为参数进行传递;super不能作为参数
    (3)this调用的是本类构造方法;super调用的是父类的构造方法
    (4)this()和super()不能同时使用,并且是构造方法第一条语句
  8. 编写多线程应用程序,模拟多个人通过一个山洞的模拟。这个山洞每次只能通过一个人,每个人通过山洞的时间为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();
    }
}
  1. 计算任意两个年月日天数之差
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)));

    }
}
  1. 线程和方法的最大区别。
    方法的执行依赖于主线程main,如果方法不结束,main不会停止,倘若在方法外有循环,则循环会卡在方法不再执行。
    而线程和主线程main是同级关系,主线程的循环体继续执行到结束,循环里面创建的多个子线程继续执行自己的代码,不会因为main结束而结束,直到所有线程结束,程序退出。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值