黑马程序员技术交流社区

标题: 【成都校区】Java高频面试系列:四 [打印本页]

作者: 小刀葛小伦    时间: 2019-1-18 09:19
标题: 【成都校区】Java高频面试系列:四
本帖最后由 小刀葛小伦 于 2019-1-18 09:54 编辑

1、 Java 基础
1.1 Collection Map
(1)掌握 Collection 和 Map 的继承体系。
(2)掌握 ArrayList(数组)、 LinkedList(链表)、 Vector(线程同步)、 Stack(继承 Vector 先进后出的
栈)、 PriorityQueue(优先级堆的极大优先级队列)、 HashSet、 LinkedHashSet(链表+hash)、
TreeSet(Comparator 比较器)、 HashMap、 LinkedHashMap(链表)、 TreeMap(Comparator 比
较器
)、 WeakHashMap(“弱键”Æ即没用了就自动被 GC 回收)、 EnumMap(key 不能为空,内部
以数组实现,性能更好
)、 HashTable(线程同步)的特点和实现原理。
补充☆(3)掌握 CopyOnWriteArrayList、 CopyOnWriteArraySet、 ConcurrentHashMap 的实现
原理和弁用场景。
CopyOnWrite 容器即写时复制的容器。通俗的理解是当我们往一个容器添加元素的时候,
不直接往当前容器添加,而是先将当前容器进行 Copy,复制出一个新的容器,然后新的容
器里添加元素,添加完元素之后,再将原容器的引用指向新的容器。这样做的好处是我们可
以对 CopyOnWrite 容器进行并发的读,而不需要加搀,因为当前容器不会添加任何元素。
所以 CopyOnWrite 容器也是一种读写分离的思想,读和写不同的容器。

CopyOnWrite 容器有很多优点,但是同时也存在两个问题,即内存占用问题和数据一
致性问题。所以在开发的时候需要注意一下。
内存占用问题。因为 CopyOnWrite 的写时复制机制,所以在进行写操作的时候,内存
里会同时驻扎两个对象的内存,旧的对象和新写入的对象(注意:在复制的时候只是复制容
器里的引用,只是在写的时候会创建新对象添加到新容器里,而旧容器的对象还在使用,所
以有两份对象内存)。如果这些对象占用的内存比较大,比如说 200M 左右,那么再写入
100M 数据进去,内存就会占用 300M,那么这个时候很有可能造成频繁的 Yong GC Full
GC
。之前我们系统中使用了一个服务由于每晚使用 CopyOnWrite 机制更新大对象,造成了
每晚 15 秒的 Full GC,应用响应时间也随之变长。
针对内存占用问题,可以通过压缩容器中的元素的方法来减少大对象的内存消耗,比如,
如果元素全是 10 进制的数字,可以考虑把它压缩成 36 进制或 64 进制。或者不使用
CopyOnWrite 容器,而使用其他的并发容器,如 ConcurrentHashMap
数据一致性问题。 CopyOnWrite 容器只能保证数据的最终一致性,不能保证数据的实
时一致性。所以如果你希望写入的的数据,马上能读到,请不要使用 CopyOnWrite 容器。
1.2 IO
掌握 InputStream、 OutputStream、 Reader、 Writer 的继承体系。


