当前位置: 首页 > news >正文

经常被问到的十个 Java 面试题?你Get了吗?

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

如果你并不完全确信你自己或是你对 Java 的熟练程度,那么这会是一个非常棘手的问题。如果有这种情况,你应该把打分调低一点。之后,你大概会得到与你承认的水平相符的问题。因此,假如你给自己满分,却不能回答一个有点难的问题,那将会对你不利。

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

实话说,两者有很多不同。如果你能列出最重要的,应该就足够了。你应该解释 Java 8 中的新功能。想要获得完整清单,请访问官网:Java 8 JDK。

你应该知道以下几个重点:

lambda 表达式,Java 8 版本引入的一个新特性。lambda 表达式允许你将功能当作方法参数或将代码当作数据。lambda 表达式还能让你以更简洁的方式表示只有一个方法的接口 (称为函数式接口) 的实例。

方法引用,为已命名方法提供了易于阅读的 lambda 表达式。

默认方法,支持将新功能添加到类库中的接口,并确保与基于这些接口的旧版本的代码的二进制兼容性。

重复注解,支持在同一声明或类型上多次应用同一注解类型。

类型注解,支持在任何使用类型的地方应用注解,而不仅限于声明。此特性与可插入型系统一起使用时,可增强对代码的类型检查。

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

你应该知道以下几个最重要的类型:

ArrayList

LinkedList

HashMap

HashSet

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

最好的方法是尽可能多地了解这些集合类型,因为这类问题几乎是无穷尽的。

  1. 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)

  1. 为什么 String 对象是不可变的?

字符串池之所以可能,就是因为字符串在 Java 中是不可变的。由此 Java 运行时环境节省了大量堆空间,因为不同的 String 变量可以引用池中的同一 String 变量。如果 String 不是不可变的, 则字符串驻留(String interning)将是不可能的,因为一旦任一变量更改所引用的String对象的值,它也会反映在其他变量中。

如果字符串不是不可变的,那么它可能会对应用程序造成严重的安全威胁。例如,数据库用户名和密码都作为 String 传递以获取数据库连接,Socket 编程的主机和端口信息也是如此。由于字符串是不可变的,因此其值不能被更改。否则,任何***都可以篡改其引用的值,这会导致应用程序中的安全问题。

由于 String 是不可变的,因此它对与多线程处理来说是安全的,并且可以在不同的线程之间共享单个 String 实例。这避免了为线程安全使用同步;字符串是隐式线程安全的。

字符串被用在 Java 类加载器中,其不可变性为类加载器加载正确的类提供了安全性。否则的话,请考虑这样一个危险的情况,在你尝试加载java.sql.Connection 类时,你引用的值却被更改为myhacked.Connection,并且它能对数据库执行你不需要的操作。

由于 String 是不可变的,因此在它被创建时其散列码就被缓存,不需要再次计算。这使得它成为映射中键的理想对象,它的处理速度比其他HashMap 键类型快。这就是为什么 String 是HashMap 中最常用的键类型。

为什么 Java 中的字符串不可变?点击这里了解更多。

  1. final,finally,和 finalize 三者之间有什么不同?

这是我最喜欢的问题。

final 关键字用于在多个语境下定义只能分配一次的实体。

finally 代码块是用于执行重要代码 (如关闭连接、流等) 的代码块。无论是否处理异常,finally 代码块总会被执行。finally 代码块紧随try 代码块或catch 代码块。

这是在删除或销毁对象之前垃圾回收器总会调用的方法,该方法使得垃圾回收机制能够执行清理活动。

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

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

你错过就亏了的十个 Java 面试题?你Get了吗?
我们把这个问题称为菱形继承问题。上图对它作了说明,它也得名于此。

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

我认为这是一个相当困难的问题。您需要对类进行多次修改,以实现不可变性:

将类声明为final,使其无法被继承。

所有域都用private 修饰,不允许直接访问。

不提供变量的setter 方法。

所有可变域都用final 修饰, 使它的值只能分配一次。

通过构造函数执行深克隆初始化所有域。

对getter 方法获取的对象执行克隆以返回副本,而不是返回实际的对象引用。

  1. 什么是单例模式?

