java面试题

java面试题

最近在面试java开发工程师,虽然面试的结果不重要,但是过程还是很重要的,我觉得有必要记录下来。下面是我总结的一些java笔试题,希望能帮到大家。

基础题:

  1. 问:jvm

:JVM是Java Virtual Machine(Java虚拟机)的缩写。

  1. JRE/JDK/JVM是什么关系

:JRE(JavaRuntimeEnvironment,Java运行环境),也就是Java平台。所有的Java 程序都要在JRE下才能运行。普通用户只需要运行已开发好的java程序,安装JRE即可。

JDK(Java Development Kit)是程序开发者用来来编译、调试java程序用的开发工具包。JDK的工具也是Java程序,也需要JRE才能运行。为了保持JDK的独立性和完整性,在JDK的安装过程中,JRE也是 安装的一部分。所以,在JDK的安装目录下有一个名为jre的目录,用于存放JRE文件。

JVM(JavaVirtualMachine,Java虚拟机)是JRE的一部分。它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。JVM有自己完善的硬件架构,如处理器、堆栈、寄存器等,还具有相应的指令系统。Java语言最重要的特点就是跨平台运行。使用JVM就是为了支持与操作系统无关,实现跨平台。

  1. JVM运行时数据区


第一块:PC寄存器
第二块:JVM栈
第三块:堆(Heap)
第四块:方法区域(Method Area)
第五块:运行时常量池(Runtime Constant Pool)
第六块:本地方法堆栈(Native Method Stacks)

4.问:spring ioc的大致原理?

答:从XMLBeanDefinitionReader解析BeanDefinition到getBean,createBean的操作流程以及如果处理循环依赖等讲了一遍。

  • 定位到外部配置的Bean的资源文件。创建并且载入DefaultListableBeanFactory(即BeanFactory),根据DefaultListableBeanFactory创建XMLBeanDefinitionReader,用于读取xml配置文件信息。

  • 解析外部配置的Bean的资源文件。创建BeanDefinitionDelegate代理类

  • 初始化IOC容器。

  • 装配Bean。

  • 通过高级IOC容器(上下文)getBean获取程序需要的Bean。

5.问:hashMap为什么不是线程安全的。
答:1、查看hashMap的源码,因为get set等方法都没有加锁,或者没有保证并发操作时的原子性 有序性 可见性。
2、因为hashmap在扩容时,会发生死循环。

6.分布式系统了解吗?

  • 分布式系统是由一组通过网络进行通信、为了完成共同的任务而协调工作的计算机节点组成的系统。

  • 分布式系统的出现是:为了用廉价的、普通的机器完成单个计算机无法完成的计算、存储任务。

  • 其目的是:利用更多的机器,处理更多的数据。

  • 系统架构层面:集群+分布式   多机演变

  • 适用于:大型网站架构

  • 分布式系统分为:分布式计算(computation)与分布式存储(storage)。计算与存储是相辅相成的,计算需要数据,要么来自实时数据(流数据),要么来自存储的数据;而计算的结果也是需要存储的。

  • 集群:多人一起作同样的事,同一个业务,部署在多个服务器上 。

  • 分布式 :多人一起作不同的事,一个业务拆分为多个子业务,部署在多个服务器上。

7.问:集合相关知识
答:需要认真去看集合相关源码,特别是hashmap的存储结构,链表散列,key 的 hashCode。

8. 问:数据库相关知识,联合索引在哪种情况下有效。索引的原理。如何分析一条慢sql慢在哪里。
答:联和索引,查询时做左匹配(like ‘zhang%’),避免全表扫描,索引字段要尽量的小。
如果一个表中的数据在查询时有多个字段总是同时出现则这些字段就可以作为复合索引,形成索引覆盖可以提高查询的效率。表经常更新不适合。原理:b+树,索引的最左匹配特性,索引字段要尽量的小。
开启慢查询日志,设置超过几秒为慢SQL,抓取慢SQL;通过explain对慢SQL分析(重点);show profile查询SQL在Mysql服务器里的执行细节和生命周期情况。
9. 问:java8有哪些新特性,该公司使用java8
答:Lambda 表达式,Stream API,LocalDate、LocalTime、LocalDateTime 类。
Lambda表达式可由逗号分隔的参数列表、->符号和语句块组成。
java.util.Stream API用于操作数据源(集合、数组等)所生成的元素序列

