Java 面试题基础(四)

Java 面试题基础(四)

  • 前言
  • 1、获取Class对象的构造方法?
  • 2、获取Class对象的成员变量?
  • 3、获取Class对象的成员方法?
  • 4、简述一下你了解的设计模式?
  • 5、java中fail-fast和fail-safe的区别说明?
  • 6、Jsp的运行原理?
  • 7、finally语句总是会执行吗?
  • 8、try、catch、finally中包含return的四种情况以及返回结果?
  • 9、线程池的线程数量怎么确定?
  • 10、Iterator 怎么使用?有什么特点??
  • 11、Java 中能创建 volatile 数组吗?
  • 12、volatile 能使得一个非原子操作变成原子操作吗?
  • 13、String、数组和 List之间的转换?
  • 14、volatile 修饰符的有过什么实践?
  • 15、设计模式分类?
  • 16、什么是多线程环境下的伪共享(false sharing)?
  • 17、Java 中怎么获取一份线程 dump 文件?
  • 18、生产环境服务器变慢,如何诊断处理?
  • 19、什么是线程局部变量?
  • 20、mysql用什么类型存储金额或者IP?
  • 总结


前言

最新的 Java 面试题,技术栈涉及 Java 基础、集合、多线程、Mysql、分布式、Spring全家桶、MyBatis、Dubbo、缓存、消息队列、Linux…等等,持续更新中。

如果对老铁有帮助,帮忙免费点个赞,谢谢你的发财手!

1、获取Class对象的构造方法?

//获取字节码对象
Class<?> aClass = Class.forName("com.user"); 
//通过无参构造函数获取用户对象
Object user = aClass.getConstructor().newInstance();
//通过有参构造函数获取用户对象,参数是包装类
Constructor constructor = aClass.getConstructor(String.class, Integer.class);
Object user = constructor.newInstance("张三", 20);

2、获取Class对象的成员变量?

//获取当前类所有的字段
Field[] fields = aClass.getDeclaredFields();
//获取当前类和父类所有pulbic字段
Field[] fields = aClass. getFields();
//获取当前类指定的字段
Field field = aClass.getDeclaredField("name");
//获取当前类和父类指定的pulbic字段
Field field = aClass.getField("name");
//设置私有变量可访问
field.setAccessible(true);
field.set(user, "张三");//表示给对象user的name属性赋值。

3、获取Class对象的成员方法?

Method[] methods = aClass.getDeclaredMethods();//获取当前类所有的方法;
Method[] methods = aClass.getMethods();//获取当前类和父类所有的public方法
//获取单个方法,参数一是方法名,参数2.3...是方法参数类型
Method method = aClass.getDeclaredMethod/getMethod ("getUserByName", String.class);
method.setAccessible(true);
Object o = method.invoke(user, "张三");

4、简述一下你了解的设计模式?

面试被问到关于设计模式的知识时,可以拣最常用的作答,例如:

  • 工厂模式:工厂类可以根据条件生成不同的子类实例,这些子类有一个公共的抽象父类并且实现了相同的方法,但是这些方法根据不同的业务进行了不同的操作(多态方法)。
  • 动态代理模式:给一个对象生成了一个动态代理对象,并由代理对象控制原对象的引用。在实际开发中,根据使用目的的不同,代理可以分为:远程代理、虚拟代理、保护代理等。
  • 适配器模式:把一个类的接口变换成客户端所期待的另一种接口,从而使因接口不匹配而无法在一起使用的类能够一起工作。
  • 策略模式:定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。

5、java中fail-fast和fail-safe的区别说明?

  • fail-fast: 当一个线程在遍历这个集合,而另一个线程对这个集合的结构进行了修改,会抛出异常
  • fail-safe:任何对集合结构的修改都会在一个复制的集合上进行修改,因此不会抛出异常。

6、Jsp的运行原理?

  • 1、服务器根据接收到的客户端的请求来加载相应的JSP文件。
  • 2、JSP引擎会将该JSP文件转化为Servlet。
  • 3、然后把Servlet代码编译成Class文件。
  • 4、服务器将执行结果返回给浏览器进行显示。
    如果多个客户端同时请求该Jsp文件,则Jsp引擎会创建多个线程,使得每一个请求都对应一个线程。

7、finally语句总是会执行吗?

不一定
1.当没有进入try语句就发生异常的时候,不会执行finally语句(只有与 finally 相对应的 try 语句块得到执行的情况下,finally 语句块才会执行)
2.当try语句中执行System.exit(0) 这个方法的时候,也不会执行finally语句。

