互联网Java工程师面试题·Java 面试篇·第四弹

目录

59、我们能自己写一个容器类,然后使用 for-each 循环码?

60、ArrayList 和 HashMap 的默认大小是多数?

61、有没有可能两个不相等的对象有有相同的 hashcode?

62、两个相同的对象会有不同的的 hash code 吗?

63、我们可以在 hashcode() 中使用随机数字吗?

64、Java 中,Comparator 与 Comparable 有什么不同?

65、为什么在重写 equals 方法的时候需要重写 hashCode 方法?

66、Java 中,编写多线程程序的时候你会遵循哪些最佳实践?

67、说出几点 Java 中使用 Collections 的最佳实践

68、说出 5 条 IO 的最佳实践(答案)

69、说出几条 Java 中方法重载的最佳实践?

70、在多线程环境下,SimpleDateFormat 是线程安全的吗?

71、接口是什么?为什么要使用接口而不是直接使用具体类?

72、Java 中,抽象类与接口之间有什么不同?

73、除了单例模式,你在生产环境中还用过什么设计模式?

74、适配器模式是什么?什么时候使用?

75、什么是“依赖注入”和“控制反转”?为什么有人使用?

76、抽象类是什么?它与接口有什么区别?你为什么要使用过抽象类?

77、构造器注入和 setter 依赖注入,那种方式更好?

78、依赖注入和工程模式之间有什么不同?


59、我们能自己写一个容器类,然后使用 for-each 循环码?

        可以,你可以写一个自己的容器类。如果你想使用 Java 中增强的循环来遍历,你只需要实现 Iterable 接口。如果你实现 Collection 接口,默认就具有该属性。


60、ArrayList 和 HashMap 的默认大小是多数?

        在 Java 7 中,ArrayList 的默认大小是 10 个元素,HashMap 的默认大小是16 个元素(必须是 2 的幂)。这就是 Java 7 中 ArrayList 和 HashMap 类的代码片段:

// from ArrayList.java JDK 1.7
private static final int DEFAULT_CAPACITY = 10;
//from HashMap.java JDK 7
static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16

61、有没有可能两个不相等的对象有有相同的 hashcode?

        有可能,两个不相等的对象可能会有相同的 hashcode 值,这就是为什么在hashmap 中会有冲突。相等 hashcode 值的规定只是说如果两个对象相等,必须有相同的 hashcode 值,但是没有关于不相等对象的任何规定。


62、两个相同的对象会有不同的的 hash code 吗?

不能,根据 hash code 的规定,这是不可能的。


63、我们可以在 hashcode() 中使用随机数字吗?

http://javarevisited.blogspot.sg/2011/10/override-hashcode-in-java-example.html

不行,因为对象的 hashcode 值必须是相同的。参见答案获取更多关于 Java 中重写 hashCode() 方法的知识。


64、Java 中,Comparator 与 Comparable 有什么不同?

        Comparable 接口用于定义对象的自然顺序,而 comparator 通常用于定义用户定制的顺序。Comparable 总是只有一个,但是可以有多个 comparator 来定义对象的顺序。


65、为什么在重写 equals 方法的时候需要重写 hashCode 方法?

        因为有强制的规范指定需要同时重写 hashcode 与 equal 是方法,许多容器类,如 HashMap、HashSet 都依赖于 hashcode 与 equals 的规定。


66、Java 中,编写多线程程序的时候你会遵循哪些最佳实践?

这是我在写 Java 并发程序的时候遵循的一些最佳实践:

a)给线程命名,这样可以帮助调试。

b)最小化同步的范围,而不是将整个方法同步,只对关键部分做同步。

c)如果可以,更偏向于使用 volatile 而不是 synchronized。

d)使用更高层次的并发工具,而不是使用 wait() 和 notify() 来实现线程间通信,如 BlockingQueue,CountDownLatch 及 Semeaphore。

e)优先使用并发集合,而不是对集合进行同步。并发集合提供更好的可扩展性。


67、说出几点 Java 中使用 Collections 的最佳实践

这是我在使用 Java 中 Collectionc 类的一些最佳实践:

a)使用正确的集合类,例如,如果不需要同步列表,使用 ArrayList 而不是Vector。

b)优先使用并发集合,而不是对集合进行同步。并发集合提供更好的可扩展性。

c)使用接口代表和访问集合,如使用 List 存储 ArrayList,使用 Map 存储HashMap 等等。

d)使用迭代器来循环集合。

e)使用集合的时候使用泛型。


68、说出 5 条 IO 的最佳实践(答案)

IO 对 Java 应用的性能非常重要。理想情况下,你不应该在你应用的关键路径上避免 IO 操作。下面是一些你应该遵循的 Java IO 最佳实践:

a)使用有缓冲区的 IO 类,而不要单独读取字节或字符。

b)使用 NIO 和 NIO2

c)在 finally 块中关闭流,或者使用 try-with-resource 语句。

d)使用内存映射文件获取更快的 IO。


69、说出几条 Java 中方法重载的最佳实践?

下面有几条可以遵循的方法重载的最佳实践来避免造成自动装箱的混乱。

a)不要重载这样的方法:一个方法接收 int 参数,而另个方法接收 Integer 参数。

b)不要重载参数数量一致,而只是参数顺序不同的方法。

c)如果重载的方法参数个数多于 5 个,采用可变参数。


70、在多线程环境下,SimpleDateFormat 是线程安全的吗?

        不是,非常不幸,DateFormat 的所有实现,包括 SimpleDateFormat 都不是线程安全的,因此你不应该在多线程序中使用,除非是在对外线程安全的环境中使用,如 将 SimpleDateFormat 限制在 ThreadLocal 中。如果你不这么做,在解析或者格式化日期的时候,可能会获取到一个不正确的结果。因此,从日期、时间处理的所有实践来说,我强力推荐 joda-time 库。


71、接口是什么?为什么要使用接口而不是直接使用具体类?

        接口用于定义 API。它定义了类必须得遵循的规则。同时,它提供了一种抽象,因为客户端只使用接口,这样可以有多重实现,如 List 接口,你可以使用可随机访问的 ArrayList,也可以使用方便插入和删除的 LinkedList。接口中不允许写代码,以此来保证抽象,但是 Java 8 中你可以在接口声明静态的默认方法,这种方法是具体的。


72、Java 中,抽象类与接口之间有什么不同?

        Java 中,抽象类和接口有很多不同之处,但是最重要的一个是 Java 中限制一个类只能继承一个类,但是可以实现多个接口。抽象类可以很好的定义一个家族类的默认行为,而接口能更好的定义类型,有助于后面实现多态机制。


73、除了单例模式,你在生产环境中还用过什么设计模式?

        这需要根据你的经验来回答。一般情况下,你可以说依赖注入,工厂模式,装饰模式或者观察者模式,随意选择你使用过的一种即可。不过你要准备回答接下的基于你选择的模式的问题。


74、适配器模式是什么?什么时候使用?

        适配器模式提供对接口的转换。如果你的客户端使用某些接口,但是你有另外一些接口,你就可以写一个适配去来连接这些接口。


75、什么是“依赖注入”和“控制反转”?为什么有人使用?

        控制反转(IOC)是 Spring 框架的核心思想,用我自己的话说,就是你要做一件事,别自己可劲 new 了,你就说你要干啥,然后外包出去就好~依赖注入(DI) 在我浅薄的想法中,就是通过接口的引用和构造方法的表达,将一些事情整好了反过来传给需要用到的地方~


76、抽象类是什么?它与接口有什么区别?你为什么要使用过抽象类?

        接口用于规范,抽象类用于共性.声明方法的存在而不去实现它的类被叫做抽象类接口(interface)是抽象类的变体。在接口中,所有方法都是抽象的。


77、构造器注入和 setter 依赖注入,那种方式更好?

        每种方式都有它的缺点和优点。构造器注入保证所有的注入都被初始化,但是setter 注入提供更好的灵活性来设置可选依赖。如果使用 XML 来描述依赖,Setter 注入的可读写会更强。经验法则是强制依赖使用构造器注入,可选依赖使用 setter 注入。


