面试高频知识点分享-2021

2021-07-16
预计阅读时间:11分钟

将近期的面试过程中遇到的问题和部分解答总结如下,留个纪念的同时也希望可以帮到路过的你~

AOP(重点:动态代理):

思想:定义一个切面,在切面的纵向定义处理方法,处理完成之后,回到横向业务流。

  1. 目的:对业务的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率
  2. 原理:采取横向抽取机制,即将分散在各个方法中的重复代码提取出来,然后在程序编译或运行阶段将这些抽取出来的代码应用到需要执行的地方。

MySQL:

  1. 事务:事务是指程序中一系列严密的操作,而且操作必须全部完成,否则在操作中所做的所有修改都会被撤销。
  2. 事务的四个特性(ACID):
    • 原子性(Atomicity):操作这些指令时,要么全部执行成功,要么全部都不执行。只要其中一个指令执行失败,所有的指令都执行失败,数据进行回滚,回到执行指令前的数据状态。
    • 一致性(Consistency):事务的执行使数据从一个状态转换为另外一个状态,但是对于整个数据的完整性保持一致。
    • 隔离性(Isolation):一个事务的进行不能对其他的事务造成干扰。
    • 持久性(Durability):也称永久性,指一个事务但提交,它对数据库的改变就应该是永久性的
  3. 事务隔离级别:
隔离级别 脏读可能性 不可重复读可能性 幻读可能性 加锁读
READ_UNCOMMITTED
READ_COMMITTED
REPEATABLE_READ
SERIALIZABLE

数据结构:

  1. 栈:
  2. 队列:
  3. 树:
  4. 链表:

SQL:

谈谈final,finally,finalize的区别

  • final是Java的一个关键字,用于定义不能被继承的类,不能被覆盖(重写)的方法、变量。
  • finally是Java的一个关键字,是异常处理操作的统一出口。
  • finalize是Object类中所提供的的一个方法,用于在对象回收之前进行收尾操作。

请解释Java跨平台(可移植性)的原理

  • Java程序最终通过字节码文件运行,运行的时候需要JVM的支持,但是在不同的操作系统上有不同的JVM,程序不用关心操作系统,只关心JVM,只要JVM不改变,程序可以在操作系统间任意移植

请解释path和classpath的区别

  • path是windows的环境变量,用于指定执行命令的路径
  • classpath是指在Java程序执行的时候,用于指定类的加载路径

请解释&和&&、| 和 || 的区别

  • &(普通与)和|(普通或)指的是所有条件都进行判断;
  • &&(短路与)如果前面的条件不满足,则后面不再进行判断,||(短路或)如果前面的条件判断满足则后面不再判断;
  • 在开发之中为了性能的提高,主要使用短路与和短路或操作;
  • &和|除了用于逻辑运算外,也可以进行位运算的操作;

请解释String类的两种比较方式

  • 在String类中可以使用“==”和equals()两种操作来进行字符串的比较
  • “==”比较的是两个字符串的内存地址数值,属于数值比较
  • equals()是String类中提供的一个方法,用于字符串内容的比较,最简单的做法就是比较字符串永远使用equals()方法就行

请谈谈方法的重载和覆写的区别

  1. 首先重载和方法覆写都是面向对象多态性的一个体现
  2. 重载
    • 单词:Overloading
    • 概念:方法名称相同,参数的类型或个数不同
    • 范围:发生在一个类之中
    • 权限:重载的时候没有权限的限制
  3. 覆写
    • 单词:Override
    • 概念:方法名称、返回值、参数的个数及类型全部相同
    • 范围:发生在继承关系中
    • 权限:子类覆写的方法不能拥有比父类更严格的访问控制权限
  4. 重载时可以返回值类型不同,但是没有任何意义

请谈谈this和super的区别

1.this

  • 属性:this.属性表示的是找到本类的属性,如果本类没有找到则继续查找父类

  • 方法:this.方法()则表示找到本类的方法,如果本类没有找到则极细查找父类

  • 构造:必须放在构造方法的首行,不能与super关键字同时出现

  • 特殊:表示当前对象

2.super

  • 属性:super.属性直接在子类之中查找父类的指定属性,不在时查找子类本身
  • 方法:super.方法()直接在子类之中查找父类中的指定方法,不在查找子类本身
  • 构造:必须放在构造方法的首行,不能与this关键字同时出现

