JavaSE面试题(二)

目录

一.为什么会有Java内存模型?

二.什么样的情况下finally不会执行

三.钩子是什么?

四.编译时期的多态性和运行时期的多态性

五.谈谈反射机制

六.Java管道


本专栏全是博主自己收集的面试题,仅可参考,不能相信面试官就出这种题目。

一.为什么会有Java内存模型?

        Java 内存模型存在的原因在于解决多线程环境下并发执行时的内存可见性和一致性问题,保证多线程并发操作的可见性、有序性和原子性

Java内存模型内容:

  • 主内存(Main Memory):所有线程共享的内存区域,包含了对象的字段、方法和运行时常量池等数据。
  • 工作内存(Working Memory):每个线程拥有自己的工作内存,用于存储主内存中的数据的副本,线程只能直接操作工作内存中的数据。
  • 内存间交互操作:线程通过读取和写入操作与主内存进行交互。读操作将数据从主内存复制到工作内存,写操作将修改后的数据刷新到主内存。
  • 原子性(Atomicity):JMM 保证基本数据类型(如 int、long)的读写操作具有原子性,即不会被其他线程干扰,保证操作的完整性。
  • 可见性(Visibility):JMM 确保一个线程对共享变量的修改对其他线程可见。这意味着一个线程在工作内存中修改了数据后,必须将最新的数据刷新到主内存,以便其他线程可以读取到更新后的数据。
  • 有序性(Ordering):JMM 保证程序的执行顺序按照一定的规则进行,不会出现随机的重排序现象。这包括了编译器重排序、处理器重排序和内存重排序等。

二.什么样的情况下finally不会执行

        正常运行的情况下,finally 中的代码是一定会执行的,但是在某些异常情况下,就不会执行。

1.程序在 try 块中遇到 System.exit() 方法,会立即终止程序的执行

public class FinallyExample {public static void main(String[] args) {try {System.out.println("执行 try 代码.");System.exit(0);} finally {System.out.println("执行 finally 代码.");}}
}

2.在 try 快中遇到 Runtime.getRuntime().halt() 代码,强制终止正在运行的 JVM。

public class FinallyExample {public static void main(String[] args) {try {System.out.println("执行 try 代码.");Runtime.getRuntime().halt(0);} finally {System.out.println("执行 finally 代码.");}}
}

3.程序在 try 块中遇到无限循环或者发生死锁等情况时,程序可能无法正常跳出 try 块,此时 finally 块中的代码也不会被执行。

4.编译器奔溃或者硬件故障(停电等)

三.钩子是什么?

        在计算机编程中,"钩子"(hook)是一种技术或机制,允许程序在特定事件发生时插入自定义代码或逻辑。这种机制允许程序员在不修改程序源代码的情况下,改变或扩展程序的行为。

钩子类型:

  1. 关闭钩子(Shutdown Hooks)

    • 在Java中,关闭钩子是一种特殊的钩子机制,允许开发者注册在JVM即将关闭之前执行的代码块。通过 Runtime.addShutdownHook(Thread hook) 方法可以注册一个线程,在JVM关闭时执行。这种机制通常用于释放资源、保存状态或执行清理操作,确保程序在退出前可以进行必要的收尾工作。
  2. 安装钩子

    • 在操作系统和网络编程中,"安装钩子"通常指在系统级别或特定应用程序中安装的一种回调机制。例如,在操作系统级别,可以安装键盘钩子来截获键盘输入事件,或者安装鼠标钩子来截获鼠标事件。这使得程序可以监视或修改输入事件的行为。
  3. 编程钩子

    • 在软件开发中,"编程钩子"指的是在代码中留下的一些特定点,允许开发者插入自定义代码。例如,一些框架或库可能会定义钩子函数(hook functions),允许用户根据需要扩展框架的功能或修改其行为。

四.编译时期的多态性和运行时期的多态性

        编译时期的多态性:方法重载  ,通过静态绑定,在编译阶段就确定的具体方法,也称静态多态性。

        运行时期的多态性:方法重写,依赖于动态绑定, 在子类覆盖(重写)父类的方法时。当通过父类引用指向子类对象,并调用被子类重写的方法时,实际执行的是子类中的方法。

