| 失效链接处理 | 
| Java面试宝典3.0版本 PDF 下载 
	本站整理下载: 
		提取码:oxzt 
	相关截图:  
	主要内容: 
		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 容器。 
		上海传智播客·黑马程序员 著 
		上海传智播客·黑马程序员 www.itheima.com 
		第 7 页 共 91 页 
		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 中用到的装饰模式 
		装饰模式就是对一个类进行装饰,增强其方法行为,在装饰模式中,作为原来的这个 
		类使用者还不应该感受到装饰前与装饰后有什么不同,否则就破坏了原有类的结构了,所以 
		装饰器模式要做到对被装饰类的使用者透明,这是对装饰器模式的一个要求。总之装饰器设 
		上海传智播客·黑马程序员 著 
		上海传智播客·黑马程序员 www.itheima.com 
		第 8 页 共 91 页 
		计模式就是对于原有功能的扩展 
		在 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 操作是否就绪,这就要求用户进程不停的 
		去询问。 | 



 
     苏公网安备 32061202001004号
苏公网安备 32061202001004号


 
    