总结:在开发之中使用this和super可以明确划分出子类和父类之间的操作

请解释Collection和Collections的关系

  • 两者之间在定义上没有直接的关系
  • Collection是单值集合的操作最大父接口
  • Collections只是一个集合的工具操作类

为什么构造方法的定义上不写返回值类型,如果不返回写一个void不也可以吗?

如果构造方法上写了void的话,则表示的就是一个普通方法了,普通方法是在对象实例化之后调用的,而构造方法是在对象实例化的时候同时调用的

请解释Error和Exception的区别

  • Error:表示的是JVM出错,即程序还没有运行时所发生的错误,用户无法处理;
  • Exception:表示程序运行时发生的错误,用户可以处理

解释String和StringBuffer的区别,分别在什么时候用

  • String的内容不能改变(改变的是地址的指向),而StringBuffer的内容是可以改变的
  • String类和StringBuffer类中定义的方法可以很好的实现互补
  • 从开发的角度来说,大部分情况使用的都是String类,很少使用StringBuffer,使用StringBuffer只有一个前提,当字符串的内容需要不断修改对象的时候

请解释throw和throws的区别

  • throw表示人为的进行异常抛出,手工抛出异常
  • throws表示用于方法声明上,表示一个方法不处理异常,而是交给被调用处处理

使用char型数据能否表示一个汉字

首先一个汉字占2个字节,而UNICODE编码也是16位的,Java又是采用UNICODE编码,但是保存汉字,语言必须是中文才可以保存

是否可以继承String类

不可以,因为String类是final类,不可以被继承

抽象类可以有构造方法吗

可以有构造方法,而且抽象类中的子类实例化对象的时候也依然符合子类对象实例化的过程,先调用父类的构造方法,为父类的属性初始化,而后调用子类自己的构造方法,所以抽象类中的属性,static属性,常量等都是可以定义的

抽象类中可以没有抽象方法吗

可以没有抽象方法,尽管没有抽象方法,也不能直接使用关键字new实例化对象

请简述MySQL的查询过程,从客户端发送查询请求到返回结果,数据库执行的查询过程有哪些?列出步骤

  1. 客户端发送SQL请求到服务器

  2. 服务器检查是否可以在查询缓存中命中该SQL

  3. 服务器端进行SQL解析,预处理,再由优化器生成对应的执行计划

  4. 根据执行计划,调用存储引擎API查询数据

  5. 将结果返回到客户端

简单介绍MySQL复合索引和使用条件

AWR是Oracle 10g版本推出的新特性,简述AWR作用

描述JVM加载Class文件的原理机制

Java语言是一种具有动态性的解释型语言,类.class只有被加载到JVM后才能运行。当运行指定程序时,JVM会将编译生成的.class文件按照需求和一定的规则加载到内存中,并组织成为一个完整的Java应用程序。这个加载过程事由类加载器完成,具体来说,就是由ClassLoader和它的子类来实现的。类加载器本身也是一个类,其实质就是把类文件从硬盘读取到内存中。

类加载的方式分为隐式加载和显式加载。隐式加载指的是程序在使用new等方式创建对象时,会隐式地调用类的加载器把对应的类加载到JVM中。显式加载指的是通过直接调用class.forName()方法来把所需的类加载到JVM中。

任何一个工程项目都是由许多类组成的,当程序启动时,只把需要的类加载到JVM中,其他类只有被使用到的时候才会被加载,采用这种方法一方面可以加快加载速度,另一方面可以节约程序运行时对内存的开销。此外,在Java语言中,每个类或接口都对应一个.class文件,这些文件可以被看成是一个可以被动态加载的单元,因此当只有部分类被修改时,只需要重新编译变化的类即可,而不需要重新编译所有文件,因此加快了编译速度。

在Java语言中,类的加载是动态的,它并不会一次性将所有类加载后再运行,而是保证程序运行的基础类(例如基类)完全加载到JVM中,至于其他类,则在需要的时候才加载。

类加载的主要步骤:

  • **装载:**根据查找路径找到相应的class文件、然后导入
  • **链接:**链接又分为3小步(1.检查: 检查待加载的class文件的正确性 2.准备: 给类中的静态变量分配存储空间 3.解析: 将符号引用转换为直接引用[可选])
  • **初始化:**对静态变量和静态代码块执行初始化操作