10. 问:多线程。
答:问线程直接怎么数据联系。
1、构造方法传递数据
2、通过变量和方法传递数据
3、通过回调函数传递数据。

11. 问:hashmap的原理,是否线程安全,如何转换成线程安全?
答:链表散列,通过 key 的 hashCode得到hash值,线程不安全,Hashtable线程安全,但效率低,因为是Hashtable是使用synchronized的。Map本身的方法进行加锁,加锁的对象是Segment 的数组。
12. 问:关于mysql的高可用方案。
答:主要聊了MHA,MMM两种实现方式,并聊了两者的区别和优缺点。
面试问到了Spring核心的IOC/AOP原理,Java常用…
面试官的问题:

13. 问:http协议中request.handler包含什么数据。
答:最后一次页面缓存的时间,还有客户端上下文环境,还有cookie,数据长度等等。

14. 计算二叉树的深度,最后一道要用递归
二分法
递归算法:

function binarySearch(arr,low,high,key){
	if(low>high){return -1;}
	var mid=Math.floor((low+high)/2);
	if(key==arr[mid]){
		return mid;
	}else if(key<arr[mid]){
		high=mid-1;
		return binarySearch(arr,low,high,key);
	}else{
		low=mid+1;
		return binarySearch(arr,low,high,key);
	}

普及一下树的算法:
先序遍历:按照根节点->左子树->右子树的顺序访问二叉树
中序遍历:按照左子树->根节点->右子树的顺序访问
后序遍历:遍历左子树->遍历右子树->访问根节点;

//求树的深度

int TreeDeep(Bitree T) { 
int deep=0;
 if(T) { 
int leftdeep=TreeDeep(T->lchild);
 int rightdeep=TreeDeep(T->rchild); 
deep=leftdeep>=rightdeep?leftdeep+1:rightdeep+1; 
}
 	return deep; 
}

//先序遍历

void preOrder(Bitree T) {
if(T==NULL) 
return ; 
else { 
printf("%c",T->data); 
preOrder(T->lchild); 
preOrder(T->rchild); 
} 
}

15. 手写选择排序
选择排序:在未排序序列中找到最小(大)元素,存放到排序序列的起始位置

public static void bubbleSort(int array[]){
		int len=array.length;
	    for (int i=0 ; i<len-1 ; i++){
	        for(int j=0 ; j<len-1-i ; j++){
	            if(array[j]>array[j+1]){
	                int temp = array[j];
	                array[j] = array[j+1];
	                array[j+1] = temp;
	            }
	        }
	    }
	    
	}

16. Vue.js基本语法

<div id="app">
  {{ msg }}
</div>
//script
new Vue({
  el:"#app",//代表vue的范围
  data:{
    msg:'hello Vue' //数据
  }
})

17. 什么是Spring MVC ?简单介绍下你对springMVC的理解?
:Spring MVC是一个基于MVC架构的用来简化web应用程序开发的应用开发框架,它是Spring的一个模块,无需中间整合层来整合 ,它和Struts2一样都属于表现层的框架。在web模型中,MVC是一种很流行的框架,通过把Model,View,Controller分离,把较为复杂的web应用分成逻辑清晰的几部分,简化开发,减少出错,方便组内开发人员之间的配合。

18. SpringMVC的流程?
(1)用户发送请求至前端控制器DispatcherServlet;
(2) DispatcherServlet收到请求后,调用HandlerMapping处理器映射器,请求获取Handle;
(3)处理器映射器根据请求url找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet;
(4)DispatcherServlet通过HandlerAdapter处理器适配器调用处理器;
(5)执行处理器(Handler,也叫后端控制器);
(6)Handler执行完成返回ModelAndView;
(7)HandlerAdapter将Handler执行结果ModelAndView返回给DispatcherServlet;
(8)DispatcherServlet将ModelAndView传给ViewResolver视图解析器进行解析;
(9)ViewResolver解析后返回具体View;
(10)DispatcherServlet对View进行渲染视图(即将模型数据填充至视图中)
(11)DispatcherServlet响应用户。

19. 问 :jquery转换为jquery对象.
:jq对象.get[0]方法即可.

var obj=document.getElementById('obj');//js对象
var obj=$(obj);//jquery对象

jquery对象转为js对象
jquery对象转为js对象有两种方法:[index]和get(index)。
具体详情请查看我的博客:https://blog.csdn.net/weixin_43287508/article/details/87695292

20. 问:如何优化数据库。
1、优化索引、sql语句、分析慢查询
2、设计表的时候严格根据数据的设计规范来设计数据库
3、使用缓存,吧经常访问到的数据而且不需要变化的数据放到缓存中
4、使用固态硬盘
5、采用MYSQL内部自带的表分区技术,吧数据分层到不同的文件中,能够提高餐盘的读写效率
6、垂直分表,吧一些不经常用到的数据放到一个表中,节约磁盘的I/O
7、主从分离读写,采取主从复制把数据库的读操作和写操作分离出来
8、数据库分表分机器(数据特变大的),主要的原理就是数据路由
9、选择合适的表引擎,对参数地上的优化
10、进行加购级别的缓存,静态化和分布式。
11、不采用全文索引吗,用什么搜什么
12、采用更快的处分方式,例如NoSql储存经常访问的数据

21. 问:List有什么方法。
答:add,get,iterator();
利用Iterator 类和while方法

Iterator it1 = list.iterator();
while(it1.hasNext()){
System.out.println(it1.next());
}

22. 问:熟悉ssh框架吗?
答:Struts 的MVC设计模式可以使我们的逻辑变得很清晰,主要负责表示层的显示。
Spring 的IOC和AOP可以使我们的项目在最大限度上解藕。
hibernate的就是实体对象的持久化了, 数据库的封装。

23. 问:MVC模型?
答:View层是界面,Controller层是业务逻辑,Model层是数据库访问。

24. 问:单例模式类的特征?
单例模式有以下特点:
  1、单例类只能有一个实例。
  2、单例类必须自己创建自己的唯一实例。
  3、单例类必须给所有其他对象提供这一实例。
  
25. 问 对于SSM框架的理解。
答 SSM是Spring MVC, Spring,Mybatis的整合,是标准的MVC模式,整个系统划分为表示层,Controller控制层,Service服务层,DAO持久层。Spring MVC 负责请求的转发和视图的管理,Spring 负责业务对象的管理,Mybatis 作为数据对象的持久引擎。

26. 问 ORACLE的存储过程等应用。
答 会编写即可。

create or replace procedure find_emp ( emp_no in number := 7900, value2 out number)
      as
          empname varchar2(20);
      begin
          select  ename into empname from  emp  where
              empno = emp_no;              
          dbms_output.put_line('雇员姓名是 ' || empname);
      exception
      when no_data_found then  dbms_output.put_line('雇员编号未找到');
     end find_emp;

27. ER图
概念:E-R图也称实体-联系图(Entity Relationship Diagram),提供了表示实体类型、属性和联系的方法,用来描述现实世界的概念模型。

构成:
ER图有实体(entity)、属性(attribute)、关系(relationship)三部分。
用“矩形框”表示实体型,矩形框内写明实体名称;
用“椭圆框”表示实体的属性,将属性名记入框中;
用”菱形框“表示实体型之间的关系,在菱形框内写明关系名。
用”实心连线“表示:实体与属性之间;实体与联系之间;联系与属性之间用直线相连,并在直线上标注联系的类型。

关联关系的一般性约束
一对一联系(1 ∶1)
一对多联系(1 ∶N)
多对多联系(M ∶N)

题目:
一个学生可选修多门课,一门课有若干学生选修;
一个教师可讲授多门课,一门课只有一个教师讲授;
一个学生选修一门课,仅有一个成绩。
学生的属性有学号、学生姓名;教师的属性有教师编号,教师姓名;课程的属性有课程号、课程名。

答案:在这里插入图片描述28. Jdk和虚拟机JVM的关系?
  (1)JDK(Java Development Kit)是针对Java开发员的产品,是整个Java的核心,包括了Java运行环境JRE、Java工具和Java基础类库。
  (2)Java Runtime Environment(JRE)是运行JAVA程序所必须的环境的集合,包含JVM标准实现及Java核心类库。
  (3)JVM是Java Virtual Machine(Java虚拟机)的缩写,就是我们常说的java虚拟机,它是整个java实现跨平台的最核心的部分,所有的java程序会首先被编译为.class的类文件,这种类文件可以在虚拟机上执行。

29. Servlet和JSP的区别和联系
  (1)Servlet是一个特殊的java程序,它运行于服务器的JVM中,能够依靠服务器的支持向浏览器提供显示信息。
  (2)JSP本质上是servlet的一种简易形式,JSP会被服务器处理成一个类似于Servlet的Java程序,可以简化页面的生成。
  (3)Servlet和JSP的最主要的不同在于,Servlet的应用逻辑是在Java文件中,并且完全从表示层中的HTML分离开来。而JSP的情况是Java和HTML能够组合成一个扩展名为.JSP的文件
  (4)JSP侧重于视图,Servlet侧重于逻辑控制。
30. AJAX了解吗?
答:AJAX即“Asynchronous Javascript And XML”(异步JavaScript和XML),是指一种创建交互式网页应用的网页开发技术。通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。传统的网页(不使用 AJAX)如果需要更新内容,必须重载整个网页页面。

$.ajax({  
                 type: "POST",  
                 url: "/login",  
                 contentType: 'application/x-www-form-urlencoded;charset=utf-8',  
                 data: {username:$("#username").val(), password:$("#password").val()},  
                 dataType: "json",  
                 success: function(data){  
                             console.log(data);  
                          },  
                 error:function(e){  
                             console.log(e);  
                 }  
             });

31. 为什么要用Spring MVC,直接用Servlet来实现不就可以了么?
:Spring MVC基于模型-视图-控制器模式实现,它能够帮助你构建像Spring框架那样灵活和松耦合的Web应用程序。
Servlet尽管也能够实现,但是感觉写出来的程序的层次不够清晰,而且代码显示出高耦合,代码冗余度高。

32. 你常用的Linux命令
root用户创建文件夹:mkdir git
进入目录:cd git
查看目录路径:pwd
创建用户:useradd test(test为用户名)
设置密码:passwd test
删除用户:userdel –r test
切换用户:su test(用户名)
浏览目录:ls
删除文件:rm –r 文件名
查看并修改文件:vim 文件名
保存文件:shift+zz

33. Java中使用JDBC连接数据库
1) 加载驱动
2) 创建数据库连接
3) 创建执行sql的语句
4) 执行语句
5) 处理执行结果
6) 释放资源

