Java面试之基本概念(二)

时间:2022-06-02
本文章向大家介绍Java面试之基本概念(二),主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

综合了网上的一些面试经,整理出来一部分资料,后续会有补充,希望大佬们多多指点!

什么是竞态条件?举个例子说明

当两个线程竞争同一资源的时候,如果对资源的访问顺序敏感,就称存在竞态条件。导致竞态条件发生的代码区称作临界区

在同一程序中运行多个线程本身不会导致问题,但是问题在于多个线程访问了相同的资源,如同一内存区(变量、数组、对象)或系统(数据库,web service等)或文件。实际上这些问题只有在一个或多个线程向这些资源做了写操作的时候才有可能发生,只要资源没有发生变化多个线程读取相同的资源就是安全的。

多线程执行以下代码可能会有错:

public class Counter{
  protected long count=0;
  public void add(long value){
    this.counter=this.counter+value;
  }
}

当线程A和线程B同时执行一个counter对象的add()方法,我们没有办法知道操作系统何时会在两个线程之间切换。JVM并不是将这段代码视为单条件指令来执行的,而是按照下面的顺序

  1. 从内存中获取this.counter的值放到寄存器
  2. 将寄存器中的值增加value
  3. 将寄存去中的值写回内存

线程A和B交错会发生:

this.count=0

A:读取this.count到一个寄存器(0)

B:读取this.count到一个寄存器(0)

B:将寄存器中值➕2

B:回写寄存器值(2)到内存,this.count现在等于2

A:将寄存器值+3

A::回写寄存器值(3)到内存,this.count现在等于3

两个线程分别加了2和3到count变量上,两个线程执行结束后count变量的值应该等于5。然而由于两个线程是交叉执行的,两个线程从内存中读出的初始值都是0。然后各自加了2和3,并分别写回内存。最终的值并不是期望的5,而是最后写回内存的那个线程的值,上面例子中最后写回内存的是线程A,但实际中也可能是线程B。如果没有采用合适的同步机制,线程间的交叉执行情况就无法预料。

JRE、JDK、JVM以及JIT之间有什么不同?

  1. JRE:Java运行时环境 ,JVM对于一个平台或操作系统是明确的,而JRE代表了完整的运行时环境。在JRE文件夹中看到的所有JRE文件和可执行文件都会变成运行时的一部分。事实上,运行时JRE变成了JVM。所以对于一般情况的时候使用JRE,对于明确的操作系统来说使用JVM。当你下载JRE的时候,也自动地下载了JVM。
  2. JVM:使用Java编程语言的主要优势就是平台的独立性。Java就是通过虚拟机来实现平台的独立性,虚拟机抽象化了硬件设备,开发者和他们的程序操作系统。虚拟机的职责就是处理和操作系统的交流,Java不同的接口规范对任何平台都有良好的支持,因为JVM很好的实现了每个平台的规范。JVM可以理解为伪代码字节码,在用户和操作系统之间建立一层枢纽。
  3. JDK:Java开发工具箱,指的是编写一个Java应用所需要的jar文件和可执行文件。事实上JRE是JDK的一部分。JDK中要牢记的jar文件就是tools.jar,它包含了用于执行java文档的类还有用于类签名的jar包。
  4. JIT:即时编译器,它通过有效地把字节码变成机器码来提高JVM的效率。JIT的功效很特殊,因为它把检测到相似的字节码编译成单一运行的机器码,从而节省了CPU的使用

MVC的各个部分都有那些技术来实现?如何实现?

MVC模式的目的就是实现Web系统的职能分工

Model层实现系统总的业务逻辑,通常可以用JavaBean或EJB来实现

View层用于与用户的交互,通常用JSP来实现

Controller层提供应用的处理过程控制,通常用servlet来实现

RPC 通信和 RMI 区别

RPC(remote procedure call protocol)远程过程调用协议,通过网络从远程计算机上请求调用某种服务

RMI(remote method invocation)远程方法调用,能够在客户端Java虚拟机上的对象那个像调用本地对象一样调用服务端Java虚拟机中对象的方法

RPC和RMI之间的区别:

  • 方法调用方式不同

RMI中是通过在客户端的stub对象作为这个远程接口进行远程方法的调用,每个远程方法都具有方法签名。如果一个方法在服务器上执行,但是没有相匹配的签名被添加到这个远程接口(stub)上,那么这个新方法就不能被RMI客户方所调用