分别描述什么是XSS攻击、SQL注入攻击、CSRF攻击?

Java新特性合集

Spring中自动装配的方式有哪些?

应用服务器优化技术有哪些?

用Java写一个单例类

public class Singleton{
    private Singleton{}
    private static Singleton instance = new Singleton();
    public Singleton getInstance(){
        return instance;
    }
}

垃圾回收算法概述

什么是线程安全?说明一下线程安全的级别!

什么是Java反射机制?Java反射技术主要实现类有哪些,作用分别是什么?

线程安全与非线程安全集合说一下,底层怎么实现的(HashMap,ConcurrentHahMap)?详细说明ConcurrentHashMap如何实现线程安全?

Java跨平台原理(字节码文件、虚拟机)!

谈谈你对SQL的优化。

各种排序方法以及时间复杂度

谈谈从在浏览器输入URL到显示页面经历了哪些过程?

明确一点:互联网内各设备间的通信都遵循TCP/IP协议,利用TCP/IP协议族进行网络通信时,会通过分层顺序与对方进行通信。分层由高到低分别为:应用层传输层网络层数据链路层 。发送端从应用层往下走,接收端从数据链路层往上走。

一、网络通信

1.在浏览器中输入URL

用户输入URL,例如“https://www.baidu.com”,其中http为协议,“www.baidu.com”为网络地址,指出需要的资源在哪台计算机上。一般网络地址可以使用域名和IP地址,使用域名是为了方便记忆,但为了让计算机理解这个地址则需要把它解析为IP地址。

2.应用层DNS解析域名

客户端先检查本地是否有对应的IP地址,若找到则返回相应的IP地址。若没有找到则请求上级DNS服务器,直至找到根结点。

3.应用层客户端发送HTTP请求

HTTP请求包括请求头和请求主体两个部分,其中请求头包括请求的方法(GET/POST)、目标URL、遵循的协议(HTTP/HTTPS/FTP…),返回的信息是否需要缓存,以及客户端是否发送cookie等。

4.传输层TCP传输报文

位于传输层的TCP协议为传输报文提供可靠的字节流服务。他为了方便传输,将大块的数据分割成以报文段位段为单位的数据包进行管理,并为他们编号,方便服务器接收时能准确地还原报文信息。TCP协议通过“三次握手”等方法保证传输的安全可靠。

5.网络层IP协议查询MAC地址

IP协议的作用是把TCP分割好的数据包传送给接收方,且要保证传到接收方的MAC地址,即物理地址。IP地址和MAC地址是一一对应的观念西,ARP协议可以将IP地址解析成对应的MAC地址。

6.数据到达数据链路层

在找到对方的MAC地址后,就将数据发送到数据链路层传输。此时客户端请求阶段结束。

7.服务器接收数据

接收端的服务器在里链路层收到数据包,再噌噌向上到应用层,过程中包括在传输层层通过TCP协议将分段的数据包重新组成原来的HTTP报文

8.服务器响应请求

服务端收到客户端发送的HTTP请求后,查找客户端请求的资源,并返回响应报文,响应报文中包括重要的信息——状态码。

常见状态码:

200 OK: 表示请求成功

301: 表示永久重定向,请求的资源已经永久转移到新的位置,再返回301状态码的同时,响应报文也会附带重定向的URL,客户端接收到后将HTTP请求的URL做相应改变再重新发送。

404 NOT FOUND: 表示客户端请求的资源找不到

9.服务器返回相应文件

请求成功后,服务器会返回相应的HTML文件,接下来就到了页面渲染的阶段

二、页面渲染

现代浏览器渲染页面的过程是这样的:解析HTML以构建DOM树 –> 构建渲染树 –> 布局渲染树 –> 绘制渲染树。

DOM树是由HTML文件中的标签排列组成,渲染树是在DOM树中加入CSS或HTML中的style样式而形成。渲染树只包含需要显示在页面中的DOM元素,像<head>元素或display属性值为none的元素都不在渲染树中。

在浏览器还没接收到完整的HTML文件时,它就开始渲染页面了,在遇到外部链入的脚本标签或样式标签或图片时,会再次发送HTTP请求重复上述的步骤。在收到CSS文件后会对已经渲染的页面重新渲染,加入它们应有的样式,图片文件加载完立刻显示在相应位置。在这一过程中可能会触发页面的重绘或重排。