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.pswp.cn/bicheng/20262.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/20262.shtml
英文地址,請注明出處:http://en.pswp.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; 左括號必須用相同類型的右括號閉合。左括號必須以正確的順序閉合。每個右括號都有一個對應的…