34. TCP 三次握手和四次挥手
答:TCP的三次握手

  1. 客户端–发送带有 SYN 标志的数据包–一次握手–服务端
  2. 服务端–发送带有 SYN/ACK 标志的数据包–二次握手–客户端
  3. 客户端–发送带有带有 ACK 标志的数据包–三次握手–服务端

TCP的四次挥手:断开一个 TCP 连接需要TCP的四次挥手。

  1. 客户端-发送一个 FIN,用来关闭客户端到服务器的数据传送
  2. 服务器-收到这个 FIN,它发回一 个 ACK,确认序号为收到的序号加1 。和 SYN 一样,一个 FIN 将占用一个序号
  3. 服务器-关闭与客户端的连接,发送一个FIN给客户端
  4. 客户端-发回 ACK 报文确认,并将确认序号设置为收到序号加1

34. java有哪些设计模式?

答:设计模式主要分三个类型:创建型、结构型和行为型,总共23种。

常用的设计模式有:

一、Singleton,单例模式:保证一个类只有一个实例,并提供一个访问它的全局访问点
二、Observer,观察者模式:定义对象间一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知自动更新。
三、Flyweight,享元模式

35. 手写一个单例模式

懒汉式:

public static class SingletonDemo {
		private static SingletonDemo instance;

