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.pswp.cn/diannao/41042.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/41042.shtml
英文地址,請注明出處:http://en.pswp.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…

微信小程序/uniapp:class和style不生效的問題

非常重要&#xff1a;小程序端不支持 classObject 和 styleObject 語法。 文檔&#xff1a;https://uniapp.dcloud.net.cn/tutorial/vue-basics.html#class-與-style-綁定 目錄 對象語法數組語法字符串語法computed其他方案 對象語法 <!-- class --> <view class&quo…

AI是在幫助開發者還是取代它們?

在這個科技日新月異的時代&#xff0c;人工智能&#xff08;AI&#xff09;已經滲透到了我們生活的方方面面&#xff0c;尤其是在軟件開發和編程領域&#xff0c;其影響更是深遠。AI技術的飛速發展引發了廣泛討論&#xff1a;它究竟是開發者們的得力助手&#xff0c;還是未來可…

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…

在Ubuntu 16.04上安裝和配置ownCloud的方法

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到網站。 簡介 ownCloud 是一個文件共享服務器&#xff0c;允許您將個人內容&#xff08;如文檔和圖片&#xff09;存儲在一個類似 Dropbox 的集…

[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&…

前端之CSS篇--面試題總結

CSS的特性&#xff1a;繼承性、層疊性、優先級 優先級&#xff1a;寫css樣式的時候&#xff0c;會給同一個元素添加多個樣式&#xff0c;此時誰的權重搞就顯示誰的樣式。 !important >行內樣式>id>類>標簽>全局選擇器 隱藏元素的方法 display:none 元素在頁面…

產品公告 | MemFire Cloud 現已支持微信授權登錄,為移動應用帶來更便捷的認證服務

MemFire Cloud推出的“開箱即用”的后端服務&#xff0c;提供了云數據庫、身份驗證與授權、云存儲、靜態托管、實時realtime、自動生成API等功能&#xff0c;本次升級新增/優化功能如下&#xff1a; 標題微信授權登錄&#xff08;移動應用&#xff09; 為了順應國內用戶的使用…

Python面試題:如何在 Python 中實現單例模式?

在 Python 中&#xff0c;有多種方法可以實現單例模式&#xff08;Singleton Pattern&#xff09;。單例模式是一種設計模式&#xff0c;確保一個類只有一個實例&#xff0c;并提供一個全局訪問點。以下是幾種常見的方法來實現單例模式&#xff1a; 方法一&#xff1a;使用類變…

Elasticsearch:Ingest architectures - 攝取架構

我們提供各種采集架構&#xff0c;以滿足各種用例和網絡配置的需求。 要將數據采集到 Elasticsearch&#xff0c;請使用最符合你的需求和用例的選項。對于許多用戶和用例來說&#xff0c;最簡單的方法是使用 Elastic Agent 采集數據并將其發送到 Elasticsearch。Elastic Agent…

深度學習——深度學習中感受野的計算

感受野 在卷積神經網絡&#xff08;CNN&#xff09;中&#xff0c;感受野&#xff08;Receptive Field&#xff09; 是一個非常重要的概念。它描述了網絡中某一層的輸出&#xff08;通常是特征圖上的一個像素點&#xff09;所對應的輸入圖像上的空間范圍。這個范圍代表了該輸出…

【CSS】了解grid-template-areas屬性

grid-template-areas 屬性是 CSS Grid 布局中一個非常有用的特性&#xff0c;它允許你通過命名網格區域&#xff08;grid areas&#xff09;來直接控制網格項目的布局。這個屬性通過引用網格容器內部網格項目的名稱來定義網格區域的布局&#xff0c;使得布局的設計更加直觀和易…

SARscape——地理編碼與輻射定標

目錄 一、算法原理1、概述2、參考文獻 二、軟件操作三、結果展示1、原始圖像2、處理結果 一、算法原理 1、概述 SAR系統觀測到的是電磁波入射地球表面后反射&#xff08;后向散射&#xff09;的雷達脈沖的強度和相位信息。這個信息編碼到雷達坐標系統下&#xff0c;即斜距坐標…