8、try、catch、finally中包含return的四种情况以及返回结果?

  • 第1种情况:在try和catch中有return,finally中没有return,且finally中没有对try或catch中要对return的数据进行操作,则无影响。
  • 第2种情况:在try和catch中有return,finally中没有return,但finally中有对try或catch中要对return的数据进行操作:
    ①返回的数据为基本数据类型和String,则finally中对要返回数据操作无影响
    ②返回的数据为引用数据类型,finally中如果改变了返回对象的属性则影响结果,如果改变的是对象的引用,则无影响。
  • 第3种情况:在try和catch中有return,finally中也有return
    try或catch中return后面的代码还会执行,但最终返回的结果为finally中return的值
  • 第4种情况:在try中有return,在catch中手动throw抛出异常,finally中有return
    如果catch块中捕获了异常, 并且在catch块中将该异常抛给上级调用者进行处理, 但finally中有return, 那么catch块中的throw就失效了, 上级方法调用者是捕获不到异常。

9、线程池的线程数量怎么确定?

  • 一般来说,如果是CPU密集型应用,则线程池大小设置为N+1。
  • 一般来说,如果是IO密集型应用,则线程池大小设置为2N+1。

10、Iterator 怎么使用?有什么特点??

(1) 调用iterator()方法返回一个Iterator对象;
(2) 使用hasNext()检查序列中是否还有元素;
(3) 使用next()获得序列中的下一个元素;
(4) 使用remove()将迭代器新返回的元素删除。
Iterator是Java迭代器设计模式最简单的实现,为List设计的ListIterator具有更多的功能,它可以从两个方向遍历List,也可以从List中插入和删除元素。