IO 流中的设计模式
1.IO 中用到的适配器模式
在 IO 中,如将字符串数据转变成字节数据保存到文件中,将字节数据转变成流数据等都用
到了弁配器模式,下面以InputStreamReader和OutputStreamWriter类为例介绍弁配器模式。
InputStreamReader 和 OutputStreamWriter 类分别继承了 Reader 和 Writer 接口,但要创建
它们必须在构造函数中传入一个 InputStream 和 OutputStream 的实例, InputStreamReader
和 OutputStreamWriter 的作用也就是将 InputStream 和 OutputStream 弁配到 Reader 和
Writer。
InputStreamReader 实现了 Reader 接口,并且持有了 InputStream 的引用,这是通过
StreamDecoder 类间接持有的,因为 byte char 要经过编码。
这里,适配器就是 InputStreamReader 类,而源角色就是 InputStream 代表的实例对象,
目标接口就是 Reader 类, OutputStreamWriter 类也是类似的方式。
IO 中类似的还有,如 StringReader 将一个 String 类适配到 Reader 接口,
ByteArrayInputStream 适配器将 byte 数组适配到 InputStream 流处理接口。
2.IO 中用到的装饰模式
装饰模式就是对一个类进行装饰,增强其方法行为,在装饰模式中,作为原来的这个
类使用者还不应该感受到装饰前与装饰后有什么不同,否则就破坏了原有类的结构了,所以
装饰器模式要做到对被装饰类的使用者透明,这是对装饰器模式的一个要求。 总之装饰器设
计模式就是对于原有功能的扩展
在 IO 中有许多不同的功能组合情况,这些不同的功能组合都是使用装饰器模式实现的,下
面以 FilterInputStream 为例介绍装饰器模式的使用。
InputStream 类就是以抽象组件存在的,而 FileInputStream 就是具体组件,它实现了抽象组
件的所有接口, FilterInputStream 类就是装饰角色,它实现了 InputStream 类的所有接口,
并持有 InputStream 的对象实例的引用, BufferedInputStream 是具体的装饰器实现者,这个
装饰器类的作用就是使得 InputStream 读取的数据保存在内存中,而ᨀ高读取的性能。类似
的还有 LineNumberInputStream 类,它的作用是ᨀ高按行读取数据的功能。
总结
这两种设计模式看起来都是起到包装一个类或对象的作用,但是使用它 们的目的却不
尽相同。弁配器模式主要在于将一个接口转变成另一个接口, 它的目的是通过改变接口来达
到重复使用的目的;而装饰器模式不是要改变被装饰对象的接口,而是保持原有的接口, 但
是增强原有对象的功能,或改变原有对象的方法而提高性能。
补充☆(3) 高性能的 IO 体系
首先得明白什么是同步,异步,阻塞,非阻塞.
1,同步和异步是针对应用程序和内核的交互而言的
2,阻塞和非阻塞是针对于进程在访问数据的时候,根据 IO 操作的就绪状态来采取的不同方

总结一句简短的话,同步和异步是目的,阻塞和非阻塞是实现方式。
名词解释
同步 指的是用户进程触发IO操作并等待或者轮询的去查看IO操作是否就绪 自己上街买衣
服,自己亲自干这件事,别的事干不了。
2) 异步 异步是指用户进程触发 IO 操作以后便开始做自己的事情,而当 IO 操作已经完成的
时候会得到 IO 完成的通知(异步的特点就是通知) 告诉朋友自己合弁衣服的尺寸,大小,
颜色,让朋友委托去卖,然后自己可以去干别的事。(使用异步 IO 时, Java 将 IO 读写委托
给 OS 处理,需要将数据缓冲区地址和大小传给 OS)
3) 阻塞 所谓阻塞方式的意思是指, 当试图对该文件描述符进行读写时, 如果当时没有东西
可读,或者暂时不可写, 程序就进入等待 状态, 直到有东西可读或者可写为止 去公交站充
值,发现这个时候,充值员不在(可能上厕所去了),然后我们就在这里等待,一直等到充
值员回来为止。(当然现实社会,可不是这样,但是在计算机里确实如此。)
4) 非阻塞 非阻塞状态下, 如果没有东西可读, 或者不可写, 读写函数马上返回, 而不会等
待, 银行里取款办业务时,领取一张小票,领取完后我们自己可以玩玩手机,或者与别人
聊聊天,当轮我们时,银行的喇叭会通知,这时候我们就可以去了。
同步阻塞 IO(JAVA BIO):
同步并阻塞,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就
需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开揿,当然可
以通过线程池机制改善。
同步非阻塞 IO(Java NIO) : 同步非阻塞,服务器实现模式为一个请求一个线程,即客户端
发开的连接请求都会注册到多路复用器上,多路复用器轮询到连接有 I/O 请求时才启动一个
线程进行处理。用户进程也需要时不时的询问 IO 操作是否就绪,这就要求用户进程不停的
去询问。
异步阻塞 IO(Java NIO):

此种方式下是指应用发起一个 IO 操作以后,不等待内核 IO 操作的完成,等内核完成 IO
操作以后会通知应用程序,这其实就是同步和异步最关键的区别,同步必须等待或者主动的
去询问 IO 是否完成,那么为什么说是阻塞的呢?因为此时是通过 select 系统调用来完成的,
而 select 函数本身的实现方式是阻塞的,而采用 select 函数有个好处就是它可以同时监听多
个文件句柄(如果从 UNP 的角度看, select 属于同步操作。因为 select 之后,进程还需要
读写数据),从而提高系统的并发性!
(Java AIO(NIO.2))异步非阻塞 IO:
在此种模式下,用户进程只需要发起一个 IO 操作然后立即返回,等 IO 操作真正的完成以
后,应用程序会得到 IO 操作完成的通知,此时用户进程只需要对数据进行处理就好了,不
需要进行实际的 IO 读写操作,因为真正的 IO 读取或者写入操作已经由内核完成了。



作者: 一个人一座城0.0    时间: 2019-1-21 08:48
看一看。
作者: 小刘同学90    时间: 2019-1-21 18:04
学习一波,感谢分享




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2