		public SingletonDemo() {
			super();
		}

		public static SingletonDemo getInstance() {
			instance = new SingletonDemo();
			return instance;

		}

	}

饿汉式:

public static class SingletonDemo1 {
		private static SingletonDemo1 instance = new SingletonDemo1();

		public SingletonDemo1() {
			super();
		}

		public static SingletonDemo1 getInstance() {
			return instance;
		}

	}

其中对懒汉式的安全问题,饿汉式的效率优化,详细请参考我的博客:
https://blog.csdn.net/weixin_43287508/article/details/86611916

笔试题:

  1. 启动线程的方法是()
    答:start();

  2. 下面哪些是Thread类的方法()
    A start() B run() C exit() D getPriority()
    答案:ABD
    解析:exit()是System类的方法,如System.exit(0)。

  3. 下面关于java.lang.Exception类的说法正确的是()
    A 继承自Throwable B Serialable C 不正确 D 不正确
    答案:A
    解析:Java异常的基类为java.lang.Throwable,java.lang.Error和java.lang.Exception继承 Throwable。

  4. 错误和异常的区别(Error vs Exception)
    Exception:
    1.可以是可被控制(checked) 或不可控制的(unchecked)。
    2.表示一个由程序员导致的错误。
    3.应该在应用程序级被处理。
    Error:
    1.总是不可控制的(unchecked)。
    2.经常用来用于表示系统错误或低层资源的错误。
    3.如何可能的话,应该在系统级被捕捉。