78、依赖注入和工程模式之间有什么不同?

        虽然两种模式都是将对象的创建从应用的逻辑中分离,但是依赖注入比工程模式更清晰。通过依赖注入,你的类就是 POJO,它只知道依赖而不关心它们怎么获取。使用工厂模式,你的类需要通过工厂来获取依赖。因此,使用 DI 会比使用工厂模式更容易测试。


要想了解更多:

千题千解·Java面试宝典_时光の尘的博客-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/167461.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

专业安卓实时投屏软件:极限投屏(QtScrcpy作者开发)使用说明

基本介绍 极限投屏是一款批量投屏管理安卓设备的软件&#xff0c;是QtScrcpy作者基于QtScrcpyCore开发&#xff0c;主要功能有&#xff1a; 设备投屏&控制&#xff1a;单个控制、批量控制分组管理wifi投屏adb shell快捷指令文件传输、apk安装 更多功能还在持续更新。 极…

Node学习笔记之Express框架

一、express 介绍 express 是一个基于 Node.js 平台的极简、灵活的 WEB 应用开发框架&#xff0c;官方网址&#xff1a;https://www.expressjs. com.cn/ 简单来说&#xff0c;express 是一个封装好的工具包&#xff0c;封装了很多功能&#xff0c;便于我们开发 WEB 应用&…

【vSphere 8 自签名 VMCA 证书】企业 CA 签名证书替换 vSphere VMCA CA 证书Ⅰ—— 生成 CSR

目录 替换拓扑图证书关系示意图说明 & 关联博文1. 默认证书截图2. 使用 certificate-manager 生成CSR2.1 创建存放CSR的目录2.2 记录PNID和IP2.3 生成CSR2.4 验证CSR 参考资料 替换拓扑图 证书关系示意图 本系列博文要实现的拓扑是 说明 & 关联博文 因为使用企业 …

Rust逆向学习 (2)

文章目录 Guess a number0x01. Guess a number .part 1line 1loopline 3~7match 0x02. Reverse for enum0x03. Reverse for Tuple0x04. Guess a number .part 20x05. 总结 在上一篇文章中&#xff0c;我们比较完美地完成了第一次Rust ELF的逆向工作&#xff0c;但第一次编写的R…

SL8541 android系统环境+编译

1.Ubuntu系统的安装 最好使用ubuntu18.0.4 2.工具环境包的安装 // 安装Android8.1源码编译环境 sudo apt-get install openjdk-8-jdk --------------ok sudo apt-get install libx11-dev:i386 libreadline6-dev:i386 libgl1-mesa-dev g-multilib --------------ok sudo…

1 Go的前世今生

概述 Go语言正式发布于2009年11月&#xff0c;由Google主导开发。它是一种针对多处理器系统应用程序的编程语言&#xff0c;被设计成一种系统级语言&#xff0c;具有非常强大和有用的特性。Go语言的程序速度可以与C、C相媲美&#xff0c;同时更加安全&#xff0c;支持并行进程。…

curl命令服务器上执行http请求

1. 现在本地使用postman生成curl命令 注意: 将ip改成127.0.0.1,端口是实际服务运行的端口 curl --location --request POST http://127.0.0.1:63040/content/course/list?pageNo1&pageSize2 \ --header Content-Type: application/json \ --data-raw {"courseName&q…

小插曲 -- 使用Visual Studio Code远程连接香橙派

在之前的学习中&#xff0c;代码的修改和保存都依赖于“vi”指令&#xff0c;而不得不承认vi指令的编辑界面非常原始&#xff0c;所以&#xff0c;如果可以将代码编辑放到更友好的环境里进行无疑是一件大快人心的事情。 本节介绍如何通过Visual Studio Code来进行远程连接: Vi…

【计算机网络】UDP/TCP协议

文章目录 :peach:1 UDP协议:peach:1.1 :apple:UDP协议端格式:apple:1.2 :apple:UDP的特点:apple:1.3 :apple:UDP的缓冲区:apple:1.4 :apple:UDP使用注意事项:apple:1.5 :apple:基于UDP的应用层协议:apple: 2 :peach:TCP协议:peach:2.1 :apple:TCP协议端格式:apple:2.2 :apple:确…