单例模式是指一个类仅允许创建其自身的一个实例,并提供对该实例的访问权限。它包含静态变量,可以容纳其自身的唯一和私有实例。它被应用于这种场景——用户希望类的实例被约束为一个对象。在需要单个对象来协调整个系统时,它会很有帮助。

  1. 什么是依赖注入?

这是你必须知道的首要问题, 无论你是使用 Java EE 还是 Spring 框架。你可以看看我的文章,其中进一步地解释了这一点:什么是依赖注入?
经常被问到的十个 Java 面试题?你Get了吗?
欢迎工作一到五年的Java工程师朋友们加入java/大数据群:714526711
群内提供免费的Java架构学习资料(里面有高可用、高并发、高性能及分布式、Jvm性能调优、Spring源码,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多个知识点的架构资料)合理利用自己每一分每一秒的时间来学习提升自己,不要再用"没有时间“来掩饰自己思想上的懒惰!趁年轻,使劲拼,给未来的自己一个交代!

转载于:https://blog.51cto.com/14207296/2372382

相关文章:

  • linux gcc 静态 动态链接库
  • Apache基金会总结RocketMQ:中国70%的银行核心业务已采用,国内技术人员贡献明显增多...
  • 如何在Kubernetes上运行Apache Flink
  • go package包的使用
  • GC参考手册 —— GC 算法(基础篇)
  • java B2B2C Springboot电子商城系统-路由网关(zuul)
  • 我们用5分钟写了一个跨多端项目
  • Ubuntu MATE 推出树莓派版本
  • 【本人秃顶程序员】SpringBoot基础之banner玩法解析
  • 红米6.0系统设备最完美激活Xposed框架的流程
  • 微软宣布Azure Functions正式支持Java
  • 常用网络设备
  • Mysql5.7 - 一键安装脚本
  • 一、python小功能记录——监听键盘事件
  • note_4.10
  • Android系统模拟器绘制实现概述
  • electron原来这么简单----打包你的react、VUE桌面应用程序
  • GraphQL学习过程应该是这样的
  • java8 Stream Pipelines 浅析
  • JavaScript对象详解
  • js面向对象
  • nodejs调试方法
  • oldjun 检测网站的经验
  • passportjs 源码分析
  • Quartz初级教程
  • redis学习笔记(三):列表、集合、有序集合
  • socket.io+express实现聊天室的思考(三)
  • tab.js分享及浏览器兼容性问题汇总
  • Traffic-Sign Detection and Classification in the Wild 论文笔记
  • 测试开发系类之接口自动化测试
  • 服务器从安装到部署全过程(二)
  • 给新手的新浪微博 SDK 集成教程【一】
  • 更好理解的面向对象的Javascript 1 —— 动态类型和多态
  • 计算机常识 - 收藏集 - 掘金
  • ------- 计算机网络基础
  • 思维导图—你不知道的JavaScript中卷
  • 优化 Vue 项目编译文件大小
  • MiKTeX could not find the script engine ‘perl.exe‘ which is required to execute ‘latexmk‘.
  • 国内唯一,阿里云入选全球区块链云服务报告,领先AWS、Google ...
  • 函数计算新功能-----支持C#函数
  • 没有任何编程基础可以直接学习python语言吗?学会后能够做什么? ...
  • #AngularJS#$sce.trustAsResourceUrl
  • #我与Java虚拟机的故事#连载14:挑战高薪面试必看
  • #中的引用型是什么意识_Java中四种引用有什么区别以及应用场景
  • ( 用例图)定义了系统的功能需求,它是从系统的外部看系统功能,并不描述系统内部对功能的具体实现
  • (4)事件处理——(2)在页面加载的时候执行任务(Performing tasks on page load)...
  • (9)目标检测_SSD的原理
  • (Matlab)基于蝙蝠算法实现电力系统经济调度
  • (poj1.2.1)1970(筛选法模拟)
  • (博弈 sg入门)kiki's game -- hdu -- 2147
  • (独孤九剑)--文件系统
  • (附源码)计算机毕业设计SSM智慧停车系统
  • (附源码)计算机毕业设计SSM智能化管理的仓库管理
  • (六)Hibernate的二级缓存
  • (十三)Maven插件解析运行机制