今天我们一起来了解一下java高级工程师面试过程中经常遇见的面试题及它们的参考答案吧。
1、面向对象的特征有哪些方面?
- 抽象:软件抽象是将一类对象的共同特征总结出来构造类的过程,包括数据抽象和行为抽象两方面。抽象只关注对象有哪些属性和行为,并不关注这些行 为的细节是什么。
- 封装:定义与自己相关的属性和方法,隐藏实现的细节,只向外界提供最简单的编程接口。
- 继承:继承是从已有类得到继承信息创建新类的过程。继承可以提高代码的重用性,JAVA中只允许单一继承。
- 多态性:不同子类型的对象对同一消息作出不同的响应。方法重载 (overload)实现的是编译时的多态性(也称为前绑定或静态多态),而方法 重写(override)实现的是运行时的多态性(也称为后绑定或动态多态)。一般多态通过方法重写来实现。
2、Java有没有goto?
答:goto 是Java中的保留字,在目前版本的Java中没有使用。
3、Math.round(11.5) 等于多少?Math.round(-11.5)等于多 少?
答:Math.round(11.5)的返回值是12,Math.round(-11.5)的返回值是-11。四 舍五入的原理是在参数上加0.5然后进行下取整。
4、switch 是否能作用在byte 上,是否能作用在long 上,是否能作用在 String上?
答:在Java 5以前,switch(expr)中,expr只能是byte、short、char、int。 从Java 5开始,Java中引入了枚举类型,expr也可以是enum类型,从Java 7开 始,expr还可以是字符串(String),但是长整型(long)在目前所有的版本 中都是不可以的。
5、构造方法(constructor)是否可被重写(override)?
答:构造器不能被继承,因此不能被重写,但可以被重载。
6、两个对象值相同(x.equals(y) == true),但却可有不同的 hash code,这句话对不对?
答:不对,如果两个对象x和y满足x.equals(y) == true,它们的哈希码(hash code)应当相同。Java对于eqauls方法和hashCode方法是这样规定的:
(1)如果 两个对象相同(equals方法返回true),那么它们的hashCode值一定要相同;
(2)如果两个对象的hashCode相同,它们并不一定相同。
7、char 型变量中能不能存贮一个中文汉字,为什么?
答:char类型可以存储一个中文汉字,因为Java中使用的编码是Unicode(不选 择任何特定的编码,直接使用字符在字符集中的编号,这是统一的唯一方法),一个char类型占2个字节(16比特),所以放一个中文是没问题的。
8、Java 中会存在内存泄漏吗,请简单描述。
答:理论上不会,Java有垃圾回收机制(GC)不会存在内存泄露问题(); 然而在实际开发中,可能会存在无用但可达的对象,这些对象不能被GC回收, 因此也会导致内存泄露的发生。
9、抽象的(abstract)方法是否可同时是静态的(static),是 否可同时是本地方法(native),是否可同时被synchronized修 饰?
答:都不能。抽象方法需要子类重写,而静态的方法是无法被重写的,因此二者是矛盾的。本地方法是由本地代码(如C代码)实现的方法,而抽象方法是没 有实现的,也是矛盾的。synchronized和方法的实现细节有关,抽象方法不涉 及实现细节,因此也是相互矛盾的。
10、JDBC 编程的步骤?
(1) 注册驱动;
Class.forName("com.mysql.jdbc.Driver");
(2) 获取连接对象 Connection;
String url = "jdbc:mysql://localhost:3306/mydatabase";
String user = "root";
String password = "123456";
Connection conn=DriverManager.getConnection(url,user,pwd)
(3) 创建 Statement 对象;
Statemt statement=conn.createStatement();
(4) 运行 SQL 语句;
String sql = "select t.id, t.name where t_user";
ResultSet resultSet = statement.executeQuery(sql);
如果是DML语句则返回的是int类型值,代表影响数据库中记录的条数
String sql = "update t_user t set t.name='Tom' where t.id=1";
int i = statement.executeUpdate(sql);
(5) 处理结果;
while(resultSet.next()){
int id = resultSet.getInt(1);
String name = resultSet.getString(2);
}
(6) 关闭连接释放资源。
if(resultSet != null)
resultSet.close();
if(statement != null)
statement.close();
if(connection != null)
connection.close();
11、事务的 ACID 是什么?事务并发会产生哪些问题?
ACID 表示事务的特性:原子性、一致性、隔离性和持久性。
原子性(Atomic):事务中各项操作,要么全做要么全不做,任何一项操作的失败都会导致整个事务的失败;
一致性(Consistent):事务结束后系统状态是一致的;
隔离性(Isolated):并发执行的事务彼此无法看到对方的中间状态;
持久性(Durable):事务完成后所做的改动都会被持久化,即使发生灾难性的失败。通过日志和同步备份可以在故障发生后重建数据。
12、什么是脏读、幻读、不可重复读。
脏读(Dirty Read):A 事务读取 B 事务尚未提交的数据并在此基础上操作, 而 B 事务执行回滚,那么 A 读取到的数据就是脏数据。
幻读(Phantom Read):事务 A 重新执行一个查询,返回一系列符合查询条 件的行,发现其中插入了被事务 B 提交的行。
不可重复读(Unrepeatable Read):事务 A 重新读取前面读取过的数据,发 现该数据已经被另一个已提交的事务 B 修改过了。
13、数据库性能优化有哪些方式?
SQL 优化:
尽量避免使用 SELECT *;
只查询一条记录时使用 limit 1;
使用连接查询代替子查询;
尽量使用一些能通过索引查询的关键字。
表结构优化:
尽量使用数字类型字段,提高比对效率;
长度不变且对查询速度要求高的数据可以考虑使用 char,否则使用 varchar;
表中字段过多时可以适当的进行垂直分割,将部分字段移动到另外一 张表;
表中数据量过大可以适当的进行水平分割,将部分数据移动到另外一张 表。
其它优化:
对查询频率高的字段适当的建立索引,提高效率;
根据表的用途使用合适 的数据库引擎;
读写分离。
14、JDBC中存在哪些不同类型的锁?
从广义上讲,有两种锁机制来防止多个用户同时操作引起的数据损坏。
乐观锁-只有当更新数据的时候才会锁定记录。
悲观锁 - 从查询到更新和提交整个过程都会对数据记录进行加锁。
15、请你谈下JVM内存模型。
思路: 给面试官画一下JVM内存模型图,并描述每个模块的定义,作用,以及可能会存在的问题,如栈溢出等。
答:
1)程序计数器: 当前线程所执行的字节码的行号指示器,用于记录正在执行的虚拟机字节指令地址,线程私有。
2)虚拟机栈: 存放基本数据类型、对象的引用、方法出口等,线程私有。
3)本地方法栈: 和虚拟栈相似,只不过它服务于本地(Native)方法,线程私 有。
4)堆: java内存最大的一块,所有对象实例、数组都存放在java堆,GC回收的 地方,线程共享。
5)方法区: 存放已被加载的类信息、常量、静态变量、即时编译器编译后的代码数据等。 (即永久带),回收目标主要是常量池的回收和类型的卸载,各线 程共享
16、 JVM内存为什么要分成新生代,老年代,持久代。新生代中为 什么要分为Eden和Survivor。
思路: 先讲一下JAVA堆,新生代的划分,再谈谈它们之间的转化,相互之间一些参数的配置(如: –XX:NewRatio,–XX:SurvivorRatio等),再解释为什么要这样划分,最好加一点自己的理解。
(堆的内存由-Xms指定,默认是物理内存的1/64;最大的内存由-Xmx指定,默认是物理内 存的1/4。
默认空余的堆内存小于40%时,就会增大,直到-Xmx设置的内存。具体的比例可以由XX:MinHeapFreeRatio指定 空余的内存大于70%时,就会减少内存,直到-Xms设置的大小。具体由XX:MaxHeapFreeRatio指定。
在新生代进行的GC叫做minor GC,在老年代进行的GC都叫major GC,Full GC同时作用于新生代和老年代。
minor [ˈmaɪnər]: 较小的;major [ˈmeɪdʒər]:较大的;full [fʊl]:大量的)
答:
1)对象优先分配在Eden区,如果Eden区没有足够的空间时,虚拟机执行一次 Minor GC。
2)大对象直接进入老年代(大对象是指需要大量连续内存空间的对象)。这样 做的目的是避免在Eden区和两个Survivor区之间发生大量的内存拷贝(新生代 采用复制算法收集内存)。
3)长期存活的对象进入老年代。虚拟机为每个对象定义了一个年龄计数器,如果对象经过了1次Minor GC那么对象会进入Survivor区,之后每经过一次 Minor GC那么对象的年龄加1,直到达到阀值对象进入老年区。
4)动态判断对象的年龄。如果Survivor区中相同年龄的所有对象大小的总和大于Survivor空间的一半,年龄大于或等于该年龄的对象可以直接进入老年代。
5)空间分配担保。每次进行Minor GC时,JVM会计算Survivor区移至老年区的对象的平均大小,如果这个值大于老年区的剩余值大小则进行一次Full GC, 如果小于检查HandlePromotionFailure设置,如果true则只进行Monitor GC, 如果false则进行Full GC。
17、 你知道哪几种垃圾收集器,各自的优缺点,重点讲下cms和 G1,包括原理,流程,优缺点。
思路:一定要记住典型的垃圾收集器,尤其cms和G1,它们的原理与区别,涉 及的垃圾回收算法。
答:
1)新时代垃圾收集器
Serial收集器:单线程的收集器,收集垃圾时,必须stop the world,使用复 制算法。Serial [ˈsɪriəl]连续的;
ParNew收集器:Serial收集器的多线程版本,也需要stop the world,复制算法。
Parallel Scavenge收集器: 多线程收集,其余的行为、特点和Serial收集器 一样。parallel [ˈpærəlel] 并行的;
2)老年代垃圾收集器
Serial Old收集器:是Serial收集器的老年代版本,单线程收集器,使用标记 整理算法。
Parallel Old收集器:是Parallel Scavenge收集器的老年代版本,使用多线 程,标记-整理算法。
CMS(Concurrent Mark Sweep) 收集器:是一种以获得最短回收停顿时间为目标的收集器, 标记清除算法,运作过程:初始标记,并发标记,重新标记, 并发清除 ,收集结束会产生大量空间碎片。
3)新时代和老年代收集器
G1收集器: 标记整理算法实现, 运作流程主要包括以下:初始标记,并发标记,最终标记,筛选标记 。 不会产生空间碎片,可以精确地控制停顿。
18、 简单说说你了解的类加载器,可以打破双亲委派么,怎么打 破。
思路:先说明一下什么是类加载器,可以给面试官画个图,再说一下类加载器存在的意义,说一下双亲委派模型,最后阐述怎么打破双亲委派模型。
答:
1)什么是类加载器 类加载器就是根据指定全限定名称将class文件加载到JVM内存,转为Class对象。
启动类加载器:Bootstrap ClassLoader,负责加载存放在JDKjrelib(JDK代表 JDK的安装目录,下同)下,或被-Xbootclasspath参数指定的路径中的,并且能被 虚拟机识别的类库扩 展 类 加 载 器 : Extension ClassLoader , 该 加 载 器 由 sun.misc.Launcher$ExtClassLoader实现,它负责加载DKjrelibext目录中,或者由java.ext.dirs系统变量指定的路径中的所有类库(如javax.*开头的类),开发者可以直接使用扩展类加载器。
应 用 程 序 类 加 载 器 : Application ClassLoader , 该 类 加 载 器 由 sun.misc.Launcher$AppClassLoader 来 实 现 , 它 负 责 加 载 用 户 类 路 径 (ClassPath)所指定类,开发者可以直接使用该类加载器
2) 双亲委派模型 如果一个类加载器收到类加载的请求,它首先不会自己去尝试加载这个类,而是把这个请求委派给父类加载器完成。 每个类加载器都是如此,只有当父加载 器在自己的搜索范围内找不到指定的类时(即ClassNotFoundException),子加载器才会尝试自己去加载。
3) 为什么需要双亲委派模型? 在这里,先想一下,如果没有双亲委派,那么用户是不是可以自己定义一个 java.lang.Object的同名类 , java.lang.String的同名类 ,并把它放到ClassPath 中,那么 类之间的比较结果及类的唯一性将无法保证 ,因此,为什么需要双亲委 派模型? 防止内存中出现多份同样的字节码 4) 怎么打破双亲委派模型? 打破双亲委派机制则不仅 要继承ClassLoader 类,还要重写loadClass和 findClass 方法。
19、你知道哪些JVM性能调优
思路:所谓JVM调优,实际就是2点:
1、对堆内存的调优;2、对GC的优化;
GC优化的两个目标:
1、将进入老年代的对象数量降到最低;
2、 减少 Full GC 的执行时间答: 通常可以使用JVM参数,来调节堆内存大小。
20、Servlet生命周期
1) 加载Servlet web容器负责加载servlet,当web容器启动时或者是在第一次使用这个servlet 时,容器会负责创建servlet实例
2) 初始化 当一个servlet加载后,容器将调用init()方法初始化这个对象,初始化的目的 是为了让servlet在处理客户端请求前完成一些初始化的工作
3) 请求处理 当有请求提交时,servlet将调用service()方法进行处理客户端请求,并且会 根据不同的请求调用不同的doGet()或doPost()方法
4) 销毁 当web容器关闭或检测到一个servlet实例要从服务器中被移除时,容器就会调 用destroy()方法,以便让该实例释放掉所占用的资源
21、Get()与post()的区别?
1) Get是向服务器发送、索取数据的一种请求,而post是向服务器提交数据 的一种请求
2) Get方式传递数据安全性较低,post方式比较安全。但是post方式的执行 效率比get方式要差一些
3) Get请求方式将请求信息放在URL后面,请求信息和URL之间以“?”隔 开,这种请求方式直接将请求信息暴露在URL中; post请求方式将请求信息放置在报文体中,想获得请求信息必须解析报文
22、forward(转发)和redirect(重定向)的区别
1) forward: requset.getRequsetDispatcher(“/***.jsp”).forward(request,response) redirect:response.sendRedirect(“/***.jsp”) 2) forward是服务器端发起的请求;redirect是客户端发起的请求;
3) forward只有一次请求;redirect会产生2次请求。
4) forward数据会同时转发过去;redirect数据不会同时传递过去。
23、什么是cookie?什么是session?session和cookie的区别
1) Cookie是客户端保存用户信息的一种机制,用来记录用户的一些信息,它的过期时间可以任意设置,如果不主动清除,很长一段时间都能保留
2) Session是在无状态的HTTP协议下,服务端记录用户状态时用于标识具 体用户的机制,它是在服务端保存的用来跟踪用户的状态的数据结构,可以保 存在文件、数据库、或者集群中。
3) 他们都是一种会话技术,区别如下
i. Session:
数据存放在服务端,安全(只存放和状态相关的)
session不仅仅是存放字符串,还可以存放对象
session是域对象(session本身是不能跨域的,但可以通过相应技术来解决)
sessionID的传输默认是需要cookie支持的
ii. Cookie
数据存放在客户端,不安全(存放的数据一定是和安全无关 紧要的数据)
cookie只能存放字符串,不能存放对象
cookie不是域对象(Cookie是支持跨域的)
24、JSP的内置对象有哪些,作用是什么
1) Request :本质上就是HttpServletRequest,包含用户端请求的信息, 就是请求对象
2) Response :本质上就是HttpServletResponse,包含服务器传回客户端 的响应信息,就是响应对象
3) Session : 是HttpSession,是一个会话对象,主要用于保存状态
4) Application : 是servletContext,指的的整个web应用
5) Page : 指整个jsp页面,类似this伪对象
6) PageContext : 主要用于管理整个jsp页面
7) Exception : 异常对象,jsp页面上的异常都会封装在这里面
8) Config : 本质上就是servletConfig对象
9) Out :主要用于输出数据
25、request.getAttribute()和request.getParameter()区别
1) 都是HttpServletRequest中的方法,用来传递数据的
2) getParameter():响应的是web客户端向web服务端通过点击链接或 提交按钮传递数据,代表HTTP请求数据;获取的是post/get传递的参数值
getAttribute():是获取域对象中的数据,例如获取request、session 绑定的值
3) getParameter():只能得到String类型数据
getAttribute():可以接受String类型,也可以是对象
26、Servlet安全性问题
1) 因为servlet是单列模式创建的,只实例化一次,同一个servlet可以处理 多个用户请求,当同时有两个用户访问时,则会启动两个负责处理请求的 servlet线程,所以会出现线程安全问题
2) 解决方案:
i. 在servlet中定义变量时,尽量都定义局部变量。在servlet中 负责保存上下文ServletContext和负责处理session对象的HttpSession是线程 不安全的,而负责处理请求的servletRequest是线程安全的
ii. 加锁:用synchronized进行保护,但是要尽量的缩小保护范 围
27、JSP与servlet的区别
1) JSP本质上就是一个简易的servlet,Web容器将JSP代码编译成JVM能识别的java类
2) Jsp更擅长表现于页面显示,servlet更擅长于逻辑控制
28、JavaWeb中四大域对象及作用范围
1) PageContext : 作用范围在整个页面(一个页面)
2) HttpRequest : 作用范围在一次请求
3) HttpSession : 这是JavaWeb的一种会话机制,作用在整个会话中
4) ServletContext :作用范围在整个web应用
以上就是小编整理的java高级工程师面试相关题目及其参考答案啦,关注本站即可了解更多信息。