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…...

手游刚开服就被攻击怎么办?如何防御DDoS?
开服初期是手游最脆弱的阶段,极易成为DDoS攻击的目标。一旦遭遇攻击,可能导致服务器瘫痪、玩家流失,甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案,帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...
JVM垃圾回收机制全解析
Java虚拟机(JVM)中的垃圾收集器(Garbage Collector,简称GC)是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象,从而释放内存空间,避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...

STM32标准库-DMA直接存储器存取
文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA(Direct Memory Access)直接存储器存取 DMA可以提供外设…...

《通信之道——从微积分到 5G》读书总结
第1章 绪 论 1.1 这是一本什么样的书 通信技术,说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号(调制) 把信息从信号中抽取出来&am…...

ABAP设计模式之---“简单设计原则(Simple Design)”
“Simple Design”(简单设计)是软件开发中的一个重要理念,倡导以最简单的方式实现软件功能,以确保代码清晰易懂、易维护,并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计,遵循“让事情保…...
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...
#Uniapp篇:chrome调试unapp适配
chrome调试设备----使用Android模拟机开发调试移动端页面 Chrome://inspect/#devices MuMu模拟器Edge浏览器:Android原生APP嵌入的H5页面元素定位 chrome://inspect/#devices uniapp单位适配 根路径下 postcss.config.js 需要装这些插件 “postcss”: “^8.5.…...

R语言速释制剂QBD解决方案之三
本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…...

人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式
今天是关于AI如何在教学中增强学生的学习体验,我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育,这并非炒作,而是已经发生的巨大变革。教育机构和教育者不能忽视它,试图简单地禁止学生使…...
Git常用命令完全指南:从入门到精通
Git常用命令完全指南:从入门到精通 一、基础配置命令 1. 用户信息配置 # 设置全局用户名 git config --global user.name "你的名字"# 设置全局邮箱 git config --global user.email "你的邮箱example.com"# 查看所有配置 git config --list…...