Iterator<Integer> iterator = numList.iterator();
while (iterator.hasNext()) {Integer num = iterator.next();if (num < 0) {//使用迭代器的删除方法删除iterator.remove();}
}

11、Java 中能创建 volatile 数组吗?

能,不过只是一个指向数组的引用,而不是整个数组。
如果多个线程同时改变数组的元素,volatile 标示符就不能起到之前的保护作用了。

12、volatile 能使得一个非原子操作变成原子操作吗?

可以,一个典型的例子是volatile 修饰的long或double类型的成员变量。

13、String、数组和 List之间的转换?

下面的代码以连接本机的 Oracle 数据库为例,演示 JDBC 操作数据库的步骤。

String 转数组:String[] array = str.split(",");
数组转StringString str = Arrays.toString(array);数组转ListList<String> list = Arrays.asList(array);
List转数组:String[] array = list.toArray(new String[list.size()]);StringListList<String> list = Arrays.asList(str.split(","));
ListStringString str = String.join(",", list);

14、volatile 修饰符的有过什么实践?

一种实践是用 volatile 修饰 long 和 double 变量,使其能按原子类型来读写。
double 和 long 都是 64 位,因此对这两种类型的读是分为两部分的,第一次读取前 32 位,然后再读剩下的 32 位,这个过程不是原子的。

15、设计模式分类?

  • 1、创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。
  • 2、结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。
  • 3、行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。

16、什么是多线程环境下的伪共享(false sharing)?

伪共享是多线程系统(每个处理器有自己的局部缓存)中一个众所周知的性能问题。
伪共享发生在不同处理器上的线程对变量的修改依赖于相同的缓存行。

17、Java 中怎么获取一份线程 dump 文件?

  • 在Linux下,你可以通过命令 kill -3 PID (Java 进程的进程 ID)来获取 Java 应用的 dump 文件。
  • 在Windows下,你可以按下Ctrl + Break来获取。这样JVM 就会将线程的 dump 文件打印到标准输出或错误文件中,它可能打印在控制台或者日志文件中,具体位置依赖应用的配置。

18、生产环境服务器变慢,如何诊断处理?

  • 1、使用 top 指令,服务器中 CPU 和 内存的使用情况,-H 可以按 CPU 使用率降序,-M 内存使用率降序。排除其他进程占用过高的硬件资源,对 Java 服务造成影响。
  • 2、如果发现 CPU 使用过高,可以使用 top 指令查出 JVM 中占用 CPU 过高的线程,通过 jstack 找到对应的线程代码调用,排查出问题代码。
  • 3、如果发现内存使用率比较高,可以 dump 出 JVM 堆内存,然后借助 MAT 进行分析,查出大对象或者占用最多的对象来自哪里,为什么会长时间占用这么多;如果 dump 出的堆内存文件正常,此时可以考虑堆外内存被大量使用导致出现问题,需要借助操作系统指令 pmap 查出进程的内存分配情况、gdb dump 出具体内存信息、perf 查看本地函数调用等。
  • 4、如果 CPU 和 内存使用率都很正常,那就需要进一步开启 GC 日志,分析用户线程暂停的时间、各部分内存区域 GC 次数和时间等指标,可以借助 jstat 或可视化工具 GCeasy 等,如果问题出在 GC 上面的话,考虑是否是内存不够、根据垃圾对象的特点进行参数调优、使用更适合的垃圾收集器;分析 jstack 出来的各个线程状态。如果问题实在比较隐蔽,考虑是否可以开启 jmx,使用 visualmv 等可视化工具远程监控与分析。

19、什么是线程局部变量?

线程局部变量是局限于线程内部的变量,属于线程自身所有,不在多个线程间共享。Java 提供了 ThreadLocal 类来实现线程安全。但是线程局部变量在工作完成后没有释放,就存在内存泄露的风险,每次使用完ThreadLocal都调用它的remove()方法清除数据。

20、mysql用什么类型存储金额或者IP?

  • 金额:如果不是特别关心内存和性能的话,使用 decimal(10,2) ,否则使用 double(10,2) 。
  • IP:应该使用32位的无符号整数(UNSIGNED INT)来存储IP地址,而不是使用字符串。
mysql> select inet_aton('192.168.0.1');
+--------------------------+
| inet_aton('192.168.0.1') |
+--------------------------+
|               3232235521 |
+--------------------------+
1 row in set (0.00 sec)mysql> select inet_ntoa(3232235521);
+-----------------------+
| inet_ntoa(3232235521) |
+-----------------------+
| 192.168.0.1           |
+-----------------------+
1 row in set (0.00 sec)

总结

都已经看到这里啦,赶紧收藏起来,祝您工作顺心,生活愉快!

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

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

相关文章

C#_事件简述

事件模型简述 C#中事件的运行模式为"发布订阅模型"&#xff0c;事件触发者称为"发布者"&#xff0c;事件处理者称为"订阅者" 事件模型的五个组成部分 事件&#xff08;成员&#xff09;事件的拥有者&#xff08;类/对象&#xff09;事件的响应…

【MySQL高可用集群】MySQL的MGR搭建

前情提要&#xff1a; MySQL官方在 5.7.17版本正式推出组复制&#xff08;MySQL Group Replication&#xff0c;简称MGR&#xff09;&#xff0c;使用类似 zookeeper 的多于一半原则。在一个集群由 2N1 个节点共同组成一个复制组&#xff0c;一个事务的提交&#xff0c;必须经过…

蛋白结构预测模型评价指标

欢迎浏览我的CSND博客&#xff01; Blockbuater_drug …点击进入 文章目录 前言一、蛋白结构预测模型评价指标TM-scorelDDT 二、Alphafold中的评价指标pLDDTpTMPAE 三、AlphaFold-multimer 蛋白结构的评价指标DockQipTM 总结参考资料 前言 本文汇总了AlphaFold和AlphaFold-mul…

tigramite教程(二)生物地球科学案例研究

文章目录 数据生成与绘图因果发现分析平稳性假设、确定性、潜在混杂因素结构假设参数假设使用PCMCIplus的滑动窗口分析聚合因果图非参数因果效应估计假设的图形和调整集干预的真实情况假设的参数模型和因果效应的估计使用关于图的不同假设进行估计非因果估计项目地址 这个文件…

android 13.0 屏蔽所有电话来电功能

1.概述 在13.0系统rom定制化开发中,最近项目需要开发需求是屏蔽来电功能,需要根据标志位 屏蔽一切来电功能 就是去掉通话功能,这就需要从通话流程进行分析,然后实现功能 ,而我们知道所有的来电去掉都是CallManager.java来负责监听管理的。 2.屏蔽所有电话来电功能的核心代…

LeetCode_Java_动态规划(2)(题目+思路+代码)

131.分割回文串 给你一个字符串 s&#xff0c;请你将 s 分割成一些子串&#xff0c;使每个子串都是 回文串 。返回 s 所有可能的分割方案。 回文串 是正着读和反着读都一样的字符串。 示例 1&#xff1a; 输入&#xff1a;s "aab" 输出&#xff1a;[["a&qu…

算法简介:查找与算法运行时间

文章目录 1. 二分查找与简单查找1.1 运行时间 2. 旅行商问题 算法是一组完成任务的指令。任何代码片段都可以视为算法。 1. 二分查找与简单查找 二分查找是一种算法&#xff0c;其输入是一个有序的元素列表&#xff0c;如果要查找的元素包含在列表中&#xff0c;二分查找返回…

ActiveMq PUT任意文件上传漏洞(CVE-2016-3088)漏洞复现

ActiveMQ ActiveMQ Web控制台分为三个应用程序&#xff1a;其中admin&#xff0c;api和fileserver&#xff0c;其中admin是管理员页面&#xff0c;api是界面&#xff0c;fileserver是用于存储文件的界面&#xff1b;admin和api需要先登录才能使用&#xff0c;fileserver不需要…

门面模式(Facade Pattern)

定义 门面模式&#xff08;Facade Pattern&#xff09;是一种结构型设计模式&#xff0c;旨在为一个复杂子系统提供一个简单的接口。它提供了一个高层接口&#xff0c;使得客户端可以更容易地使用这个子系统&#xff0c;而不需要了解其内部的复杂性。 示例 #include <ios…

Pytorch安装遇到网络问题

在运行 conda install pytorch1.11.0 torchvision cudatoolkit -c pytorch出现问题 (GAN) D:\0code\vision>conda install pytorch1.11.0 torchvision cudatoolkit -c pytorch Collecting package metadata (current_repodata.json): - DEBUG:urllib3.connectionpool:Star…

元素实现拖拽效果react-dnd+react-dnd-html5-backend

做完案例还是很懵逼 // useDrag 可以让一个 DOM 元素实现拖拽效果 // useDrop 可以让一个 DOM 元素能够放置拖拽元素 参考资料1 //React DnD 参考资料2 https://www.cnblogs.com/dtux/p/17468866.html import React, { useState } from react; import { useDrop, useDra…

Vue开发日志:宏观布局

Vue开发日志&#xff1a;宏观布局 总纲拆分组件化开发&#xff1a;拆分页面模块化开发&#xff1a;拆分功能两者的关系 集成组件传参父组件向子组件传参子组件接收参数子组件向父组件传参父组件接收参数场记 总纲 不识庐山真面目&#xff0c;只缘身在此山中 跳出三界之外&…

TypeScript基础知识点详解

TypeScript基础知识点详解 引言&#xff1a; 在现代前端开发中&#xff0c;TypeScript作为一种静态类型的JavaScript超集&#xff0c;越来越受到开发者的青睐。它提供了类型检查、编译时错误提示、代码重构和智能提示等功能&#xff0c;使得代码更加健壮、可维护。本文将详细介…

AI能不断进化吗?

AI的进化是一个持续的过程&#xff0c;并且随着时间推移和技术的发展&#xff0c;AI可以不断进化。这种进化可以包括以下几个方面&#xff1a; 1、算法和模型的改进&#xff1a; AI的进化可以通过改进其算法和模型来实现。研究人员不断提出新的算法和模型&#xff0c;使得AI在…

c语言中的宏指的是什么

在C语言中&#xff0c;宏&#xff08;Macro&#xff09;是一种预处理器的功能&#xff0c;用于将代码片段命名并用一个标识符替代。宏定义通过 #define 关键字完成&#xff0c;可以用于表示常量、创建函数样式的代码块&#xff0c;以及执行简单的文本替换。 举个例子&#xff…

Linux下定位内存踩踏问题的一种方法

Linux下定位内存踩踏问题的一种方法 演示代码(main.cpp)编译并执行输出 我们在Linux下用C/C开发具有一定复杂性的系统时,需要集成多个部门开发的SDK。内存越界的问题,往往让人头疼。本文提供了一种思路,用来定位内存踩踏。 开发者应该清楚哪块内存不应该被写入(或padding一块只…

IT基础监控与各IT体系模块的深化关系及其作用详解

IT基础监控作为运维工作的“眼睛”和“耳朵”&#xff0c;始终贯穿于自动化、容器化、云原生、团队协作及智能运维的实践中。以下是对IT基础监控与各IT体系模块之间关系的进一步补充和深化。 1. IT基础监控与自动化的深化关系 在自动化运维的实践中&#xff0c;基础监控不仅是…

C++11_C++回顾

范围for 对于一个有范围的集合而言&#xff0c;由程序员来说明循环的范围是很多余的&#xff0c;有时还很容易犯错误。因此C中引入了基于范围for循环。for循环后的括号由冒号":"分为两部分&#xff0c;第一部分是范围内用于迭代的变量&#xff0c;第二部分则表示被迭…

智慧餐饮系统架构的设计与实现

随着科技的不断发展&#xff0c;智慧餐饮系统在餐饮行业中扮演着越来越重要的角色。智慧餐饮系统整合了信息技术&#xff0c;以提高餐饮企业的管理效率、客户服务质量和市场竞争力。本文将探讨智慧餐饮系统架构的设计与实现&#xff0c;并探讨其在餐饮行业中的应用前景。 架构…

大文件上传

分片上传 将文件分为多个大小相等的小块&#xff0c;提高并发 前端将切割的每个分片按顺序传送给后端 后端收到分片后&#xff0c;记录特征信息&#xff08;MD5&#xff09; 按序号进行拼接 断点续传 将文件分为几个小块 每次上传时记录一个块信息&#xff0c;例如文件MD…