5. 举例几种常用的异常:
答:
NullPointerException - 空指针引用异常
ClassCastException - 类型强制转换异常。
IllegalArgumentException - 传递非法参数异常
IndexOutOfBoundsException - 下标越界异常
NumberFormatException - 数字格式异常

6. try{} 里有一个 return 语句,那么紧跟在这个 try 后的 finally{} 里的 code 会不会被执行,什么时候被执行,在 return 前还是后?

答:会执行,在方法返回调用者前执行。

7. Java语言如何进行异常处理,关键字:throws、throw、try、catch、finally分别如何使用?

答:Java的异常处理是通过5个关键词来实现的:try、catch、throw、throws和finally。
一般情况下是用try来执行一段程序,如果系统会抛出(throw)一个异常对象,可以通过它的类型来捕获(catch)它,或通过总是执行代码块(finally)来处理。
try用来指定一块预防所有异常的程序;catch子句紧跟在try块后面,用来指定你想要捕获的异常的类型;throw语句用来明确地抛出一个异常;throws用来声明一个方法可能抛出的各种异常(当然声明异常时允许无病呻吟);finally为确保一段代码不管发生什么异常状况都要被执行。

8. spring框架中的单例Beans是线程安全的么?

答:Spring的单例bean是线程安全的。
Spring框架并没有对单例bean进行任何多线程的封装处理。大部分的Spring bean并没有可变的状态(比如Serview类和DAO类),所以在某种程度上说Spring的单例bean是线程安全的。如果你的bean有多种状态的话(比如 View Model 对象),就需要自行保证线程安全。

解决办法:将多态bean的作用域由“singleton”变更为“prototype”。

<bean id="testManager" class="com.sw.TestManagerImpl" scope="singleton" />  
  
<bean id="testManager" class="com.sw.TestManagerImpl" scope="prototype" />

数据库题:

面试经常问到的:

  1. 你在项目中碰到过什么问题 你是怎么解决的
    答:之前在做货品管理项目的时候,涉及到进销存单据的查询,会遇到查询很慢,甚至查询失败的情况,我一般都会查阅自己写的SQL,并做一定的性能优化。
    我之前写过MySql、SQLServer、Oracle 数据分页查询,有兴趣可以查看我的博客:
    http://www.javashuo.com/article/p-uajaogxn-vz.html

要提高SQL查询效率where语句条件的先后次序应如何写 ,我们要做到不但会写SQL,还要做到写出性能优良的SQL语句。
有兴趣可以查看我的博客:https://blog.csdn.net/weixin_43287508/article/details/86627383

  • SELECT子句中避免使用‘*’:
  • 查询时使用数据库分页
  • 事务处理(避免插入数据失败或者锁表):
  • 使用表的别名(Alias):
  • WHERE子句中的连接顺序:

2. 北上广深的工作压力你怎么看?
答:

  • 竞争越大我们成长我们的空间越大。

  • 我爸妈也比较支持我乘着年轻出去闯闯见见世面,不要一辈子局限在一个小的空间,像他们一直对我寄予很大的期望希望我能有一个很大的平台能够实现自己,他们对我期望。

  • 俗话说“男儿志在四方”现在男孩子压力很大,所以更要我们在年轻时去一个遍地机遇的地点去追寻我们所想达到的高度。

3. 简单评价你的优缺点!
答:我自身的优点是:做人比较诚实憨厚,有着较强的集体荣誉感和责任心,能坚决完成自己分内的事,并且有一定追求完美的的心理;
自身的缺点是:性格比较耿直,为人处事不太喜欢遮遮掩掩,但仅仅只是在面对原则性问题上固执。

4. 你还有什么问题想问的吗?
第一:可以问面试官你所应聘的部门有多少人员?
基本上根据这个部门员工的人数,你就可以大致了解他们的实力和规模,甚至是预测出他们这个部门目前处于一个什么样的水平和状态。比如:如果是一个售后部门,面试官说目前该部门有两名员工,算上你三个,那就说明这个公司的客户数量不是那么多,那他们的营收状况是否有点悬呢?公司还能维持下去多久?或者是客户很多,那该部门的员工平时工作任务就会比较繁重,加班的情况估计也是很常见。这些都是可以帮助你分析一下,是否到这家公司就职的因素。

第二:问下你应聘部门员工的待遇一般处于什么样一个水平?
这个一般得不到准确的数据,但是可以得到一个大致的范围,这样对你之后的工作待遇,你心里也就提前有一个底了,是去是留,你自己根据自身情况去把握。

第三:问下公司员工的薪资是如何规定的?
基本可以问出来,该公司是否有一个合理、完善的薪酬体系,有完善薪酬体系的公司,面试官会告诉你如何晋升、如何涨工资、如何评比、如何激励、如何处罚等等,你也可以自己问他。如果没有完善的薪酬体系,说明该公司的规章制度还很不完善,以后工作过程中你的薪酬很可能就是老板一句话或者上级领导一句话的事情,而没有任何合理、客观的依据作为参考,这类公司大部分都是人治,而不是法治,至于人治的公司有什么问题,相信大家都会多少知道一点。后期,我也可以给大家分享一下,人治公司到底有哪些深层次的问题。

第四:问下该公司有哪些福利保障?
当然,北上广深,那基本上都是双休,有加班费,有节假日、有社保。但是,对于二三线城市的求职者来讲,这些待遇很多城市根本做不到,只有少量有规模和实力的公司才会给你提供,大部分还都是在这方面很不完善,更有一些公司更是连正式合同都没有,你的去留都是老板一句话的事情,所以,如果你在意这些,一定要问清楚,包括逢年过节,年终奖的事情都要问,要不然最后肯定会让你寒心的。

第五:贵公司对新入公司的员工有没有什么培训项目,我可以参加吗?或者说贵公司的晋升机制是什么样的?

5. 你对加班的看法?
答:如果是工作需要我会义不容辞加班,我现在单身,没有任何家庭负担,可以全身心的投入工作。但同时,我也会提高工作效率,减少不必要的加班。

6. 在完成某项工作时,你认为领导要求的方式不是最好的,自己还有更好的方法,你应该怎么做?

答:①.原则上我会尊重和服从领导的工作安排,同时私底下找机会以请教的口吻,婉转地表达自己的想法,看看领导是否能改变想法。
②如果领导没有采纳我的建议,我也同样会按领导的要求认真地去完成这项工作。③.还有一种情况,假如领导要求的方式违背原则,我会坚决提出反对意见,如领导仍固执己见,我会毫不犹豫地再向上级领导反映。

7. 谈谈你对跳槽的看法?
答:①正常的“跳槽”能促进人才合理流动,应该支持。
②频繁的跳槽对单位和个人双方都不利,应该反对。

8. 最能概括你自己的三个词是什么?
答:我经常用的三个词是:适应能力强,有责任心和做事有始终。

9. 程序员的职业发展规划是什么? 答: 在进入公司3年之内,我会努力专研Java相关技术,熟能生巧。 在3到5年内,我会帮助其他新人,让他们也能够更好地融入这个团队。 5年以后,我会更加努力,争取往项目经理方向发展!