撩課-Java每天10道面試題第4天

来源:https://www.cnblogs.com/gxq666/archive/2018/11/13/9948944.html
-Advertisement-
Play Games

撩課Java+系統架構 視頻 點擊開始學習 31.靜態變數和實例變數的區別? 靜態變數也叫類變數, 這種變數前加了static修飾符。 可以直接用類名調用, 也可以用對象調用, 而且所有對象的同一個類變數 都是共用同一塊記憶體空間。 實例變數也叫對象變數, 這種變數沒有加static修飾符。 只能通過... ...


撩課Java+系統架構 視頻 點擊開始學習
31.靜態變數和實例變數的區別?
靜態變數也叫類變數,
這種變數前加了static修飾符。
可以直接用類名調用,
也可以用對象調用,
而且所有對象的同一個類變數 
都是共用同一塊記憶體空間。

實例變數也叫對象變數,
這種變數沒有加static修飾符。
只能通過對象調用, 
而且所有對象的同一個實例變數
是共用不同的記憶體空間的。

區別在於:
靜態變數是所有對象共有的,
某一個對象將它的值改變了,
其他對象再去獲取它的值,
得到的是改變後的值;
實例變數則是每一個對象私有的,
某一個對象將它的值改變了,
不影響其他對象取值的結果,
其他對象仍會得到實例變數
一開始就被賦予的值。

實例變數必須創建對象後
才可以通過這個對象來使用,
靜態變數
則可以直接使用類名來引用。
32.垃圾回收器的基本原理是什麼?
垃圾回收器是Java平臺中用的
最頻繁的一種對象銷毀方法。
垃圾回收器會全程偵測Java應用程式的運行情況。
當發現有些對象成為垃圾時,
垃圾回收器就會銷毀這些對象,
並釋放這些對象所占用的記憶體空間。
在這裡,程式開發人員需要知道,
在哪些情況下垃圾回收器
會認為這些對象是垃圾對象。
通常情況下,如果發生以下兩種情況時,
系統會認為這些對象是垃圾對象,
需要銷毀。
一是將一個NULL值賦值給對象。
二是對象其超出了作用範圍,

 

33.垃圾回收器可以馬上回收記憶體嗎?
不會馬上回收,
只有在必須回收時才會回收,
或者你可以調用垃圾回收方法,
虛擬機會在空閑時回收,
至於什麼時候回收,
虛擬機說了算

 

34.有什麼辦法主動通知虛擬機進行垃圾回收?
對於GC來說,
當程式員創建對象時,
GC就開始監控這個對象的地址、
大小以及使用情況。 
通常,GC採用有向圖的方式記錄和管理堆(heap)中的所有對象。
通過這種方式確定哪些對象是”可達的”,
哪些對象是”不可達的”。
當GC確定一些對象為”不可達”時,
GC就有責任回收這些記憶體空間。
可以。程式員可以手動執行System.gc(),
通知GC運行,
但是Java語言規範
並不保證GC一定會執行。

System.gc()的工作原理
Java中的記憶體分配
是隨著new一個新的對象來實現的,
這個很簡單,
而且也還是有一些
可以“改進”記憶體回收的機制的,
其中最顯眼的
就是這個System.gc()函數。

乍一看這個函數似乎是可以進行垃圾回收的,
可事實並不是那麼簡單。
其實這個gc()函數的作用只是提醒虛擬機:
程式員希望進行一次垃圾回收。
但是它不能保證垃圾回收一定會進行,
而且具體什麼時候進行
是取決於具體的虛擬機的,
不同的虛擬機有不同的對策。

 

35.內部類可以引用他包含類的成員嗎?
完全可以。
如果不是靜態內部類,
那沒有什麼限制! 
一個內部類對象可以訪問
創建它的外部類對象的成員包括私有成員。
如果你把靜態嵌套類當作內部類的一種特例,
那在這種情況下不可以訪問外部類的
普通成員變數,
而只能訪問外部類中的靜態成員。

內部類的訪問規則:
1、內部類可以直接訪問外部類中的成員,
包括私有。
之所以可以直接訪問外部類中的成員,
是因為內部類中持有了
一個外部類的引用,
格式 外部類名.this
2、外部類要訪問內部類,必須建立內部類對象。

內部類定義在局部時,
1、不可以被成員修飾符修飾
2、可以直接訪問外部類中的成員,
因為還持有外部類中的引用。
但是不可以訪問它所在的局部中的變數。
只能訪問被final修飾的局部變數。

 

36.Java 中的異常處理機制的簡單原理和應用?
 一、Execption可以分為