RPC中是通过网络服务协议向远程主机发送请求,请求包含了一个参数集和一个文本值,通常形成“classname.methodname(参数集)”的形式。RPC远程主机就去搜索与之相匹配的类和方法,找到后就执行方法并把结果编码,通过网络协议发回

  • 使用语言范围不同

RMI只用于Java

RPC是网络服务协议,与操作系统和语言无关

  • 调用结果返回形式不同

Java是面向对象的,所以RMI的调用结果可以是对象类型或者基本数据结构

RMI的结果同一由外部数据表示(External Data Represertation,XDR)语言表示,这种语言抽象了字节序类和数据类型结构之间的差异

什么是 Web Service(Web服务)

Web service是一个平台独立的,低耦合的,自包含的、基于可编程的web的应用程序,可使用开放的XML(标准通用标记语言下的一个子集)标准来描述、发布、发现、协调和配置这些应用程序,用于开发分布式的互操作的应用程序。

WEB容器主要有哪些功能? 并请列出一些常见的WEB容器名字

  1. 提供Servlet程序编写API
  2. 提供Servlet程序运行时环境

常见的容器有:Apache、IIS、Tomcat、Resin

一个”.java”源文件中是否可以包含多个类(不是内部类)?有什么限制?

可以的,但是一个.java源文件可以包含多个类,但是只允许有一个public类,并且类名必须和文件名一致

关于每个编译单元只能有一个public类,也就是表示每个编译单元只能有一个公开的接口,而这个接口由public类来表示。我们可以根据需要在这个俄文件里面添加多个提供辅助功能的package权限的类。但是如果这个编译单元里面有两个或两个以上的public类的话,程序就会不知道从哪里导入,编译器就会报错

请简述 Servlet 的生命周期及其相关的方法

  1. 构造器 只有第一次请求Servlet时,创建Servlet的实例,调用构造器,这说明Servlet是单实例的
  2. init() 只被调用一次,在创建好示例后立即被调用,用于初始化当前Servlet
  3. service()被多次调用,每次请求都会调用service方法,实际用于响应请求的
  4. destroy() 只被调用一次,在当前Servlet所在的WEB应用能够被卸载前调用,用于释放当前Servlet所占有的资源

请简述一下 Ajax 的原理及实现步骤

Ajax的原理简单来说通过XmlHttpRequest对象来向服务器发异步请求,从服务器获得数据,然后用javascript来操作DOM而更新页面

get请求:

  1. 创建一个XMLHttpRequest对象
  2. 调用该对象的open方法
  3. 设置回调函数onreadystatechange = callback
  4. send

post请求:

  1. 创建一个XMLHttpRequest对象
  2. 调用该对象的open方法
  3. 调用setRequestHeader(“Content-Type”, “application/x-www-form-urlencoded”);
  4. 设置回调函数onreadystatechange = callback
  5. send

什么是CORBA?用途是什么?

CORBA(Common Object Request Broker Architecture)公共对象请求代理体系结构

用途:

  • 存取来自现行桌面应用程序的分布信息和资源;
  • 使现有业务数据和系统成为可供利用的网络资源;
  • 为某一特定业务用的定制的功能和能力来增强现行桌面工具和应用程序;
  • 改变和发展基于网络的系统以反映新的拓扑结构或新资源;

什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”

java虚拟机是执行字节码文件(.class)的虚拟机进程

因为不同的平台装有不同的JVM,它们能够将相同的.class文件,解释成不同平台所需要的机器码

java源程序不是直接编译成机器码,而是二次编译的。第一次java源程序被javac编译成.class文件(这个文件和平台无关)。第二次,.class文件被JVM中的解释器编译,解释执行为不同平台所需要的机器码

什么是正则表达式?用途是什么?哪个包使用正则表达式来实现模式匹配

正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个"规则字符串",这个"规则字符串"用来表达对字符串的一种过滤逻辑。Java的java.util.regex包

什么是懒加载(Lazy Loading)

是为了为了加快在系统的响应速度而出现的,它在最大程度上减少了服务器端的资源耗用

实现原理:先将img标签中的src链接设为同一张图片(空白图片),将其真正的图片地址存储再img标签的自定义属性中(比如data-src)。当js监听到该图片元素进入可视窗口时,即将自定义属性中的地址存储到src属性中,达到懒加载的效果。

什么是尾递归?

递归调用是整个函数体中最后执行的语句且它的返回值不属于表达式的一部分时,尾递归方式的特点是在回归过程中不用做任何操作,尾递归占用的栈内存是恒定的

备注:问题整理来源于唐尤华

今天就先更新到这里,当然光靠这些就去面试还是不行的,要多看书多写代码加深理解呢~