Java3000问~第2问:既然有了字节流,为什么还要字符流?BIO,NIO,AIO有什么区别?深拷贝和浅拷贝?List,Set,Map三者的区别?

7、既然有了字节流,为什么还要字符流?

字符流是由Java虚拟机将字节转换得到的,问题就出现在这个过程非常耗时,并且,如果我们不知道编码类型很容易乱码。所以,I/O流就干脆提供了一个直接操作字符的接口,方便我们平时对字符进行操作。如果是音频文件、图片等媒体用字节流比较好,如果涉及到字符的话字符流比较好。

8、BIO,NIO,AIO有什么区别?

BIO: 同步阻塞i/o模式,数据的读取写入必须阻塞在一个线程内等待其完成。在活动连接数不是特别高(小于单机1000)的情况下,这种模型是比较不错的,可以让每个连专注自己的i/o并且编程模式简单,也不需要过多考虑系统的过载,限流等问题。线程池本身就是一个天然的漏斗,可以缓冲一些系统处理不了的连接或请求,但是,当面对十万或者更多的链接的时候,传统的BIO模型是无能为力的。因此需要更高效的io模型。

NIO: NIO 是⼀种同步非阻塞的 I/O 模型,在 Java 1.4 中引入了NIO 框架,对应 java.nio 包,提供了 Channel , Selector,Buffer 等抽象。NIO 中的 N 可以理解为 Non-blocking,不单纯是 New。它支持⾯向缓冲的,基于通道的 I/O 操作方法。 NIO提供了与传统 BIO 模型中的 Socket 和 ServerSocket 相对应的 SocketChannel 和ServerSocketChannel 两种不同的套接字通道实现,两种通道都支持阻塞和非阻塞两种模式。阻塞模式使用就像传统中的支持⼀样,比较简单,但是性能和可靠性都不好;非阻塞模式正好与之相反。对于低负载、低并发的应用程序,可以使用同步阻塞 I/O 来提升开发速率和更好的维护
性;对于高负载、高并发的(网络)应用,应使用 NIO 的非阻塞模式来开发。

AIO: AIO 也就是 NIO 2。在 Java 7 中引⼊了 NIO 的改进版 NIO 2,它是异步非阻塞的 IO 模型。异步 IO 是基于事件和回调机制实现的,也就是应⽤操作之后会直接返回,不会堵塞在那⾥,当后台处理完成,操作系统会通知相应的线程进⾏后续的操作。AIO 是异步 IO 的缩写,虽然 NIO 在⽹络操作中,提供了⾮阻塞的方法,但是 NIO 的 IO 行为还是同步的。对于 NIO 来说,我们的业务线程是在 IO 操作准备好时,得到通知,接着就由这个线程自进行 IO 操作,IO 操作本身是同步的。查阅网上相关资料,我发现就目前来说 AIO 的应用还不是很广泛,Netty 之前也尝试过 AIO,不过又放弃了

9、深拷贝和浅拷贝?

浅拷贝: 对基本数据类型进行值传递,对引用数据类型进行引用递般的拷贝,此为浅拷贝。
深拷贝: 对基本数据类型进行值传递,对引用数据类型,创建⼀个新的对象,并复制其内容,此
为深拷贝

10、List,Set,Map三者的区别?

  • List(对付顺序的好帮手): List接口存储一组不唯一(可以有多个元素引用相同的对象),有
    序的对象

  • Set(注重独一无二的性质): 不允许重复的集合。不会有多个元素引用相同的对象。

  • Map(用Key来搜索的专家): 使用键值对存储。Map会维护与Key有关联的值。两个Key可以引用相
    同的对象,但Key不能重复,典型的Key是String类型,但也可以是任何对象。

11、Arraylist 与 LinkedList 区别?

  1. 是否保证线程安全: ArrayList 和 LinkedList 都是不同步的,也就是不保证线程安全;
  2. 底层数据结构: Arraylist 底层使用的是 Object 数组; LinkedList 底层使用的是双向链表数据结构
  3. 插入和删除是否受元素位置的影响: ArrayList 采用数组存储,所以插入和删除元素的
    时间复杂度受元素位置的影响。 比如:执行 add(E e) 方法的时候, ArrayList 会默认在将指
    定的元素追加到此列表的末尾,这种情况时间复杂度就是O(1)。但是如果要在指定位置 i 插⼊
    和删除元素的话( add(int index, E element) )时间复杂度就为 O(n-i)。因为在进⾏上述操作
    的时候集合中第 i 和第 i 个元素之后的(n-i)个元素都要执⾏向后位/向前移⼀位的操作。
    LinkedList 采用链表存储,所以对于 add(​E e) ⽅法的插入,删除元素时间复杂度不受元素位
    置的影响,近似 O(1),如果是要在指定位置 i 插入和删除元素的话( (add(int index, E
    element) ) 时间复杂度近似为 o(n)) 因为需要先移动到指定位置再插入。
  4. 是否支持快速随机访问: LinkedList 不支持高效的随机元素访问,而ArrayList 支持。
    快速随机访问就是通过元素的序号快速获取元素对象(对应于 get(int index) 方法)。
  5. 内存空间占用: ArrayList的空间浪费主要体现在在list列表的结尾会预留⼀定的容量空
    间,而LinkedList的空间花费则体现在它的每⼀个元素都需要消耗比ArrayList更多的空间(因
    为要存放直接后继和直接前驱以及数据)

猜你喜欢

转载自blog.csdn.net/qq_40247570/article/details/124950205