Java 基础面试300题 (141- 170 )

Java 基础面试300题 (141- 170 )

141. 编译运行以下代码时会发生什么?

class Mammal {}
class Cat extends Mammal { }
List<Mammal> list = new ArrayList<Cat>();

上述代码将出现编译错误。这是因为为List指定了Mammal哺乳动物为其元素类型,而为ArrayList指定了Cat 为其元素类型 。在涉及到集合类型时,Java规则是,变量声明的类型必须与其实现的类型相匹配。因此,需要在ListArrayList中指定相同的数据类型。

142.下面代码中的第1行会编译吗?

class Mammal {}
class Cat extends Mammal { }
List<? super Mammal> mList = new ArrayList<Cat>(); // line 1

第1行将导致编译错误。这是因为Cat 的层次结构比其超类Mammal 要低。因此,只有当<Cat>替换为<Mammal><Object>时,上述代码才会编译通过。

143. 以面代码有什么问题吗?

List<?> mylist = new ArrayList<? extends Mammal>();

上面代码创建了一个名为mylist 的列表, 并在列表的类型声明中使用了通配符 (),会导致编译错误,因为不能够在声明部分使用范型通配符。泛型的通配符仅允许在出现在方法参数或返回值中。

144.以面下代码片段有效吗?

public void getList(T t)

上述代码使用范型参数声明了名为getList()的方法(范型方法)但却没有定义范型参数,因而是错误的。 下述两种方式均可解决此问题:

//方式一,定义范型类
public class MyClass<T> {
public void getList(T t){
}
}
//方式二,定义范型方法 
public class MyClass  {
public <T> void getList(T t){
}
}

145. 什么是有界(Bounded)范型类型?

有界泛型类型有助于限制可用作泛型参数的类型。如下代码示例:

public class Shape {
}
public class Circle extends Shape{
}
public class ShapeDrawer<T extends Shape> {
public void drawShape(T shape) {
System.out.println(Drawing Shape..);
}
}

上述代码声明了一个名为Shape的超类,Circle类是Shape的子类。代码还声明了一个ShapeDrawer类, 这是一个范型类 ,它并没有直接定义范型类型T,而是指定T 必须扩展Shape类, 以对T的类型实施了进一步限定, 这意味着范型 T应该是Shape 的子类,如果用不是Shape子类的参数调用drawShape() 方法 ,将发生编译错误。

146. Java 集合 API中的四个主要接口是什么?

java.util.Collection接口是Java 集合 API中的顶级接口。 它仅仅简单表达了作为一个整体单元操作的一组值。 它有两个主要的子接口SetList。 两者都用于存储一组数据值; 但存储方式略有不同。

List 允许重复的元素,同一元素可以多次出现。 此外,List是有序的,列表中的元素按插入的顺序存储,并保持此顺序。

Set不允许元素重复,而且其中的元素是无序的,Set不会保留 元素插入顺序。

Map接口也是一个顶级接口,用于存储键值对。

147. 如何搜索数组中的特定元素?

作为集合框架的一部分,Java提供java.util.Arrays 类 , 该类有几种实用方法, 可用于搜索数组中的特定元素。其中一种方法是Arrays.binarySearch方法(二分搜索法), 它返回一个整数, 表示正在搜索的元素(如果存在)的在数组中的索引, 如果不存在,返回 -1。 以下代码演示了其使用方法:

String [] strArr = {“one”, “two”, “four”};
System.out.println(Search index of one is:+Arrays.binarySearch(strArr, “one”));//输出
Search index of one is:0

148.如果不允许元素重复,但不关心顺序, 应选择那种 集合类型?

如果想避免重复并且不关心顺序,则应使用HashSetHashSetSet接口的实现,它是未排序和无序的。TreeSetLinkedHashSet也是Set的实现。二者都不允许重复。但TreeSet保持排序顺序,而LinkedHashSet保持插入顺序。

149. 用代码解释如何删除队列头?

Queue接口有有一个名为poll()的方法,可用于删除队列的头部。以下代码演示了这一点:

Queue<Integer> lList = new LinkedList<Integer>();
lList.add(100);
lList.add(200);
System.out.println(Removed– “:lList.poll()); // Line 1

此代码创建一个队列,并向其添加两个整数值。然后,它调用poll()方法。 输出如下:

The Element removed is: 100

因此,poll()方法总是删除队列的头部,即在队列中添加的第一个元素。

150.哪种集合的实现允许增加或缩小其大小,并可按索引方式访问其元素?

