ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

百度日常实习一面面经(Java后端)

2021-11-26 20:35:11  阅读:213  来源: 互联网

标签:Java NIO 后端 对象 一面面 线程 连接 加载


  岗位:百度ACG物联网部门后端开发Java日常实习
  面试轮次:技术面一面

一、项目相关(Java Netty)

  1. NIO模型和BIO模型

      BIO(blocking I/O),同步阻塞式I/O,即客户端与服务器建立一个连接时,服务器就会启动一个线程去进行处理,如果该连接上没有I/O请求,则负责处理该连接的线程就会发生阻塞。
      NIO(no-blocking I/O),同步非阻塞式I/O,即当客户端与服务器建立一个连接后,会将该连接注册到多路复用器(selector)上,用一个线程对这些连接进行轮询,如果连接上有I/O请求,再启动一个线程去对其进行处理。
      AIO(asynchronized I/O),异步I/O,不用进行轮询,当I/O完成之后再通知系统启动一个线程进行处理。

  2. NIO相较于BIO的优势
      NIO相较于BIO减少了线程个数,减少了创建线程的开销,减少了线程阻塞,减少了系统的上下文切换的开销。

  3. Java如何实现NIO
      Java对于NIO模型的实现有三个核心类:分别是Buffer、Channel、Selector,Buffer是作为数据的缓冲区,数据的读取和写入都是写入缓冲区中,Channel是数据的传输通道,负责往缓冲区中写入数据或者从缓冲区中获取数据,Selector是多路复用器,负责监听是否有读操作,并将ByteBuffer读入Channel之中。

  4. Netty如何解析HTTP请求
      HttpServerCodec类和HttpObjectAggregator类合作将 HttpMessage(请求行、请求头) 和 HttpConent(请求体)整合为FullHttpRequest或者FullHttpResponse。

  5. Netty如何维护长连接模式
      Netty中可使用ChannelOption.SO_KEEPALIVE开启心跳机制,利用IdleStateHandler类设置读超时或者写超时,利用自定义心跳机制的方式维护长连接。

二、Java基础知识

  1. 八大数据类型
       Java中的八大数据类型分别是 int、short、long、double、float、char、boolean、byte。
  2. 什么是装箱?为什么要装箱?
      装箱就是把基本数据类型封装为对象。因为Java是面向对象的编程语言,而基本数据类型不是对象,很多时候需要对象来作为参数比如ArrayList等数据结构的泛型参数,而基本数据类型不能作为参数,需要装箱成对象之后才能作为对象参数。
  3. synchronized类锁和对象锁有什么区别?
      类锁作用于类的static方法或者类的class对象上,对象锁作用于类的实例方法或者类的实例对象上。一个类只能有一个类锁但是可以有多个对象锁,类锁和对象锁也是不一样的。多个对象锁之间不是互斥的,但多个对象对于类锁的使用是互斥的。
  4. 如何实现一个死锁
      见代码
class test extends Thread{
    static final Object lock1=new Object();
    static final Object lock2=new Object();
    boolean flag;
    test(boolean flag){
        this.flag=flag;
    }

    @Override
    public void run(){
        if(flag){
            synchronized (lock1){
                System.out.println("I got lock1.......");
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                synchronized (lock2){
                    System.out.println("I got lock2.......");
                }
            }
        }else{
            synchronized (lock2){
                System.out.println("I got lock2.......");
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                synchronized (lock1){
                    System.out.println("I got lock1.......");
                }
            }
        }
    }

    public static void main(String[] args) {
        test t1=new test(true);
        test t2=new test(false);
        t1.start();
        t2.start();
    }
}
  1. 如何实现一个比vector更加高效的线程安全容器
     (1)vector是方法加锁,可以使用代码块加锁来替换方法加锁
     (2)数组分段加锁
     (3)synchronized关键字是悲观锁,可以使用CAS乐观锁替换悲观锁

  2. JVM是如何加载class文件的
      JVM是通过类加载器去加载.class文件的,同时JVM中也存在多个类加载器:启动类加载器、标准扩展类加载器、系统类加载器、自定义类加载器,而且根据双亲委派机制,当需要加载一个类是,类加载器的加载顺序是:启动类加载器 -> 标准扩展类加载器 -> 系统类加载器 ->自定义类加载器,只有当前类加载器无法加载时,才会委派给下一级的加载器进行加载,如果所有加载器都无法加载,则抛出异常ClassNotFound。
      同时需要注意的是,JVM是通过全类名去加载类对象的。

  3. 为什么需要双亲委派机制
      双亲委派可以防止同一个class被重复加载,同时保证核心class文件不会被篡改

三、MySQL基础知识

  1. MySQL常用的存储引擎
    在这里插入图片描述
  2. 内连接、外连接
      内连接,inner join on + 条件,返回两个表在该条件下的交集部分,出现字段为null的数据项将不显示。
      左外连接,left outer join on+条件,会显示左表的全部数据,右表记录不足的地方会显示为null,右外连接同理。

四、算法题

  柱状图的最大矩形面积

标签:Java,NIO,后端,对象,一面面,线程,连接,加载
来源: https://blog.csdn.net/CY2333333/article/details/121561128

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有