java標准定義的異常
程式員自定義異常2種
1.一種是當程式違反了java語規則的時候,
JAVA虛擬機就會將發生的錯誤
表示為一個異常.
這裡語法規則指的是
JAVA類庫內置的語義檢查。
例如 int i = 2 / 0 
或者 String str = null;str.length();

2.另一種情況就是JAVA允許程式員
擴展這種語義檢查,
程式員可以創建自己的異常,
並自由選擇在何時用throw關鍵字
引發異常。

例如 Exception ex = new Exception("這是我自定義的異常;
throw ex;

所有的異常都是Thowable的子類。
異常處理是與程式執行是並行的。

二、異常的處理方式
1.捕獲異常

 try {
  int i = 2 / 0;
 } catch (Exception ex) {
   ex.printStackTrace();
   System.out.println("異常信息:" + ex.getMessage());
}

2.上拋異常 throws
public void test() throws Exception { 
    String str = null;
    str.length();
}

 

37.運行時異常與一般異常有何異同?
(1)運行時異常
都是RuntimeException類
及其子類異常,
如NullPointerException、
IndexOutOfBoundsException等,
這些異常是不檢查異常,
程式中可以選擇捕獲處理,
也可以不處理。
這些異常一般是由程式邏輯錯誤引起的,
程式應該從邏輯角度
儘可能避免這類異常的發生。

當出現RuntimeException的時候,
我們可以不處理。
當出現這樣的異常時,
總是由虛擬機接管。
比如:我們從來沒有人
去處理過NullPointerException異常,
它就是運行時異常,
並且這種異常還是最常見的異常之一。

出現運行時異常後,
系統會把異常一直往上層拋,
一直遇到處理代碼。
如果沒有處理塊,
到最上層,
如果是多線程就由Thread.run()拋出,
如果是單線程就被main()拋出。
拋出之後,
如果是線程,
這個線程也就退出了。
如果是主程式拋出的異常,
那麼這整個程式也就退出了。
運行時異常是Exception的子類,
也有一般異常的特點,
是可以被Catch塊處理的。
只不過往往我們不對他處理罷了。
也就是說,
你如果不對運行時異常進行處理,
那麼出現運行時異常之後,
要麼是線程中止,
要麼是主程式終止。 

如果不想終止,
則必須撲捉所有的運行時異常,
決不讓這個處理線程退出。
隊列裡面出現異常數據了,
正常的處理應該是把異常數據捨棄,
然後記錄日誌。
不應該由於異常數據
而影響下麵對正常數據的處理。

(2)非運行時異常
是RuntimeException以外的異常,
類型上都屬於Exception類及其子類。
如 IOException、SQLException 等
以及用戶自定義的Exception異常。
對於這種異常,
JAVA編譯器強制要求我們
必需對出現的這些異常進行catch並處理,
否則程式就不能編譯通過。
所以,面對這種異常不管我們是否願意,
只能自己去寫一大堆catch塊
去處理可能的異常。

 

38.為什麼Map介面不繼承Collection 介面?
Collection是最基本的集合介面,
聲明瞭適用於JAVA集合(只包括Set和List)
的通用方法。 
Set 和List 都繼承了Conllection;
Set具有與Collection完全一樣的介面,
因此沒有任何額外的功能,
不像前面有兩個不同的List。
實際上Set就是Collection,只 是行為不同。
(這是繼承與多態思想的典型應用:表現不同的行為。)
Set不保存重覆的元素(至於如何判斷元素相同則較為負責) 

 Map沒有繼承於Collection介面 
從Map集合中檢索元素時,
只要給出鍵對象,
就會返回對應的值對象。 


Collection 和 Map 的區別
容器內每個為之所存儲的元素個數不同。
Collection類型者,
每個位置只有一個元素。
Map類型者,
持有 key-value pair,
像個小型資料庫

儘管Map介面和它的實現也是集合框架的一部分,
但Map不是集合,
集合也不是Map。
因此,Map繼承Collection毫無意義,
反之亦然。
如果Map繼承Collection介面,
那麼元素去哪兒?
Map包含key-value對,
它提供抽取key或value列表集合的方法,
但是它不適合“一組對象”規範。

 

40.comparable 和 comparator的不同之處?
Comparable可以認為是一個內比較器,
實現了Comparable介面的類有一個特點,
就是這些類是可以和自己比較的,
至於具體和另一個實現了Comparable介面的類如何比較,
則依賴compareTo方法的實現,
compareTo方法也被稱為自然比較方法。
如果開發者add進入
一個Collection的對象想要Collections的sort方法
幫你自動進行排序的話,
那麼這個對象必須實現Comparable介面。
compareTo方法的返回值是int,
有三種情況:
1、比較者大於被比較者
(也就是compareTo方法裡面的對象),
那麼返回正整數
2、比較者等於被比較者,那麼返回0
3、比較者小於被比較者,那麼返回負整數


Comparator可以認為是是一個外比較器,
個人認為有兩種情況
可以使用實現Comparator介面的方式:
1、一個對象不支持自己和自己比較
(沒有實現Comparable介面),
但是又想對兩個對象進行比較
2、一個對象實現了Comparable介面,
但是開發者認為compareTo方法中的
比較方式並不是自己想要的那種比較方式

Comparator介面裡面有一個compare方法,
方法有兩個參數T o1和T o2,
是泛型的表示方式,
分別表示待比較的兩個對象,
方法返回值和Comparable介面一樣是int,
有三種情況:
1、o1大於o2,返回正整數
2、o1等於o2,返回0
3、o1小於o2,返回負整數

總結
兩種比較器Comparable和Comparator,
後者相比前者有如下優點:
1、如果實現類沒有實現Comparable介面,
又想對兩個類進行比較
或者實現類實現了Comparable介面,
但是對compareTo方法內的比較演算法不滿意,
那麼可以實現Comparator介面,
自定義一個比較器,
寫比較演算法

2、實現Comparable介面的方式比
實現Comparator介面的耦合性要強一些,
如果要修改比較演算法,
要修改Comparable介面的實現類,
而實現Comparator的類是在外部進行比較的,
不需要對實現類有任何修 改。
從這個角度說,
其實有些不太好,
尤其在我們將實現類的.class文件
打成一個.jar文件
提供給開發者使用的時候。
實際上實現Comparator 介面的方式
後面會寫到就是一種典型的策略模式。

當然,這不是鼓勵用Comparator,
意思是開發者還是要在具體場景下
選擇最合適的那種比較器而已。

 

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • vue中的插槽————slot 什麼是插槽? 插槽(Slot)是Vue提出來的一個概念,正如名字一樣,插槽用於決定將所攜帶的內容,插入到指定的某個位置,從而使模板分塊,具有模塊化的特質和更大的重用性。 插槽顯不顯示、怎樣顯示是由父組件來控制的,而插槽在哪裡顯示就由子組件來進行控制 怎麼用插槽? 預設 ...
  • <script> (function(){ var code = GetQueryString('code'); if(code){ alert(code) return false; }else{ shouquan(); } function shouquan(){ var redirect_ur ...
  • 一個常見的場景,獲取:標簽背景圖片鏈接: 如字元串:var bgImg = "url(\"https://img30.360buyimg.com/sku/jfs/t26203/262/100869187/204098/1d1479e9/5b84b80bNf39db45f.jpg\")"; 腳本: 劃 ...
  • 1 'use strict' 2 3 function 找出最長公子串 (...strings) { 4 let arraiesOfSubStrings = [] 5 arrayOfStrings.reduce((accumulator, currentValue) => { 6 arraiesOf... ...
  • 大家在做http請求的時候可能會遇到跨域問題,這裡為大家提供解決方案,親自實驗有效。 一般是報上述錯誤。 首先在C盤新建一個文件夾,命名按照下麵的來。 打開谷歌瀏覽器的設置 在“目標” 的exe後面添加下麵這段內容,不要忘記打空格。並且下麵這段內容不要放在包含“exe”的雙引號裡面,放在外面 --d ...
  • 分頁介面的實現,在偏業務的服務端開發中應該很常見,PC時代的各種表格,移動時代的各種 流、 。 出於對流量的控制,或者用戶的體驗,大批量的數據都不會直接返回給客戶端,而是通過分頁介面,多次請求返回數據。 而最常用的分頁介面定義大概是這樣的: 介面傳入請求的頁碼、以及每頁要請求的條數,我個人猜想這可能 ...
  • InfoQ 上有推薦過這本書的。結合我們自己項目的經驗來看,這本書還是相當有可操作性,對於採用scrum不是很久的同學,特別是從傳統軟體開發模式轉過來的同學,相當有幫助 Scrum敏捷軟體開發》是敏捷聯盟及Scrum聯盟創始人之一、敏捷估算及計劃的鼻祖Mike Cohn三大經典著作中影響最為深厚的扛 ...
  • Spring 是什麼? Spring 是一個開源的輕量級 Java SE( Java 標準版本)/Java EE( Java 企業版本)開發應用框架,其目的是用於簡化企業級應用程式開發。在傳統應用程式開發中,一個完整的應用是由一組相互協作的對象組成的。所以開發一個應用除了要開發業務邏輯之外,最多的是 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...