ArrayListList接口的实现。它允许增加或缩减其尺寸。它有增加/缩减方法,可以增加或减少列表的大小。它还提供了对其元素的索引访问。 如下代码简单演示了ArrayList

List<Integer> myList = new ArrayList<Integer>();
myList.add(2);
myList.add(4);
myList.add(6);
myList.remove(1);
Integer num = myList.get(0);

151.简单解释Queue接口。

队列接口是Java 集合 API的一部分,它扩展了java.util.Collection接口。除了正常的集合操作外,队列还提供了FIFO(先进先出)等队列数据结构的功能。队列接口有 下面几种操作队列的方法:

  • peek():允许检查队列顶部的元素
  • poll():删除队列顶部的元素
  • offer():在队列中插入一个元素

152.简单解释Comparator接口 。

Comparator是一个可用于排序的接口。自Java 8以来,它一直被指定为函数接口。它仅有单个名称为compare的抽象方法。该方法接受两个对象,并返回一个布尔值,表示比较结果。比较器接口也可用于对自定义对象进行排序,为此,相应的类需要实现比较器接口,并为其compare方法提供具体实现。如果是Java 8或更高版本, 还可以使用lambda表达式实现比较器。

153. 队列接口主要有些什么方法?

下表是队列主要有下面一些方法:

方法描述
offer(E e)将对象添加到队列中。如果失败 ,不会抛出异常。
peek()返回队列中最后添加的对象。
poll()检查并返回队列中头元素,如果存在,将其从队列中移除。
remove(Object o )从队列中移除对象。
add(E e)将对象添加到队列中。如果添加失败,则抛出异常。

154.是否可以混合使用普通集合和范型集合?

可以混合范型集合和非范型集合。如下代码片段示例:

public void insertDouble() {
List<Double> myDoubleList = new ArrayList<Double>();
myDoubleList.add(2.0); // Line 1
myDoubleList.add(4.0); // Line 2
insertSomethingElse(myDoubleList);
}
public void insertSomethingElse(List myDoubleList) {//Line 3
myDoubleList.add(Hello World); //Line 4
}

在上述代码中,第1行和第2行添加两个双精度Double数到列表中,该列表是一个类型为Double的范型列表。 在第3行的insertSomethingElse()方法声明中,没有为参数myDoubleList变量指定泛型类型。因此,任何类型的值都可以添加到此列表中。第4行将一个字符串添加到该列表中。

155. Collection接口上有哪些重要方法?

以下是Collection 接口上的一些重要方法:

方法描述
add向集合中添加对象。
remove从集合中移除对象。
contains检查集合中是否存在对象。
size返回集合的长度。
iterate在集合上进行迭代。

156.Java中可用的包装类是什么?

包装类是对应于Java基础类型的类,其主要作用是将基础类型转换为对象类型,反之亦然。使用Collections时,包装类特别有用。由于Collections不接受原始类型,应使用相应的包装类型进行包装。Java支持以下包装类:

基础类型包装类型
byteByte
shortShort
intInteger
longLong
floatFloat
doubleDouble
charCharacter
booleanBoolean

157. 以下代码的输出是什么?

public class BooleanDemo {
public static void main(String a[]){
//create Boolean using boolean primitive type
boolean boo1 = true;
Boolean booObj1 = new Boolean (boo1); //line 1
System.out.println(Wrapper class Boolean output:+booObj1);
Boolean booObj2 = new Boolean (false); //line 2
System.out.println(Wrapper class Boolean output:+booObj2);
System.out.println(booObj1.booleanValue());
}
}

第1行创建一个布尔包装器类型boolObj1,对应于bool类型变量。第2行使用String值创建一个布尔包装器boolObj2。Java自动将包装类型转换为基础类型。此外,在布尔包装类上有一个名为booleanValue()的方法,返回原始布尔值。因此,上述代码将打印以下输出:

Wrapper class Boolean output: true
Wrapper class Boolean output: false
true

158. 如何将字符串“100.55”转换为双精度(Double)?如何将双精度数100.55 转换为字符串?

可以使用 Double.parseDouble()方法将字符串转换为Double,如下所示:

Double doubleValue = Double.parseDouble(100.55);

可以使用Double.toString()方法将Double转换为字符串,如下所示:

String stringValue = Double.toString(100.55);

159.以下代码的输出是什么?

Double doubleValue = Double.parseDouble(Java);
System.out.println(doubleValue);

上述代码编译没有问题,但是在执行时会抛出NumberFormatException,这是因为JVM无法将字符串Java转换为Double值。