class Animal {void makeSound() {System.out.println("Animal makes a sound");}
}class Dog extends Animal {void makeSound() {System.out.println("Dog barks");}
}public class TestPolymorphism {public static void main(String[] args) {Animal myAnimal = new Dog(); // 父类引用指向子类对象myAnimal.makeSound(); // 调用被子类重写的方法}
}

五.谈谈反射机制

        反射,可以反射一个对象内的所有方法,还可以获取所有的属性值。

通过反射,可以得到实例化对象,也可以使用该类的的所有方法(公共、私有)。

public class User {public String name = "张三";private int age = 18;public void publicMethod() {System.out.println("do public method");}private void privateMethod() {System.out.println("do private method");}public static void staticMethod() {System.out.println("do static method");}
}

获取对象方法和属性:

// 1.反射得到对象
Class<?> clazz = Class.forName("User");
// 2.得到方法
Method method = clazz.getDeclaredMethod("publicMethod");
// 3.执行普通方法
method.invoke(clazz.getDeclaredConstructor().newInstance());// 得到私有方法
Method privateMethod = clazz.getDeclaredMethod("privateMethod");
// 设置私有方法可访问
privateMethod.setAccessible(true);
// 执行私有方法
privateMethod.invoke(clazz.getDeclaredConstructor().newInstance());// 得到静态方法
Method staticMethod = clazz.getDeclaredMethod("staticMethod");
// 执行静态方法
staticMethod.invoke(clazz);// 得到公共属性
Field field = clazz.getDeclaredField("name");
// 得到属性值
String name = (String) field.get(clazz.getDeclaredConstructor().newInstance());// 得到私有属性
Field privateField = clazz.getDeclaredField("age");
// 设置私有属性可访问
privateField.setAccessible(true);
// 得到属性值
int age = (int) privateField.get(clazz.getDeclaredConstructor().newInstance());

使用场景:

  1. 编程开发工具的代码提示
  2. Spring 中的依赖注入
  3. 数据库连接框架也会使用反射来实现调用不同类型的数据库

优缺点分析:

优点:灵活性、可扩展性;缺点:性能(获取类信息慢)、安全(会访问和修改类的方法和字段)

六.Java管道

        或许有人没听说过,但是 所谓的管道 就是指:输入流和输出流之间的连接,用于在程序中传输数据。Java的管道可以用于在不同线程之间传递数据,或者用于对输入流进行处理后输出到输出流。

Java 管道的主要类和用法

1. PipedInputStream 和 PipedOutputStream

  • PipedOutputStream:用于向管道发送字节数据。
  • PipedInputStream:用于从管道接收字节数据。
import java.io.*;public class PipeExample {public static void main(String[] args) throws Exception {PipedOutputStream pos = new PipedOutputStream();PipedInputStream pis = new PipedInputStream(pos);Thread writerThread = new Thread(() -> {try {pos.write("Hello, Pipe!".getBytes());pos.close();} catch (IOException e) {e.printStackTrace();}});Thread readerThread = new Thread(() -> {try {int data;while ((data = pis.read()) != -1) {System.out.print((char) data);}pis.close();} catch (IOException e) {e.printStackTrace();}});writerThread.start();readerThread.start();}
}
  • 创建 PipedOutputStream 和 PipedInputStream 实例,并将它们连接起来。
  • 在 writerThread 中向 PipedOutputStream 写入数据,最后关闭输出流。
  • 在 readerThread 中从 PipedInputStream 读取数据,并输出到控制台,直到读取结束后关闭输入流。

2. PipedReader 和 PipedWriter

  • PipedWriter:用于向管道发送字符数据。
  • PipedReader:用于从管道接收字符数据。
import java.io.*;public class PipeExample {public static void main(String[] args) throws Exception {PipedWriter pw = new PipedWriter();PipedReader pr = new PipedReader(pw);Thread writerThread = new Thread(() -> {try {pw.write("Hello, Pipe!".toCharArray());pw.close();} catch (IOException e) {e.printStackTrace();}});Thread readerThread = new Thread(() -> {try {int data;while ((data = pr.read()) != -1) {System.out.print((char) data);}pr.close();} catch (IOException e) {e.printStackTrace();}});writerThread.start();readerThread.start();}
}

注意:

  • 线程安全:Java的管道类提供了基本的线程安全性,可以在多线程环境下使用。
  • 阻塞特性:当管道中没有数据可读时,读取操作会阻塞;当管道已满时,写入操作会阻塞。
  • 关闭管道:在使用完毕后,应该及时关闭管道,以释放资源。

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

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

相关文章

TCP报文校验和(checksum)计算

一. 原理 将TCP相关内容&#xff08;TCP伪头部TCP头部TCP内容&#xff09;转换成16比特的字符&#xff0c;然后进行累加&#xff0c;最后结果进行取反。TCP伪头部是固定的&#xff0c;下文有相关代码展示。 二. 源码 源码 #include <stdio.h> #include <stdlib.h&…

3D鸡哥又上开源项目!单图即可生成,在线可玩

大家好&#xff0c;今天和大家分享几篇最新的工作 1、Unique3D Unique3D从单视图图像高效生成高质量3D网格&#xff0c;具有SOTA水平的保真度和强大的通用性。 如下图所示 Unique3D 在 30 秒内从单视图野生图像生成高保真且多样化的纹理网格。 例如属于一张鸡哥的打球写真照 等…

js 递归调用 相同对象--数组递归调用

<div class="save-cl"> <a-button @click="saveCl" >保存为常用策略</a-button> </div> saveCl(){ console.log(this.form.filterList[0],--------常用策略)// 此对象为上图对象 console.log(this.allElementsHaveValue(thi…

Windows的管理工具

任务计划程序&#xff1a;这是一个用来安排任务自动运行的工具。你可以在这里创建新的任务&#xff0c;设定触发条件&#xff0c;并指定任务的操作。 事件查看器&#xff1a;这是一套日志记录和分析工具&#xff0c;&#xff0c;你可以了解到系统的工作状况&#xff0c;帮助诊…

损失函数篇

损失函数 1、边界框损失函数/回归损失函数bbox_loss 2、分类损失函数cls_loss 3、置信度损失函数obj_loss YOLOv8损失函数 1、概述 通过YOLOv8-训练流程-正负样本分配的介绍&#xff0c;我们可以知道&#xff0c;经过预处理与筛选的过程得到最终的训练数据&#xff1a; a…

2024 年最佳 Figma 字体

字体不仅仅是文本字符&#xff0c;它们还塑造了用户体验。从引导用户浏览界面到传达品牌个性&#xff0c;字体对于设计​​至关重要。然而&#xff0c;找到适合您的网站或应用风格的完美字体可能具有挑战性。 但不要害怕&#xff0c;我们会帮助您&#xff01;请继续关注&#x…

C语言 指针和数组——指针的算术运算

目录 指针的算术运算 指针加上一个整数 指针减去一个整数 指针相减 指针的关系比较运算 小结 指针的算术运算 指针加上一个整数 指针减去一个整数 指针相减 指针的关系比较运算 小结  指针变量 – 指针类型的变量&#xff0c;保存地址型数据  指针变量与其他类型…

负载均衡(服务器)

vi /etc/sysconfig/network-scripts/ifcfg-ens33 systemctl restart network 防火墙 systemctl stop firewalld systemctl disable firewalld vi /etc/selinux/config setenforce 0 yum install gcc gcc-c mkdir /lnmp cd /lnmp/ tar -zxvf zlib-1.2.12.tar.gz tar -zxv…

[C++][CMake][CMake基础]详细讲解

目录 1.CMake简介2.大小写&#xff1f;3.注释1.注释行2.注释块 4.日志 1.CMake简介 CMake是一个项目构建工具&#xff0c;并且是跨平台的 问题 – 解决 如果自己动手写Makefile&#xff0c;会发现&#xff0c;Makefile通常依赖于当前的编译平台&#xff0c;而且编写Makefile的…

vue的学习--day3

1、尝试使用json文件模拟增删改查 json server:准备一份自己的数据&#xff08;这里我用的是老师给的&#xff09;。 转到d盘&#xff0c;然后打开json文件&#xff1a; 下面模拟增删改查&#xff1a; 借助工具postman或apifox或apipost&#xff1a; 这里我下载了apifox&…

产品公告 | MemFire Cloud 现已支持微信授权登录,为移动应用带来更便捷的认证服务

MemFire Cloud推出的“开箱即用”的后端服务&#xff0c;提供了云数据库、身份验证与授权、云存储、静态托管、实时realtime、自动生成API等功能&#xff0c;本次升级新增/优化功能如下&#xff1a; 标题微信授权登录&#xff08;移动应用&#xff09; 为了顺应国内用户的使用…

Elasticsearch:Ingest architectures - 摄取架构

我们提供各种采集架构&#xff0c;以满足各种用例和网络配置的需求。 要将数据采集到 Elasticsearch&#xff0c;请使用最符合你的需求和用例的选项。对于许多用户和用例来说&#xff0c;最简单的方法是使用 Elastic Agent 采集数据并将其发送到 Elasticsearch。Elastic Agent…

深度学习——深度学习中感受野的计算

感受野 在卷积神经网络&#xff08;CNN&#xff09;中&#xff0c;感受野&#xff08;Receptive Field&#xff09; 是一个非常重要的概念。它描述了网络中某一层的输出&#xff08;通常是特征图上的一个像素点&#xff09;所对应的输入图像上的空间范围。这个范围代表了该输出…

SARscape——地理编码与辐射定标

目录 一、算法原理1、概述2、参考文献 二、软件操作三、结果展示1、原始图像2、处理结果 一、算法原理 1、概述 SAR系统观测到的是电磁波入射地球表面后反射&#xff08;后向散射&#xff09;的雷达脉冲的强度和相位信息。这个信息编码到雷达坐标系统下&#xff0c;即斜距坐标…

数据结构之二叉树概念

数据结构之二叉树 二叉树简介分类普通二叉树平衡二叉树满二叉树二叉搜索树&#xff08;二叉排序树、二叉查找树&#xff09;&#xff0c;平衡二叉树红黑树 B树类型B树&#xff08;B-树、B_树&#xff09;B树B*树 二叉树 简介 二叉树(Binary Tree) &#xff1a;是一种非常重要…

头歌资源库(19)在排序数组中查找元素的首尾位置

一、 问题描述 二、算法思想 该问题可以通过二分查找的思想来解决。 首先&#xff0c;我们可以使用二分查找找到目标值在数组中的任意一个位置&#xff08;即该位置的值等于目标值&#xff09;。假设找到的位置为mid。 接下来&#xff0c;我们需要在mid的左边和右边分别找到…

UNIAPP_顶部导航栏右侧添加uni-icons图标,并绑定点击事件,自定义导航栏右侧图标

效果 1、导入插件 uni-icons插件&#xff1a;https://ext.dcloud.net.cn/plugin?nameuni-icons 复制 uniicons.ttf 文件到 static/fonts/ 下 仅需要那个uniicons.ttf文件&#xff0c;不引入插件、单独把那个文件下载到本地也是可以的 2、配置页面 "app-plus":…

Python爬虫+数据分析+数据可视化图形-爬取高校排名数据

①本文主要使用python 爬取了中国大学排名前30的大学信息&#xff0c;并进行了数据处理及分析&#xff0c;是一个比较经典的python爬虫和分析项目 ②主要内容:爬虫数据预处理数据可视化分析 完整代码请看这里拿&#x1f447;↓↓↓

Mac本地部署大模型-单机运行

前些天在一台linux服务器&#xff08;8核&#xff0c;32G内存&#xff0c;无显卡&#xff09;使用ollama运行阿里通义千问Qwen1.5和Qwen2.0低参数版本大模型&#xff0c;Qwen2-1.5B可以运行&#xff0c;但是推理速度有些慢。 一直还没有尝试在macbook上运行测试大模型&#xf…

我这个经验好找嵌入式的工作吗?

大家好&#xff0c;我是麦鸽。最近网友的提问&#xff0c;这样的经验&#xff0c;好找嵌入式的工作吗&#xff1f; 下面是网友的情况&#xff1a; 本人目前大二机器人工程&#xff0c;未来想要入职嵌入式行业&#xff0c;有robomaster比赛经验本人负责电控&#xff0c;但是由于…