java-面试题必备
多线程
进程和线程
进程:正在运行的程序。也就是程序所占用的内存空间。
线程:线程(thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一个进程可以开启多个线程。
进程与线程的关系:一个操作系统中可以有多个进程,一个进程中可以有多个线程,每个进程有自己独立的内存,每个线程共享一个进程中的内存,每个线程又有自己独立的内存。(重要)
设计模式
单例模式(懒汉式单例)
- 延迟加载 和 线程安全
1 /单例设计模式 懒汉式 2 //面试重点: 延迟加载 + 线程安全 3 public class Test4_MySingle2 { 4 public static void main(String[] args) { 5 MySingleton s1 = MySingleton.getSingleton(); 6 MySingleton s2 = MySingleton.getSingleton(); 7 System.out.println(s1 == s2); 8 } 9 } 10 11 // 创建类,保证全局只有唯一实例 12 class MySingleton { 13 // 1、私有化构造方法 14 private MySingleton() { 15 } 16 // 2、在类的内部创建对象 -- 延迟加载!!! 17 static private MySingleton single; // 初始化不创建对象,需要时才创建 18 // 3、提供公共的访问方法 19 //synchronized修饰,是因为共享资源single被多条语句(3条)操作,就会存在线程安全隐患,所以变成同步的,牺牲效率提高安全 20 synchronized static public MySingleton getSingleton() { 21 // synchronized (this) { 22 if (single == null) { 23 single = new MySingleton(); 24 } 25 return single; 26 // } 27 } 28 }
Maven
Maven的三种仓库,以及每种仓库的作用?
Maven的三种仓库:本地仓库、镜像仓库(私服)、中央仓库(公服)。
本地仓库:存放项目所需要的的jar包及插件的目录,其实质就是硬盘上的一个目录。
镜像仓库(私服):镜像仓库其实就是配置下载jar包及插件的网址。当项目中需要依赖jar包,可以再pom.xml文件中添加jar包对应的坐标,如果本地仓库没有,就会去镜像仓库下载,镜像仓库没有就会到中央仓库下载。
中央仓库:是面向全球用户下载项目依赖jar及插件的网址,一般下载效率较低。
Maven项目中是如何管理jar包的?
该问题可以从三方面回答,在Maven项目中如何引入jar包、项目中引入的jar包在哪里、如果引入的jar包在本地仓库没有会怎样?
1.Maven项目中如何引入jar包
项目所依赖的jar包,只需要在项目中的pom.xml文件内添加jar包对应的坐标即可将jar引入项目,该坐标有GroupId、ArtifactID和Version组成。
2.项目中引入的jar包在哪里
在pom.xml文件添加的servlet的jar包坐标,添加的仅仅是一个jar对应的坐标,而这个jar包存放在本地仓库(默认在C:\User\{当前用户}\.m2\repository)下,本地仓库的位置修改后在修改后的指定位置。
3.如果引入的jar包在本地仓库没有会怎样?
如果引入的jar包在本地仓库没有,如果没有配置镜像仓库(私服)地址,直接从中央仓库(公服)下载到本地仓库;如果配置的有镜像仓库(私服)地址,会优先在从配置的镜像仓库(私服)地址对应的jar包到本地仓库,如果镜像仓库(私服)没有项目所依赖的jar包,则再从中央仓库中下载到镜像仓库,再从镜像仓库下载本地仓库。
JSP
考察JSP中的JSP注释、Java注释、html注释
<%-- <% out.write( "aaaaa<br/>" ); %> --%> <% //out.write( "bbbbb<br/>" ); %> <!-- <% out.write( "ccccc<br/>" ); %> -->
问题:(1)上面输出的三行内容,在访问时,会显示哪一行内容?
第一行被JSP注释给注释了,JSP注释的内容不会参与翻译,也不会执行,更不会发送给浏览器,也不会在浏览器上显示。
第二行被Java注释给注释了,放在脚本片段中的内容会参与翻译,会将其中的Java代码复制到翻译后的Servlet中,但由于代码被注释了,所以不会执行,也不会发送给浏览器,更不会在浏览器上显示。
第三行被html注释给注释了,html注释在JSP中是模板元素,注释本身会发送给浏览器,注释中的脚本片段会参与翻译,其中的java代码也会执行,也会将内容(ccccc)发送给浏览器,但由于发送到浏览器后的ccccc被html注释包裹,因此也不会显示在浏览器上。
(2)上面输出的三行内容,哪一行会发送到浏览器中?(不管是否显示)
其中第三行内容会发送到浏览器中,但不会显示,因为前后有html注释。
HTTP
谈谈对http的理解
http分为http1.0和http2.0。
http1.0,客户端和服务器之间只能获得一个web资源,使用完断开
http2.0, 客户端和服务器之间可获得多个web资源
当你在浏览器地址栏中输入地址并回车的一瞬间到页面能够展示回来,发生了什么?
当你在浏览器地址输入地址并回车后,首先在当前操作系统找到c盘的host文件中找输入地址对应的ip地址,如果有根据ip地址找对应的服务器,如果没有回告诉系统,系统发起一个DNS请求,到DNS服务器中寻找对应的ip,如果找到返回,没找到提示404。