Java 基础面试300题 (171- 200)
Java 基础面试300题 (171- 200)
171.什么是同步?
当多个线程试图同时访问共享资源时,那么他们需要以某种方式让资源一次只能由一个线程访问。实现这一目标的过程被称为同步。Java提供了一个名为synchronized
的关键字实现这一目标。
172.执行以下代码时会发生什么?
class TestMyRunnable implements Runnable {
public void run() {
System.out.println(“Inside Run Method..”);
System.out.println(“Name of thread is– “:Thread.currentThread().getName());
}
}
class TestMyThread {
public static void main(String argument[]) {
TestMyRunnable runnable = new TestMyRunnable();
Thread thread = new Thread(runnable);
Thread.setName(“My Thread”); //Line 1
thread.start(); //Line 2
}
}
上述代码编译没有问题。执行第1行时,将线程的名称设置为My Thread
,执行第2行时,会生成一个新的线程,并执行run()
方法中的代码,该方法在控制台上打印如下一些信息:
Inside Run Method.
Name of thread is: My Thread
173. 下面代码首先打印“Thread 1”1000次,然后打印“Thread 2” 1000次,是否正确?
class TestMyRunnable implements Runnable {
public void run() {
for (int iValue = 0; iValue < 1000; iValue++)
System.out.println(“Name of thread is: “+Thread.currentThread().getName());
}
public static void main (String argument[]) {
TestMyRunnable runnable = new TestMyRunnable();
Thread threadC = new Thread(runnable);
Thread threadD = new Thread(runnable);
threadC.setName(“Thread 1”);
threadD.setName(“Thread 2”);
threadC.start();
threadD.start();
}
}
不正确。 执行上述代码时, 不会如问题所说述,首先打印Thread 1
1000次,然后 Thread 2
1000次。线程执行的顺序取决于线程调度器。因此,尽管最终两个线程都会打印1000次名称,但它们打印的顺序是不确定的,有可能是交错打印。
174.如何使线程暂停十分钟?
为了使线程暂停十分钟,需要在run()
方法中调用sleep()
方法。这个方法接受一个长整形参数,其值表示线程以毫秒为单位的睡眠时间。如下代码所示:
try {
Thread.sleep(10 * 60 * 1000)
}
catch(InterruptedException exp) {
}
175. 当调用同步方法时会发生什么?
每当执行同步方法时,调用该方法的线程都会获取一个锁,并将锁一直保持到在方法结束 。然后释放锁。 因此,其他线程可以再次获取锁并执行该方法。因此,同步(synchronized)关键字可防止多个线程在同步方法中同时执行代码。
176.执行以下代码时会发生什么?
File myFile = new File(“CoreJava.txt”);
执行上述代码时,JVM在内存中会创建一个名为myFile
的Java 文件对象,但并不会文件系统上实际创建文件 。为了实际创建文件,需要调用myFile.createNewFile()
方法。
177.如何创建路径为/usr/test.txt
文件?
下面代码将在/usr/
目录中创建一个文件test.txt
:
try {
File txtFile = new File(“/usr/test.txt”); // Line 1
txtFile.createNewFile(); // Line 2
} catch (IOException exp) {
}
在上述代码中,执行第1行时,在内存中创建一个文件对象txtFile
, 执行第2行时,在文件夹/usr/
中创建文件test.txt
178.用代码示例解释FileWriter
类。
FileWriter
类用于将字符或字符串写入文件,而无需将其转换为字节数组。它们是PrintWriter
或BufferedWriter
的包装类,因而能提供更好的性能和更多的数据写入方法。以下代码演示了FileWriter
:
try {
File txtFile = new File(“/usr/CoreJava.txt”);
FileWriter myFileWriter = new FileWriter(txtFile);
myFileWriter.write(“Line 1 \n Line 2 \n”); // Line 1
myFileWriter.flush();
myFileWriter.close();
} catch (IOException exp) {
}
在上述代码中,当执行第1行时,write()
方法将内容写入文件CoreJava.txt
179.如何使用FileReader
读取文件/usr/CoreJava.txt
中的内容,并在控制台上输出?
下面代码演示了如何使用FileReader
读取指定文件中的内容,并在控制台上输出:
try {
File txtFile = new File(“F:/CoreJava.txt”);
char [] totalChar = new char[1000];
FileReader myFileReader = new FileReader(txtFile);
myFileReader.read(totalChar); //Line 1
for(char readChar: totalChar) {//Line 2
System.out.print(readChar);
}
myFileReader.close();
}
catch (IOException exp) {
}
执行第1行时,read()
方法将文件内容读取到totalChararray
中。 第2行开始的for
循环将数组的内容打印到控制台
180.如何在文件系统上创建目录?
File
类有一个名为mkdir()
的方法,用来创建一个与指定文件对象相对应的目录。 下面代码使用此方法在文件系统中创建一个目录:
File myDirectory = new File(“/usr/mydir”); //Line 1
myDirectory.mkdir(); //Line 2
第1行创建一个文件对象。第2行调用mkdir()
方法来创建实际目录。
181. 编译和执行下面代码时会发生什么?
File myDirectory = new File(“/usr/JavaCodes”);
File myNewFile = new File(“/usr/JavaCodes/CoreJava.txt”); //line 1
myNewFile.createNewFile();
上述代码会抛出IOException
。这是因为没有创建目录/usr/JavaCodes/
,只创建了与之对应的文件对象myDirectory
。为了使代码正常工作,需要在第1行之前添加如下代码:
myDirectory.mkdir();
182. PrintWriter
类有什么作用?
PrintWriter
是Writer
类的特定实现,可用于将对象的格式化表示写入到到文件系统 。 下面代码演示了如何使用PrintWriter
来写入字符串:
File myNewFile = new File(“/usr/CoreJava.txt”);
PrintWriter myPrintWriter = new PrintWriter(myNewFile); //Line 1
myPrintWriter.println(“This gets inserted into the File”); //Line 2
myPrintWriter.close(); //Line 3
在上述代码中,执行第1行时,将在文件夹/usr/
中创建文件CoreJava.txt
。 执行第2行时,调用PrinterWriter
类的println()
方法将字符串写入文件CoreJava.txt
。执行第3行时,关闭文件。 最终内容会被保存到文件中。
183. 如何删除文件?
File
类有一个名为delete()
的方法,用于删除文件。如下 代码示例:
File myNewFile = new File(“/usr/CoreJava.txt”);
boolean success = myNewFile.delete(); //Line 1
在上述代码中,执行第1行时,delete()
方法会删除指定的文件。它返回一个布尔值,表示文件删除是否成功。
184. 如何重命名文件或目录?
File
类有一个名为renameTo()
的方法,用于重命名文件或目录。如下代码示例 :
File file1 = new File(“/usr/file1.txt”);
file1.createNewFile();
File file2 = new File(“/usr/file2.txt”);
file1.renameTo(file2); //Line 1
上述代码将文件file1.txt
重命名为file2.txt
。同样也可以对目录的重命名。下面代码将目录dir1
重命名为dir2
:
File dir1 = new File(“/usr/dir1”);
dir1.createNewFile();
File dir2 = new File(“/usr/dir2”);
dir1.renameTo(dir2); //Line 1
185.Java的哪些类用于序列化和反序列化对象?
序列化是将对象写入文件系统的过程。java.io.ObjectOutputStream
类可用于序列化对象。它有一个writeObject()
方法,用来将对象写到文件系统。反序列化是序列化的逆过程,用来从文件系统恢复序列化的对象。 java.io.ObjectInputStream
类可用于反序列化。它有一个readObject()
方法,可用于实现这一目标。
186. File
类上有哪一些重要方法?
文件类File
封装了文件系统上的文件或目录。File
类上的一些重要方法如下:
方法 | 描述 |
---|---|
createNewFile() | 创建一个新的空文件。 |
list() | 返回当前目录中的文件/目录数组。 |
delete() | 从文件系统中删除文件。 |
mkdir() | 创建一个目录。 |
getAbsolutePath() | 返回文件的绝对路径。 |
187. 编译执行下面代码片段时会发生什么?
public class Test {
public static void main(String argument[]) {
int iValue;
System.out.println(iValue);
}
}
上述代码将导致编译错误。这是因为局部变量iValue
没有初始化,而直接在Sysout语句中使用。 可以通过初始化变量iValue
来修复错误,具体如下:
int iValue = 0;
System.out.println(iValue);
188.编译执行下面代码片段时会发生什么?
class Calculate {
float fValue = 10.2f;
public static void main(String argument[]) {
System.out.println(“Float value is: “+fValue);
}
}
上述代码将导致编译错误,因为main
方法是静态方法,却试图访问非静态的实例变量fvalue
。Java不允许从静态方法访问非静态变量。
189.什么是对称相等合同?
假设有两个对象v1
和v2
。如果v1.equals(v2)
返回true
,则v2.equals(v1)
也返回true
。这个equals()
合同被称为对称相等合同。考虑以下代码,:
Object v1; Object v2;
v1.equals(v2); //Line 1
v2.equals(v1); //Line 2
因此,在对称相等合同的情况下,第1行返回true
,当且仅当第2行y也返回true
。
190. 下面代码哪项是错误的语句,为什么?
System.out.println(2+2); //line 1
int i= 2+’2’; //line 2
String s= “one”+’two’; //line 3
byte b=256; //line 4
第1行和第2行是有效的语句。
第3行错误。 Java中因为单引号不能用于字符串,它们只能用于字符常量。字符串需要用双引号括起来。
第4行也是错误语句。字节变量b
不能分配值256
,因为它不在字节类型的范围内。
191.瞬态transient
关键字的用途是什么?
可以在实例变量上指定transient
关键字,表示当对象序列化时,不应保存其值,换句话说,对象序列化时不会序列化 transient
的实例变量 。考虑以下代码片段:
class Electronics implements Serializable {
transient private int price; //Line 1
private int quantity; //Line 2
}
当序列化Electronics
类的实例时,价格字段price
将不会序列化,只有数量字段quantity
会序列化。
192.什么是Java中的垃圾回收?
垃圾回收是释放分配给不再使用的对象的内存的过程。在Java程序运行期间,当创建对象时,JVM会分配一些内存来保存对象。JVM会定期检查正在使用的对象,并回收那些不再使用的对象的内存。有了垃圾回收 ,程序员再也不必费心地手动释放内存。
193.内存的哪一部分用于垃圾回收?JVM使用哪种算法进行垃圾回收?
垃圾回收是在堆内存中完成的。JVM在内部使用标记和扫描算法进行垃圾回收。
194.垃圾回收什么时候发生?
JVM(Java虚拟机)控制垃圾回收的过程。因此,JVM决定垃圾回收 何时运行。虽然可以通过Java代码调用System.gc()
或Runtime.getRuntime().gc()
方法显式请求垃圾回收。 但并不能保证调用这些方法会运行垃圾回收。
195.如何通过代码触发垃圾回收?
垃圾回收可以通过以下方式之一触发:
- 方法1: 使用
Runtime.gc()
如下:
Runtime runTime = Runtime.getRuntime();
runTime.gc();
- 方法2: 使用
System.gc()
如下:
System.gc();
这两种方法都不能保证垃圾被立即回收,它们只是请求JVM 执行垃圾回收,最终由JVM实际决定何时运行垃圾回收。
196. 哪些对象有资格进行垃圾回收?
如果一个对象不再被引用时,它就有资格进行垃圾收集。下面几个场景中的对象都有资格成为垃圾回收的对象:
场景1-将对象设置为空
String stringValue = “This is a String value”; //Line 1
stringValue = null; //stringValue 有资格被回收
场景2-重新分配变量
String str1 = “Hello”;
String str2 = str1; // str1 有资格被回收
场景3-在方法中创建的对象
public void doSomething(){
String str1 = “Hello”;
}
public void callMethod(){
doSomething();
//doSomething 方法中的str1有资格被回收
}
197.什么是函数接口? 如何创建函数接口?
函数接口是一个只有一个抽象方法的接口。为了创建一个函数接口, 只需要简单创建一个只有一个抽象方法的接口,如下所示:
@FunctionalInterface
public interface Multiplier {
public int multiply(int a, int b);
}
上述代码定义了一个名为Multiplier
的接口,它只有一个抽象方法multiply()
。并用@FunctionalInterface
注解 , 此注释是可选的,它将接口标记为函数接口。如果向接口添加另一个抽象方法,代码会导致编译错误。
198.解释java.util.Function
包。
java.util.function
是Java 8新增的包。它有很多内置的函数接口如下:
函数接口 | 描述 |
---|---|
Predicate | 用于测试条件。它返回一个布尔值,指示条件是true 还是false 。它接受任何数据类型的参数。 |
Consumer | 用于对值进行操作。它接受任何数据类型的参数并对其进行操作。返回void 。 |
Function | 用于转换输入值。它接受任何数据类型的参数,将其转换为一种新类型并返回。 |
Supplier | 用于产生一个任何数据类型的值。它不接受任何参数。 |
199. 解释java.util.function.Consumer
接口。
java.util.function.Consumer
是一个内置的函数接口 。它是Java 8添加的java.util.function
包的一部分。它有一个accept()
方法,接受任何数据类型的参数并对其进行操作,也就是消费。因为是函数接口,因此可以通过lambda表达式实现。如下代码所示 :
Consumer<String> printStr = val–> System.out.println(val); //Line 1
printStr.accept(“Hello World”); //Line 2
上述代码中,第1行创建一个名为printStr
的字符串类型Consumer
, 并用一个lambda表达式实现其accept()
方法,lambda表达式的主体逻辑是在控制台简单打印输入字符串 。第2行调用接口的accept
方法,传入参数是“Hello World”。因此,代码打印以下输出:
Hello World
200. Supplier
和Consumer
两个接口有什么区别?
这两个接口都是java.util.function
包中的内置函数接口。两者之间有几个区别如下:
-
Supplier
接口不接受参数,Consumer
接口接受一个范型 参数 -
Supplier
接口返回一个范型类型的数据 ,Consumer
接口没有返回 -
Supplier
接口主要用于产生特定数据类型的值,而Consumer
接口则对特定数据类型的输入值进行操作。
相关文章:
Java 基础面试300题 (171- 200)
Java 基础面试300题 (171- 200) 171.什么是同步? 当多个线程试图同时访问共享资源时,那么他们需要以某种方式让资源一次只能由一个线程访问。实现这一目标的过程被称为同步。Java提供了一个名为synchronized的关键字实现这一目标…...