160.什么是Java中的包装类?

Java是一种面向对象的语言。但是Java中的基础数据类型不是对象类型。有时,需要这些类型的对象等价物。比如使用Collections时, 由于集合只能包含对象,不能包含基础类型。为了解决这个问题,Java引入了包装类,用来将基础类型包装成对象。每个基础类型都有一个相应的包装类,可以创建该类型的对象。同样,也可以将包装对象转换为基础类型。例如,与int 基础类型对应的包装器类是 java.lang.Integer。Java在基础类型和相应的包装类之间自动转换。

161.什么是自动装箱?

自动装箱(和自动拆箱)是Java 5中引入的一项功能,它可以帮助程序员减少一些冗余代码。

例如,为了给包装类分配一个基础类型的值,如果没有自动装箱,则需要按以下方式编写包装代码:

Integer integerValue = new Integer(1000); //wrapping

通过自动装箱,上述代码可以重写如下:

Integer integerValue = 1000;

同样,为了将包装类型的值分配给基础类型 ,需要编写解包代码。如下示例:

Integer integerValue = 1000;
int iValue = integerValue.intValue(); //unwrapping

通过自动装箱,上述代码可以重写如下:

Integer integerValue = 1000;
int iValue = integerValue;

162. 如何在Java中创建线程?

在Java中创建线程有两种方法:

通过扩展Thread类:在这种方法中, 需要创建一个扩展内置Thread类的类,重写其run()方法。如下代码示例:

public class MyThread extends Thread {
public void run(){
System.out.println(In Thread Body..);
}
}

通过实现Runnable的接口:在这种方法中,需要创建一个实现内置Runnable接口的类, 实现该接口的run()方法。 如下代码所示 :

public class MyThread implements Runnable{
public void run(){
System.out.println(In Thread Body..);
}
}

163. Java中有哪几种不同类型的线程?

Java中有2种类型的线程: 用户定义的线程和守护线程。

用户定义的线程是由用户以编程方式创建的线程, 它们的优先级较高。JVM会等待这些线程执行完成。

守护线程主要由JVM创建(虽然用户定义的线程也可以显式设置为守护线程),通常用于后台进程,如垃圾收集。

一旦所有用户线程(非Daemon线程)停止运行,JVM就会停止运行,JVM并不会等待守护线程停止,或执行完成。

164.是否可以不调用线程对象的start()方法,直接调用其run() 方法?

可以直接调用线程对象的run()方法,而不调用其start()方法。但这没有什么意义,因为,它不会产生新的线程,run()方法中的代码将在调用它的同一线程中执行。

165.当执行以下代码时,幕后会发生什么?

class Test {
public static void main(String argument[]) {
System.out.println(Thread Example...);
}
}

执行上述代码时,JVM会首先创建一个线程, 该线程执行main方法中的代码。 执行完毕,线程终止。

166. Thread类主要有哪些方法?

方法描述
start()启动线程并调用 run() 方法。
run()定义线程中执行的代码。
sleep()使运行中的线程暂停指定的时间。
setName()将线程的名称设置为指定的值。
join()在不超过指定的多时间内,等待线程死亡。
isAlive()返回一个布尔值,指示当前线程是否存活。
setPriority()将线程的优先级更改为指定的值。

167.线程有哪些状态?它们之间是什么关系?

线程有下面五个状态。如下表所示:

状态描述
New (新建)创建了一个新的线程,但尚未调用 start() 方法时,线程处于新状态。
Runnable (可运行)在调用 start() 方法后,但线程调度程序尚未开始执行线程之前,线程处于可运行状态。
Running (正在运行)当线程调度程序开始执行线程时,线程处于运行状态,执行 run() 方法体内的代码。
Waiting / Blocking(等待/阻塞)如果线程是活动的,但不符合运行条件,则处于阻塞状态。
Dead (死亡)线程执行完毕后,进入死亡状态。

168. 如何使用Thread类创建线程 ?

以下代码使用“线程”类创建一个线程:

class MyThread extends Thread {
public static void main(String argument[]) {
MyThread thread = new MyThread ();
thread.start(); // Line 1
}
public void run() {
System.out.println(Inside Run Method..);// Line 2
}
}

上面的代码定义了一个名为MyThread的类,该类扩展了Thread类。执行第1行时,会生成一个新线程,然后该线程将执行run()方法中的代码。

169.如何使用 Runnable接口创建线程?

下面代码通过实现Runnable接口创建一个新线程:

class MyThread implements Runnable {
public static void main(String argument[]) {
MyThread myThread = new MyThread();
Thread thread = new Thread(myThread); //Line 1
thread.start(); // Line 2
}
public void run() {
System.out.println(Inside Run Method..);
}
}

上面的代码定义了一个名为MyThread的类,该类实现了Runnable接口 。然后, 创建了一个该类的对象 myThread,并在第1行将其传递给Thread类以创建一个新线程对象。 第2行调用start()方法生成一个新线程, 并执行run()方法中定义的代码。

170.是否可以创建多个线程? 多线程之间如何相互通信?

可以在Java程序中创建多个线程。对于两个线程相互通信,需要使用来自Object类的方法wait()notify()notifyAll()

wait()方法导致当前线程暂停,直到其他线程在同一对象上调用notify()

如果有许多对象都在等待特定对象,notify()方法会导致任何一个线程恢复(执行)。notifyAll()方法会使所有等待特定对象的线程恢复(执行)。

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

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

相关文章

SpringSecurity6从入门到实战之整合原生Filter链

SpringSecurity6从入门到实战之整合原生Filter链 DelegatingFilterProxy 从官网上来进行学习可以看到第一个类就是DelegatingFilterProxy,我们首先看看官网给下的定义. Spring提供了一个名为DelegatingFilterProxy的过滤器实现&#xff0c;它允许在Servlet容器的生命周期和Spr…

Raid的全局热备和独立热备

目录 Hot Spare背景: 1.定义与功能 2.数据存储与容量 3.配置模式 4.数量限制&#xff1a; 5.数据重建: 6.管理与维护 实操全局热备和独立热备&#xff1a; 配置全局热备: 配置独立热备: Hot Spare背景: 在RAID配置中&#xff0c;Hot Spare(热备)是一个非常重要的概念…

amis源码 Api接口调用解析:

Amis中传入用户自定义fetcher(基于fetcher做接口调用)&#xff1a; 1.embed渲染时可以传入用户定义的fetcher(接口调用)&#xff1a; import axios from "/libs/api.request"; //自定义的fetcher调用接口&#xff08;axios调用&#xff09; { fetcher: ()>{ ……

发现一个ai工具网站

网址 https://17yongai.com/ 大概看了下&#xff0c;这个网站收集的数据还挺有用的&#xff0c;有很多实用的ai教程。 懂ai工具的可以在这上面找找灵感。

善听提醒遵循易经原则。世界大同只此一路。

如果说前路是一个大深坑&#xff0c;那必然是你之前做的事情做的不太好&#xff0c;当坏的时候&#xff0c;坏的结果来的时候&#xff0c;是因为你之前的行为&#xff0c;你也就不会再纠结了&#xff0c;会如何走出这个困境&#xff0c;是好的来了&#xff0c;不骄不躁&#xf…

事先预判事的结果事先预防从容应对防微杜渐

很多人呢&#xff0c;学习倪老师的知识&#xff0c;也都是从他的中医方面&#xff0c;认识了他很多的东西呢&#xff0c;对于倪老师的知识性的总结的东西呢&#xff0c;不是很了解。 其实啊&#xff0c;倪老师也是一个&#xff0c;对于这种文化的传承&#xff0c;有着很大很深刻…

一些汇编语言的总结

一、汇编语言的介绍 1、汇编语言和处理器指令集高度相关&#xff0c;不同指令集的汇编语言不兼容。 2、汇编语言是对机器语言的一种抽象&#xff0c;用英文字符来代表运算和控制指令&#xff0c;用英文字母和数字代表操作数。 二、常用的汇编语言 有 x86的汇编语言&#xff…

YOLOv10涨点改进:卷积魔改 | 分布移位卷积(DSConv),提高卷积层的内存效率和速度

💡💡💡本文改进内容: YOLOv10如何魔改卷积进一步提升检测精度?提出了一种卷积的变体,称为DSConv(分布偏移卷积),其可以容易地替换进标准神经网络体系结构并且实现较低的存储器使用和较高的计算速度。 DSConv将传统的卷积内核分解为两个组件:可变量化内核(VQK)和…

iOS编程入门:揭秘神秘的开发世界

iOS编程入门&#xff1a;揭秘神秘的开发世界 在数字化时代的浪潮中&#xff0c;iOS编程成为了许多开发者热衷探索的领域。想要入门iOS编程&#xff0c;不仅需要掌握基础知识&#xff0c;还需理解其独特的生态系统。本文将通过四个方面、五个方面、六个方面和七个方面&#xff…

golang中通过反射获取结构体Tag标签定义的内容 函数和测试用例

