面试阿里常被问到的十个 Java 面试题

1. 以满分十分来评估本身——你有多擅长 Java?

若是你并不彻底确信你本身或是你对 Java 的熟练程度,那么这会是一个很是棘手的问题。若是有这种状况,你应该把打分调低一点。以后,你大概会获得与你认可的水平相符的问题。所以,假如你给本身满分,却不能回答一个有点难的问题,那将会对你不利。php

2. 阐述 Java 7 和 Java 8 的区别。

实话说,二者有不少不一样。若是你能列出最重要的,应该就足够了。你应该解释 Java 8 中的新功能。想要得到完整清单,请访问官网: Java 8 JDK 。html

你应该知道如下几个重点:java

  • lambda 表达式 ,Java 8 版本引入的一个新特性。lambda 表达式容许你将功能看成方法参数或将代码看成数据。lambda 表达式还能让你以更简洁的方式表示只有一个方法的接口 (称为函数式接口) 的实例。
  • 方法引用, 为已命名方法提供了易于阅读的 lambda 表达式。
  • 默认方法, 支持将新功能添加到类库中的接口,并确保与基于这些接口的旧版本的代码的二进制兼容性。
  • 重复注解, 支持在同一声明或类型上屡次应用同一注解类型。
  • 类型注解, 支持在任何使用类型的地方应用注解,而不只限于声明。此特性与可插入型系统一块儿使用时,可加强对代码的类型检查。

3. 你了解哪些集合类型?

你应该知道如下几个最重要的类型:面试

ArrayList
LinkedList
HashMap
HashSet

以后,你可能会被问到这样一些问题,好比什么时候应该使用此种特定类型,它比其余的好在哪里,它是怎么存储数据的以及隐匿在其后的数据结构是什么。sql

最好的方法是尽量多地了解这些集合类型,由于这类问题几乎是无穷尽的。数据库

4. Object 类包含哪些方法?

这是一个很是常见的问题,用来肯定你对基础知识的熟悉程度。如下是每一个对象都具备的方法:编程

在 java.lang  包中, Object  类位于类层次结构的顶端。每一个类都是  Object  类直接或间接的子类。你使用或编写的每一个类都继承了  Object  类中的实例方法。你并不须要使用这些方法中的任何一种,可是,若是你选择这样作,则可能须要用你的类的特定代码来重写这些方法。如下是本节所讨论的从  Object  类中继承的方法:缓存

  • protected Object clone() throws CloneNotSupportedException  建立并返回此对象的副本。
  • public boolean equals(Object obj)  判断另外一对象与此对象是否「相等」。
  • protected void finalize() throws Throwable  当垃圾回收机制肯定该对象再也不被调用时,垃圾回收器会调用此方法。
  • public final Class getClass()  返回此对象的运行时类。
  • public int hashCode()  返回此对象的散列码值。
  • public String toString()  返回此对象的字符串表示形式。

Object  类的  notify , notifyAll  和  wait  方法都在同步程序中独立运行线程的活动方面发挥了做用,这将在后面的课程中讨论,在此不作介绍。其中有五种方法:安全

public final void notify()
public final void notifyAll()
public final void wait()
public final void wait(long timeout)
public final void wait(long timeout, int nanos)

5. 为何 String 对象是不可变的?

  1. 字符串池 之因此可能,就是由于字符串在 Java 中是不可变的。由此 Java 运行时环境节省了大量堆空间,由于不一样的 String 变量能够引用池中的同一 String 变量。若是 String 不是不可变的, 则字符串驻留( String interning )将是不可能的,由于一旦任一变量更改所引用的String对象的值,它也会反映在其余变量中。
  2. 若是字符串不是不可变的,那么它可能会对应用程序形成严重的安全威胁。例如,数据库用户名和密码都做为 String 传递以获取数据库链接, Socket 编程 的主机和端口信息也是如此。因为字符串是不可变的,所以其值不能被更改。不然,任何黑客均可以篡改其引用的值,这会致使应用程序中的安全问题。
  3. 因为 String 是不可变的,所以它对与 多线程处理 来讲是安全的,而且能够在不一样的线程之间共享单个 String 实例。这避免了为线程安全使用同步;字符串是隐式线程安全的。
  4. 字符串被用在 Java 类加载器中,其不可变性为 类加载器 加载正确的类提供了安全性。不然的话,请考虑这样一个危险的状况,在你尝试加载  java.sql.Connection  类时,你引用的值却被更改成  myhacked.Connection ,而且它能对数据库执行你不须要的操做。
  5. 因为 String 是不可变的,所以在它被建立时其散列码就被缓存,不须要再次计算。这使得它成为映射中键的理想对象,它的处理速度比其余 HashMap  键类型快。这就是为何 String 是  HashMap  中最经常使用的键类型。

为何 Java 中的字符串不可变? 点击这里了解更多。数据结构

6. final,finally,和 finalize 三者之间有什么不一样?

这是我最喜欢的问题。

  • final  关键字用于在多个语境下定义只能分配一次的实体。
  • finally  代码块是用于执行重要代码 (如关闭链接、流等) 的代码块。不管是否处理异常, finally  代码块总会被执行。 finally  代码块紧随  try  代码块或  catch  代码块。
  • 这是在删除或销毁对象以前垃圾回收器总会调用的方法,该方法使得垃圾回收机制可以执行清理活动。

7. 什么是菱形继承问题?

菱形继承问题反映了为何在 Java 中咱们不被容许实现多继承。若是有两个类共同继承一个有特定方法的超类,那么该方法会被两个子类重写。而后,若是你决定同时继承这两个子类,那么在你调用该重写方法时,编译器不能识别你要调用哪一个子类的方法。

咱们把这个问题称为 菱形继承问题 。上图对它做了说明,它也得名于此。

8. 如何使一个类不可变?

我认为这是一个至关困难的问题。您须要对类进行屡次修改,以实现不可变性:在此我向你们推荐一个架构学习交流裙。交流学习裙号:687810532,里面会分享一些资深架构师录制的视频录像

final
private 
setter 
final 
getter 

9. 什么是单例模式?

单例模式是指一个类仅容许建立其自身的一个实例,并提供对该实例的访问权限。它包含静态变量,能够容纳其自身的惟一和私有实例。它被应用于这种场景——用户但愿类的实例被约束为一个对象。在须要单个对象来协调整个系统时,它会颇有帮助。

10. 什么是依赖注入?

这是你必须知道的首要问题, 不管你是使用 Java EE 仍是 Spring 框架。你能够看看个人文章,其中进一步地解释了这一点: 什么是依赖注入?

总结

在本文中,咱们讨论了最多见的十个 Java 面试题 ——在我看来这是根据个人经验总结出的时下最重要的问题。若是你了解这些问题,我相信你能在面试中得到很大的优点。

相关文章
相关标签/搜索