Redis 命令—— 超详细操作演示!!!

内存数据库 Redis7 三、Redis 命令3.1 Redis 基本命令3.2 Key 操作命令3.3 String 型 Value 操作命令3.4 Hash 型 Value 操作命令3.5 List 型 Value 操作命令3.6 Set 型 Value 操作命令3.7 有序Set 型 Value 操作命令3.8 benchmark 测试工具3.9 简单动态字符串SDS3.10 集合的底…

Jenkins环境部署与任务构建

一、CI/CD 1、CI/CD 概念&#xff1a; CI/CD 是一种软件开发和交付方法&#xff0c;旨在加速应用程序的开发、测试和部署过程&#xff0c;以提高软件交付的质量和效率。 (1) 持续集成 (CI Continuous Integration): 持续集成是开发团队频繁集成其代码更改的过程。开发者将其…

04.Finetune vs. Prompt

目录 语言模型回顾大模型的两种路线专才通才二者的比较 专才养成记通才养成记Instruction LearningIn-context Learning 自动Prompt 部分截图来自原课程视频《2023李宏毅最新生成式AI教程》&#xff0c;B站自行搜索 语言模型回顾 GPT&#xff1a;文字接龙 How are __. Bert&a…

【LSTM-Attention】基于长短期记忆网络融合注意力机制的多变量时间序列预测研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

一款WPF开发的网易云音乐客户端 - DMSkin-CloudMusic

前言 今天推荐一款基于DMSkin框架开发的网易云音乐播放器&#xff1a;DMSkin-CloudMusic。 DMSkin 框架介绍 DMSkin是一个开源的WPF样式UI框架&#xff0c;可以帮助开发者快速创建漂亮的用户界面。 下载体验 下载地址&#xff1a;https://github.com/944095635/DMSkin-Clou…

辅助驾驶功能开发-功能规范篇(16)-2-领航辅助系统NAP-HMI人机交互

书接上回 2.3.7HMI人机交互 2.3.7.1显示 (1)图标 序号 图标状态 (图形、颜色供参考) 含义说明 备注 1 辅助驾驶功能READY (允许激活) 2 辅助驾驶功能激活 3 辅助驾驶系统故障 4

ATPCS:ARM-Thumb程序调用的基本规则

为了使单独编译的c文件和汇编文件之间能够互相调用&#xff0c;需要制定一系列的规则&#xff0c;AAPCS就是ARM程序和Thumb程序中子程序调用的基本规则。 1、ATPCS概述 ATPCS规定了子程序调用过程中寄存器的使用规程、数据站的使用规则、参数的传递规则。为了适应一些特殊的需…

03、Python 字符串高级用法

目录 Python 字符串高级用法转义字符字符串格式化序列相关的方法大小写相关的方法dir 可以查看某个类的所有方法删除空白查找、替换相关方法 Python 字符串高级用法 转义字符 字符串格式化 序列相关的方法 字符串本质就是由多个字符组成&#xff0c;字符串的本质就是不可变序…

SpringBoot连接MySQL密码错误,报错:Access denied for user

记&#xff1a;一次连接MySQL报密码错误&#xff0c;Access denied for user 检查步骤&#xff1a; 核对用户和密码是否正确&#xff0c;用工具登陆试下。如果配置文件是yml格式&#xff0c;配置密码是123456这种纯数字&#xff0c;记得加上单/双引号。检查云上数据库配置&am…

基于PHP的创意设计分享系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09; 代码参考数据库参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者&am…

力扣每日一题59:螺旋矩阵||

题目描述&#xff1a; 给你一个正整数 n &#xff0c;生成一个包含 1 到 n2 所有元素&#xff0c;且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。 示例 1&#xff1a; 输入&#xff1a;n 3 输出&#xff1a;[[1,2,3],[8,9,4],[7,6,5]]示例 2&#xff1a; 输入&am…