IO 流
- java 中有几种类型的流
- 按照流方向:输入流 输出流
- 按照处理数据单位: 字节流,字符流
- 字节流和字符流的区别
- 字节流读取的时候,读到一个字节就返回一个字节 字符流对读取多个字节时会先去查询指定的编码表,然后再将查询到的字符返回
- 字节流可以处理所有的类型数据 字符流只能查询字符数据
- 什么是java的序列化
- 序列化是一种用来处理对象流的机制,是可以将对象持久化保存在硬盘中也可以读取硬盘中的持久化的对象
- 序列化的实现:需要被序列化的类实Serializable接口,该接口只是为了标识这个对象可以被序列化,然后构照一个对象流(ObjectOutputStream)输出流的实例 在使用writeObject(Object obj)方法就可以将参数为 obj 的对象写出(即保存其状态),要恢复的话则用输入流
- 序列化使用的场景
- 需要通过网络来发送对象,或对象的状态需要持久化到数据库或者文件中
- 需要复制对象的时候 序列化可以进行深复制,既可以复制引用的对象
集合
- ArrayList、HashSet、HashMap 是线程安全的吗?
- 查看他们底层源码中他们所以方法都没有锁对象,所以不是线程安全的!
- ArrayList 内部是用什么实现的
- ArrayList 是用一个Object 动态数组实现的 最好对 list 的crud 操作叙述一下
- 说说ArrayList 和linkedList Voctor 的区别
- ArryList 底层是数组 所以查询快,增删慢
- LinkList 底层是链表 所以增删快 查询慢
- Voctor 底层是数组 但是线程是安全的 所以crud 都相对较慢
- List和map Set 的区别
- list 和set是储存单列集合 map是储存双列集合
- list 有序可重复 set 无序不可重复(位置根据Hashcode 的值来决定 所以在存储一段数字的时候可能出现排好序的情况)map 的是无序键不可重复
- List a=new ArrayList()和 ArrayList a =new ArrayList()的区别?
- List a=new ArrayList() 是使用了多态 但是他的对象还是List 只能使用List和Arrylist 共有的方法
- ArrayList a =new ArrayList() 是直接创建对象 可以使用所有的ArrayList的方法
- map 中的key value 可以为null吗
- 这个要看具体的实现类 例如hashMap 的对象key value 度可以为null 但是只能有一个不能重复
- hahTable 对象的 key value 值均不可以为null
- JAVA 中NIO是什么
- NIO 是非阻塞IO 与传统Socket 相比 NIO 在采用非阻塞的方式在处理大量并发请求的时候NIO 要比使用Socket效率高的多
- Collection和Colletions 有什么区别
- Collection 是一个集合的类的父接口,是提供对集合操作的通用接口方法
- Collections 是针对集合的一个包装类,他提供一系列静态方法对各种集合的搜素。。。等一系列操作
多线程
- 进程和线程的区别
- 进程是资源分配的最小单位,线程是Cpu调度的最低单位
- 与进程相比,线程的创建和切换比进程开销更小
- 使用多线程能简化程序的结构,使用程序便于理解和维护,一个复杂的进程可以分成多个线程来执行
- Thread 中的Start方法和Run方法的区别
- 线程是调用Start()方法启动线程,该线程处于就绪状态,而非运行状态,也就意味着这个线程可以被JVm 调用执行 而直接调用线程的Run方法只是被当为普通线程调用 Start方法异步调用run方法开启线程!
- Thread 和Runnable 有什么关系
- Runnable接口真的是仅仅是一个接口,它并不是一个线程,不能用来启动线程,真正执行线程的还是Thread。Runnable字面意思也就是可执行的,我的理解是Runnable接口用来定义可以给线程执行的东西,也就是把run()方法的代码仍在线程去执行
- image-20190601103137570
- 在源码中Runnable 接口只有一个Run 方法,我们都知道直接调用Run方法是不可以实现线程的所以它还是依赖Theread 中的Start()方法
- 如何给Run方法传参
- 构照函数传参
- 成员变量传参
- 回调函数传参
- 如何实现处理线程的返回值
- 主线程等待
- 使用Thread 类的Join()阻塞当前线程以等待子线程处理完毕
- 通过Callable 接口实现:通过FutureTask Or 线程池获取线程
- 线程的状态
- 六个状态
- 新建(new) 创建后尚未启动的线程状态
- 运行 (Runnable) 包含Running和Ready
- 无线期等待(Waiting) 不会被cpu分配执行时间,需要显示唤醒 被wait和join 陷入等待
- 调用了wait()和Join() 方法没有设置时间参数
- 限期等待(Timed Waiting) :在一定时间后会自动唤醒
- 调用了wait()和Join() 方法没设置了时间参数
- 阻塞状态(Blocked) 等待获取排它锁
- 结束状态(terminated) 已终止状态,线程已经结束执行
- image-20190601114225772
- Sellp 和wait 的区别
- Sellp 是Thread 的方法 Wait()是Object 类中定义的方法
- Sleep() 方法是可以在任何地方使用,wait()方法只能在synchronized方法或者synchronized 块中使用
- Sleep() 需要抛出异常,Wait 不需要
- Thread.sleep 只会让出Cpu,不会导致锁行为的改变
- Object.wait 不仅让出Cpu,还会释放同步资源锁
- notify和notifyAll 的区别
- 要了解这两个区别 我们首先了解一下两点
- 锁池
- image-20190601112708891
- 等待池
- image-20190601112743913
- NotifyAll 会让所有处于等待池的线程全部进入锁池去竞争获取锁的机会,notify只会随机选取一个处于等待池中的线程进入锁池去竞争获取锁的机会