0基础学习Elasticsearch-使用Java操作ES
文章目录 1 背景2 前言3 Java如何操作ES3.1 引入依赖3.2 依赖介绍3.3 隐藏依赖3.4 初始化客户端(获取ES连接)3.5 发送请求给ES 1 背景 上篇学习了0基础学习Elasticsearch-Quick start,随后本篇研究如何使用Java操作ES 2 前言 建议通篇阅读再回…...
【Linux】GNU编译器基础
文章目录 GCCMakefile、make GCC 常见的GNU编译器是GCC其包含gcc以及g等,适用于C/C中,在Windows系统中通常使用IDE进行程序的编写和编译、链接等操作,但在Linux系统中通常使用GNU编译器来进行,对于C/C等高级语言需要进行预编译、编…...
Linux 软件安装:从源码编译到包管理器安装
Linux 软件安装:从源码编译到包管理器安装 在 Linux 操作系统中,软件安装是一个非常重要的任务。不同的软件安装方式有不同的优缺点,本篇博客将介绍 Linux 软件安装的几种方式,包括从源码编译安装、使用包管理器安装和使用第三方…...

Python3 match-case 语句
前言 本文主要介绍match-case语句与switch-case的区别,及match-case语句的基本用法。 文章目录 前言一、switch-case 和match-case的区别二、match-case的基本用法1、可匹配的数据类型2、多条件匹配3、通配符匹配 一、switch-case 和match-case的区别 C语言里面s…...
图论第三天
似乎要团建了,我再猫会。我必须参与上团建再走。 130.被围绕的区域 先把外围的O变成A,再把飞地的O变成X,再把外围A变回O class Solution { public:int neighbor[4][2] {1,0,0,-1,-1,0,0,1};void solve(vector<vector<char>>&a…...

计算机网络学习2
文章目录 信道复用技术 第三章数据链路层概述数据链路层的三个重要问题封装成帧和透明传输差错检测可靠传输的相关基本概念可靠传输的实现机制停止等待协议回退N帧协议选择重传协议 点对点协议PPP共享式以太网网络适配器和MAC地址CSMA_CD协议的基本原理共享式以太网的争用期共享…...

unittest框架
目录 框架: unittest框架: 使用的原因: 核心要素(组成): TestCase测试用例: 可能出现的错误: TestSuite(测试套件): TestRunner(测试执行): 整体步骤: 查看执行结果: TestLoader测试加载: 方法级别Fixture: 类级别Fixture: 模块级别Fixture: 用例脚本…...
Python中的__str__和__repr__:揭示字符串表示的奥秘
标题:Python中的__str__和__repr__:揭示字符串表示的奥秘 摘要 在Python中,对象的字符串表示对于调试和日志记录至关重要。__str__和__repr__是两个特殊的方法,用于定义对象的字符串表示形式。尽管它们在功能上相似,…...

gazebo插入一个图片
在下面的目录下添加文件夹 my_ground_plane 文件夹内容如下 model.sdf <?xml version"1.0" encoding"UTF-8"?> <sdf version"1.4"><model name"my_ground_plane"><static>true</static><link na…...
(已解决)Bootstrap精美弹出框模态框modal,实现js向modal传递数据
Modals是Bootstrap中用户弹框用的组件,使用时不需要额外引入其他插件,在引入了boostrap.js或者boostrap.min.js前提下就可以使用。 官方的示例: <!-- Button trigger modal --> <button type="button" class="btn btn-primary" data-bs-…...
网络编程介绍(IP)(一)
定义:可以让设备中的程序与网络上其他设备中的程序进行数据交互(实现网络通信的)。 java.net.*包下提供了网络编程的解决方案。 基本的通信架构: CS架构( Client客户端/Server服务端 ): Clie…...

C语言 指针——函数指针
目录 什么是函数指针? 函数指针的定义 定义函数指针时的常见错误 函数指针有什么用? 函数指针的主要应用 什么是函数指针? 函数指针 (Function Pointer) 就是指向函数的指针变量 数据类型 ( * 指针变量名 ) ( 形参列表 ); 例如&#x…...

【C++】———list容器
前言 1.list容器简单来说其实就是之前的链表结构。 2.这里的list用的是双向带头结点的循环链表。 目录 前言 一 构造函数 1.1 list (); 1.2 list (size_type n, const value_type& val value_type() ); 1.3 list (InputIterator first, InputIterator last…...

【网络安全技术】——期末复习(冲刺篇)
📖 前言:快考试了,做篇期末总结,都是重点与必考点。 题型:材料分析题、简答题、看图分析题 课本: 目录 🕒 1. 计算机网络安全概述🕘 1.1 安全目标🕘 1.2 常见的网络安全…...

Python中Web开发-Django框架
大家好,本文将带领大家进入 Django 的世界,探索其强大的功能和灵活的开发模式。我们将从基础概念开始,逐步深入,了解 Django 如何帮助开发人员快速构建现代化的 Web 应用,并探讨一些最佳实践和高级技术。无论是初学者还…...

1882java密室逃脱管理系统 Myeclipse开发mysql数据库web结构java编程计算机网页项目
一、源码特点 java密室逃脱管理系统 是一套完善的web设计系统,对理解JSP java编程开发语言有帮助采用了java设计,系统具有完整的源代码和数据库,系统采用web模式,系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发&…...

LeetCode 两两交换链表中的节点
原题链接24. 两两交换链表中的节点 - 力扣(LeetCode) 思路,请看图片的过程模拟,这里添加了一个哨兵节点0,目的是为了方便操作,得到指向1节点的指针。 class Solution {public:ListNode* swapPairs(ListNod…...

STM32作业实现(五)温湿度传感器dht11
目录 STM32作业设计 STM32作业实现(一)串口通信 STM32作业实现(二)串口控制led STM32作业实现(三)串口控制有源蜂鸣器 STM32作业实现(四)光敏传感器 STM32作业实现(五)温湿度传感器dht11 STM32作业实现(六)闪存保存数据 STM32作业实现(七)OLED显示数据 STM32作业实现(八)触摸按…...

java mybatis处理大数据量,开启和配置二级缓存,及注意事项,已解决
注意事项: 尽量避免使用下面方式写sql否则会降低服务器性能: mybatis二级缓存开启后,避免使用事务注解(加上事务注解后二级缓存数据会导致两次访问不一致问题): 3. 返回的对象实体类,要实现Se…...

UE5 学习系列(二)用户操作界面及介绍
这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…...
生成xcframework
打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式,可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...
基于大模型的 UI 自动化系统
基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...
树莓派超全系列教程文档--(62)使用rpicam-app通过网络流式传输视频
使用rpicam-app通过网络流式传输视频 使用 rpicam-app 通过网络流式传输视频UDPTCPRTSPlibavGStreamerRTPlibcamerasrc GStreamer 元素 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 使用 rpicam-app 通过网络流式传输视频 本节介绍来自 rpica…...
unix/linux,sudo,其发展历程详细时间线、由来、历史背景
sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...
Xen Server服务器释放磁盘空间
disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...
LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》
这段 Python 代码是一个完整的 知识库数据库操作模块,用于对本地知识库系统中的知识库进行增删改查(CRUD)操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 📘 一、整体功能概述 该模块…...
Python Einops库:深度学习中的张量操作革命
Einops(爱因斯坦操作库)就像给张量操作戴上了一副"语义眼镜"——让你用人类能理解的方式告诉计算机如何操作多维数组。这个基于爱因斯坦求和约定的库,用类似自然语言的表达式替代了晦涩的API调用,彻底改变了深度学习工程…...
第7篇:中间件全链路监控与 SQL 性能分析实践
7.1 章节导读 在构建数据库中间件的过程中,可观测性 和 性能分析 是保障系统稳定性与可维护性的核心能力。 特别是在复杂分布式场景中,必须做到: 🔍 追踪每一条 SQL 的生命周期(从入口到数据库执行)&#…...

【从零开始学习JVM | 第四篇】类加载器和双亲委派机制(高频面试题)
前言: 双亲委派机制对于面试这块来说非常重要,在实际开发中也是经常遇见需要打破双亲委派的需求,今天我们一起来探索一下什么是双亲委派机制,在此之前我们先介绍一下类的加载器。 目录 编辑 前言: 类加载器 1. …...