当我们在go语言中定义结构体的时候&#xff0c; 经常需要给某些字段打上一个Tag标签, 如 Name string json:"name" , 那这个标签有和作用呢&#xff1f; 这个作用可大了&#xff0c;最为常用的是json序列化和反序列化&#xff0c; 还有各种ORM 的实体对象定义&…

C# yolov8 TensorRT +ByteTrack Demo

C# yolov8 TensorRT ByteTrack Demo 目录 效果 说明 项目 代码 Form2.cs YoloV8.cs ByteTracker.cs 下载 参考 效果 说明 环境 NVIDIA GeForce RTX 4060 Laptop GPU cuda12.1cudnn 8.8.1TensorRT-8.6.1.6 版本和我不一致的需要重新编译TensorRtExtern.dll&…

微调医疗大模型,与通用大模型效果对比

下面是一份CT描述&#xff1a; “肝脏大小、形态未见明确异常。肝S2见一结节状低密度影&#xff0c;大小约13x11mm&#xff0c;增强扫描呈明显渐进性强化&#xff0c;延迟期呈等密度。余肝实质内未见异常密度影或强化灶。肝内大血管及其分支走行未见异常&#xff0c;肝门区层次…

ip地址告诉别人安全吗?ip地址告诉别人会有什么风险

IP地址告诉别人安全吗&#xff1f;在数字化时代&#xff0c;IP地址作为网络连接的关键标识符&#xff0c;承载着重要的安全意义。然而&#xff0c;很多人可能并不清楚&#xff0c;轻易地将自己的IP地址告诉他人可能带来一系列安全风险。那么&#xff0c;IP地址告诉别人会有什么…

文件夹损坏0字节:全面解析、恢复技巧与预防策略

在数字时代&#xff0c;数据的完整性和安全性至关重要。然而&#xff0c;我们时常会遭遇文件夹损坏并显示为0字节的棘手问题。这种情况一旦发生&#xff0c;用户可能会面临数据丢失的风险。本文将详细探讨文件夹损坏0字节的现象&#xff0c;分析其背后的原因&#xff0c;并提供…

Redis-重定向

实验环境&#xff08;3主3从的Redis-Cluster&#xff09; 一、Redis重定向基础篇 1、MOVED重定向 Redis Custer 中&#xff0c;客户端可以向集群中任意节点发送请求。此时当前节点先对 Key 进行 CRC 16 计算&#xff0c;然后按 16384 取模确定 Slot 槽。确定该 Slot 槽所对应的…

为什么使用短链系统?

短链接&#xff08;Short Link&#xff09;是指将一个原始的长 URL&#xff08;Uniform Resource Locator&#xff09;通过特定的算法或服务转化为一个更短、易于记忆的 URL。短链接通常只包含几个字符&#xff0c;而原始的长 URL 可能会非常长。 短链接的原理非常简单&#x…

FPGA编程与PLC编程的区别:深入解析与对比

FPGA编程与PLC编程的区别&#xff1a;深入解析与对比 在工业自动化和控制系统领域&#xff0c;FPGA&#xff08;现场可编程门阵列&#xff09;编程和PLC&#xff08;可编程逻辑控制器&#xff09;编程都是关键的编程技术&#xff0c;但它们在应用、功能、结构和编程方法上存在…

IEEE编程语言排行榜:深度解析编程语言的四大维度、五大趋势、六大热门与七大挑战

IEEE编程语言排行榜&#xff1a;深度解析编程语言的四大维度、五大趋势、六大热门与七大挑战 在信息技术领域&#xff0c;编程语言排行榜一直是衡量各种编程语言流行度和影响力的重要指标。IEEE&#xff08;电气电子工程师协会&#xff09;作为全球最具影响力的科技专业组织之…

【Java数据结构】详解LinkedList与链表(二)

目录 1.❤️❤️前言~&#x1f973;&#x1f389;&#x1f389;&#x1f389; 2.反转一个单链表 3. 找到链表的中间节点 4.输入一个链表&#xff0c;输出该链表中倒数第k个结点。 5.合并两个有序链表 6.链表分割 7. 判定链表的回文结构 8.输入两个链表&#xff0c;找…

栈与队列练习题(2024/5/31)

1有效的括号 给定一个只包括 (&#xff0c;)&#xff0c;{&#xff0c;}&#xff0c;[&#xff0c;] 的字符串 s &#xff0c;判断字符串是否有效。 有效字符串需满足&#xff1a; 左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。每个右括号都有一个对应的…