0
点赞
收藏
分享

微信扫一扫

java高级编程题库和答案,2021大厂Java高级面试题及答案

最近技术群的一个问题,引起了我的思考:

今年,还存在金三银四吗?

大家都知道程序员涨薪主要还是要靠跳槽来完成!但是我们都知道,无论是考试,还是求职,这个难度,参加人数是影响难度的一个很大因数(当然特别牛逼的大佬可以忽略这句话)。

每年高考、考研人数都在增加,这求职人数也必然是每年都会增加的,因此,就算完全不出新技术,求职的难度也会越来越大

最近和不少出去面试的朋友闲聊,都发现,两年前面试高级开发,会JUCJVM相关的知识点都是加分项,现在反而成了基本要求,不会这些,面试都是被吊起来打!

两年前,JVM会一些理论知识,比如垃圾回收算法的概念,优缺点,适用场景等都已经能达到及格水平。现在人多了,这个筛选难度也大了,现在都开始问,你有没有做过哪些JVM调优?

大家都知道,公司开发的人数比较多,就算有JVM问题,那么参与调优的人数也是有限的。公司不可能像大学一样,让每个人都能在实验室,然后每个同学都能在亲自做实验,然后老师再打分之类。

现实是,很多同学的公司,根本没有JVM调优场景,就算有,你也没有机会参与解决,现在的面试情况就是,你不会,很可能就被“误杀”。

Java NIO 基本介绍

  • Java NIO 全称 java non-blocking IO,是指 JDK 提供的新 API。从 JDK1.4 开始,Java 提供了一系列改进的输入/输出的新特性,被统称为 NIO(即 New IO),是同步非阻塞的
  • NIO 相关类都被放在 java.nio 包及子包下,并且对原 java.io 包中的很多类进行改写。
  • NIO 有三大核心部分:Channel(通道),Buffer(缓冲区), Selector(选择器)
  • NIO是 面向缓冲区 ,或者面向 块 编程的。数据读取到一个它稍后处理的缓冲区,需要时可在缓冲区中前后移动,这就增加了处理过程中的灵活性,使用它可以提供非阻塞式的高伸缩性网络
  • Java NIO的非阻塞模式,使一个线程从某通道发送请求或者读取数据,但是它仅能得到目前可用的数据,如果目前没有数据可用时,就什么都不会获取,而不是保持线程阻塞,所以直至数据变的可以读取之前,该线程可以继续做其他的事情。 非阻塞写也是如此,一个线程请求写入一些数据到某通道,但不需要等待它完全写入,这个线程同时可以去做别的事情。
  • 通俗理解:NIO是可以做到用一个线程来处理多个操作的。假设有10000个请求过来,根据实际情况,可以分配50或者100个线程来处理。不像之前的阻塞IO那样,非得分配10000个。
  • HTTP2.0使用了多路复用的技术,做到同一个连接并发处理多个请求,而且并发请求的数量比HTTP1.1大了好几个数量级。

NIO 和 BIO 的比较

  1. BIO 以流的方式处理数据,而 NIO 以块的方式处理数据,块 I/O 的效率比流 I/O 高很多
  2. BIO 是阻塞的,NIO 则是非阻塞的
  3. BIO基于字节流和字符流进行操作,而 NIO 基于 Channel(通道)和 Buffer(缓冲区)进行操作,数据总是从通道读取到缓冲区中,或者从缓冲区写入到通道中。Selector(选择器)用于监听多个通道的事件(比如:连接请求,数据到达等),因此使用单个线程就可以监听多个客户端通道

NIO 三大核心原理示意图

一张图描述NIO 的 Selector 、 Channel 和 Buffer 的关系

java高级编程题库和答案,2021大厂Java高级面试题及答案

  • 每个channel 都会对应一个Buffer
  • Selector 对应一个线程, 一个线程对应多个channel(连接)
  • 该图反应了有三个channel 注册到 该selector //程序
  • 程序切换到哪个channel 是有事件决定的, Event 就是一个重要的概念(EventLoop)
  • Selector 会根据不同的事件,在各个通道上切换
  • Buffer 就是一个内存块 , 底层是有一个数组
  • 数据的读取写入是通过Buffer, 这个和BIO , BIO 中要么是输入流,或者是输出流, 不能双向,但是NIO的Buffer 是可以读也可以写, 需要 flip 方法切换
  • channel 是双向的, 可以返回底层操作系统的情况, 比如Linux , 底层的操作系统通道就是双向的.

下面我们就开始一一来学习NIO的三大组件吧

缓冲区(Buffer)

基本介绍

缓冲区(Buffer):缓冲区本质上是一个可以读写数据的内存块,可以理解成是一个容器对象(含数组),该对象提供了一组方法,可以更轻松地使用内存块,,缓冲区对象内置了一些机制,能够跟踪和记录缓冲区的状态变化情况。Channel 提供从文件、网络读取数据的渠道,但是读取或写入的数据都必须经由 Buffer,如图: 【后面举例说明】

Buffer 类及其子类

  • 在 NIO 中,Buffer 是一个顶层父类,它是一个抽象类, 类的层级关系图:

java高级编程题库和答案,2021大厂Java高级面试题及答案

  • Buffer类定义了所有的缓冲区都具有的四个属性来提供关于其所包含的数据元素的信息:java高级编程题库和答案,2021大厂Java高级面试题及答案

《一线大厂Java面试真题解析+Java核心总结学习笔记+最新全套讲解视频+实战项目源码》开源

Java优秀开源项目:

  • ali1024.coding.net/public/P7/Java/git

  • github.com/spring-projects

最后

整理的这些资料希望对Java开发的朋友们有所参考以及少走弯路,本文的重点是你有没有收获与成长,其余的都不重要,希望读者们能谨记这一点。

image

image

其实面试这一块早在第一个说的25大面试专题就全都有的。以上提及的这些全部的面试+学习的各种笔记资料,我这差不多来回搞了三个多月,收集整理真的很不容易,其中还有很多自己的一些知识总结。正是因为很麻烦,所以对以上这些学习复习资料感兴趣

举报

相关推荐

0 条评论