牛客java選擇題每日打卡Day9
👩💻部落格首頁:京與舊鋪的部落格首頁
✨歡迎關注🖱點贊🎀收藏⭐留言✒
🔮本文由京與舊鋪原創
😘系列專欄:java學習
👕參考網站:牛客網
💻首發時間:🎞2022年5月25日🎠
🎨你做三四月的事,八九月就會有答案,一起加油吧
🀄如果覺得部落客的文章還不錯的話,請三連支援一下部落客哦
🎧最後的話,作者是一個新人,在很多方面還做的不好,歡迎大佬指正,一起學習哦,沖沖沖
💬推薦一款模拟面試、刷題神器👉點選進入網站
圖檔
🛒導航小助手🎪
🤴選擇題1
以下代碼執行的結果顯示是多少()?
正确答案: B 你的答案: D (錯誤)
num * count = 505000
num * count = 0
運作時錯誤
num * count = 5050
這題目挺好的!考察count++與++count的差別!for循環外面count=0,循環裡面的count=count++;(count的值都等于count值,而後面count自加不影響count結果,是以這個式子無意義);循環count都為0(因count++是先傳回count的本身值再自加1的)!若是改為count=++count;(先自加,再傳回自加後的值),結果就是5050101=510050了!改為count++;結果就是5050101=510050了!
👩🦰選擇題2
下面哪些寫法能在 java8 中編譯執行()
正确答案: A D 你的答案: B D (錯誤)
dir.listFiles((File f)->f.getName().endsWith(“.Java”));
dir.listFiles((File f)=>f.getName().endsWith(“.Java”));
dir.listFiles((_.getName().endsWith(“.Java”)));
dir.listFiles( f->f.getName().endsWith(“.Java”));
Lanbda表達式的主要作用就是代替匿名内部類的繁瑣文法, 它由三部分組成:
(1) 形參清單。形參清單允許省略形參類型。如果形參清單中隻有一個參數,甚至連形參清單的圓括号也可以省略。
(2) 箭頭(→)。必須通過英文中畫線和大于符号組成。
(3)代碼塊。如果代碼塊隻包含一條語句,Lambda表達式允許省略代碼塊的花括号,那麼那條語句就不要用花括号表示語句結束。Lambda代碼塊隻有一條return語句,甚至可以省略return關鍵字。Lambda表達式需要傳回值,而它的代碼塊中僅有一套省略了return的語句。Lambda表達式會自動傳回這條語句的值。
由此可見,應該是A和D正确。
🍿選擇題3
下面關于Spring的說法中錯誤的是()
Spring是一個支援快速開發Java EE架構的架構
Spring中包含一個“依賴注入”模式的實作
使用Spring可以實作聲明式事務
Spring提供了AOP方式的日志系統
解析
D.Spring提供了AOP方式的日志系統
Spring并沒有為我們提供日志系統,我們需要使用AOP(面向方面程式設計)的方式,借助Spring與日志系統log4j實作我們自己的日志系統。
spring沒有提供AOP方式的日志系統
AOP為Aspect Oriented Programming的縮寫,意為:面向切面程式設計,通過預編譯方式和運作期動态***實作程式功能的統一維護的一種技術。AOP是OOP的延續,是軟體開發中的一個熱點,也是Spring架構中的一個重要内容,是函數式程式設計的一種衍生範型。
Spring通過對AOP的支援,借助log4j等Apache開源元件實作了日志系統。
解釋一下答案A
Spring 架構是一個分層架構,由 7 個定義良好的子產品組成。
核心容器,Spring上下文,Spring AOP, Spring DAO, Spring ORM, Spring Web, Spring MVC。
👧選擇題4
String str = ``""``;``System.out.print(str.split(``","``).length);
輸出結果為:
0
1
出現異常
/** * String split 這個方法預設傳回一個數組, * 如果沒有找到分隔符, * 會把整個字元串當成一個長度為1的字元串數組 * 傳回到結果, 是以此處結果就是1 */ private static void testSpringSpilte(){
String str = "12,3";
String str2 = "123";
System.out.print(str.split(",").length);
System.out.print(str2.split(",").length);
}
}
結果 2 1
🌯選擇題5
public class Person{
private String name = "Person";
int age=0;
}
public class Child extends Person{
public String grade;
public static void main(String[] args){
Person p = new Child();
System.out.println(p.name);
}
}
1.一個java檔案裡,public 的類隻能出現一個,隻能出現一個,隻能出現一個,否則,不管你用哪一個類名命名檔案名編譯器都會報錯
2.關于多态。子類繼承了父類的所有成員,包括private權限的成員變量,但是繼承的子類具有私有變量的擁有權但是沒有使用權。
3.private的成員變量,根據權限修飾符的通路控制範圍,隻有在類内部才能被通路,就算是他的子類,也不能通路。
👳♂️選擇題6
下列關于final、finally、finalize說法正确的是( )
正确答案: A B D 你的答案: B C D (錯誤)
final可以用來修飾類、方法、變量
finally是java保證重點代碼一定要被執行的一種機制
變量被final修飾後不能再指向其他對象,但可以重寫
finalize設計的目的是保證對象在被垃圾收集前完成特定資源的回收
- final用于聲明屬性、方法和類:
- final屬性不可變,指的是引用不可變,而不關心指向對象内容的變化,被final修飾的變量必須初始化
- final方法不可被子類重寫,可以實作inline(内聯)的機制
- final類不可以被繼承(如String、StringBuffer),所有的方法不可以被重寫,但其内的非final變量可以被修改
- finaally作為異常處理的一部分,隻能用在try/catch語句中,并且附帶一個語句塊,表示這段語句最終一定被執行(特殊情況不會被執行,如try語句前出現異常或try語句塊中出現的異常沒有被捕獲),經常被用在需要釋放資源的情況下或是釋放鎖
- finalize是Object類的一個方法,在垃圾回收器執行時會調用被回收對象的finalize()方法,可以覆寫此方法來實作對其他資源的回收(一旦垃圾回收器準備好釋放對象占用的空間,将首先調用該方法,并且在下一次垃圾回收動作發生時,才會真正回收對象占用的記憶體),從功能上來說,finalize()方法與c++中的析構函數比較相似,但是Java采用的是基于垃圾回收器的自動記憶體管理機制,是以finalize()方法在本質上不同于C++中的析構函數。
關于finalize的補充!
判定一個對象objA是否可回收,至少要經曆兩次标記過程:
- 如果對象objA到GC Roots沒有引用鍊,則進行第一次标記。
- 進行篩選,判斷此對象是否有必要執行finalize()方法
- 如果對象objA沒有重寫finalize()方法,或者finalize()方法已經被虛拟機調用過,則虛拟機視為“沒有必要執行”,objA被判定為不可觸及的。
- 如果對象objA重寫了finalize()方法,且還未執行過,那麼objA會被插入到F-Queue隊列中,由一個虛拟機自動建立的、低優先級的Finalizer線程觸發其finalize()方法執行。
- finalize()方法是對象逃脫死亡的最後機會,稍後GC會對F-Queue隊列中的對象進行第二次标記。如果objA在finalize()方法中與引用鍊上的任何一個對象建立了聯系,那麼在第二次标記時,objA會被移出“即将回收”集合。之後,對象會再次出現沒有引用存在的情況。在這個情況下,finalize方法不會被再次調用,對象會直接變成不可觸及的狀态,也就是說,一個對象的finalize方法隻會被調用一次。
😍選擇題7
以下哪些記憶體區域屬于JVM規範?( )
正确答案: A D E 你的答案: A C E (錯誤)
方法區
執行個體變量
靜态變量
程式計數器
虛拟機棧
-
JVM記憶體區:程式計數器、虛拟機棧、本地方法棧、堆、方法區(包括常量池)。
不屬于JVM記憶體區:直接記憶體(Direct Memory),使用者I/O操作
😘選擇題8
有關線程的哪些叙述是對的()
正确答案: B C D 你的答案: B D (錯誤)
一旦一個線程被建立,它就立即開始運作。
使用start()方法可以使一個線程成為可運作的,但是它不一定立即開始運作。
當一個線程因為搶先機制而停止運作,它可能被放在可運作隊列的前面。
一個線程可能因為不同的原因停止并進入就緒狀态。
我自己最開始的時候隻選了BD沒選C。看評論裡面也對C存疑,通過書籍查證C是可以選的。
在搶先式系統下,由高優先級的線程參與排程。分為2種情況:
1.若多個線程都處于就緒狀态,則具有高優先級的線程會在低優先級之前得到執行;
2.在目前線程的運作過程中,如果有較進階别的線程準備就緒,則正在運作的較低級别的線程将被挂起,轉到較進階别的線程運作,直到結束後又會轉到原來被挂起的線程。
第二種情況就描述了C所代表的情況,可以看到當較進階别的線程搶去運作權并運作完成之後,是先将權利轉給原來的線程的,是以C是正确的。
D選項 Java線程中的Thread.yield( )方法,譯為線程讓步。顧名思義,就是說當一個線程使用了這個方法之後,它就會把自己CPU執行的時間讓掉,
讓自己或者其它的線程運作,注意是讓自己或者其他線程運作,并不是單純的讓給其他線程。
yield()的作用是讓步。它能讓目前線程由“運作狀态”進入到“就緒狀态”,進而讓其它具有相同優先級的等待線程擷取執行權;但是,并不能保
證在目前線程調用yield()之後,其它具有相同優先級的線程就一定能獲得執行權;也有可能是目前線程又進入到“運作狀态”繼續運作!
一個新建立的線程并不是自動的開始運作的,必須調用它的start()方法使之将線程放入可運作态(runnable state),這隻是意味着該線程可被JVM的線程排程程式排程而不是意味着它可以立即運作。
線程的排程是搶先式的,而不是分時間片式的。
具有比目前運作線程高優先級的線程可以使目前線程停止運作而進入就緒狀态。
不同優先級的線程間是搶先式的,而同級線程間是輪換式的。
一個線程停止運作可以是因為不同原因,可能是因為更高優先級線程的搶占,也可能是因為調用sleep()方法。
而即使是因為搶先而停止也不一定就進入可運作隊列的前面,因為同級線程是輪換式的,它的運作可能就是因為輪換,而它因搶占而停止後隻能在輪換隊列中排隊而不能排在前面。
😫選擇題9
下面有關java的引用類型,說法正确的有?
正确答案: A B C D 你的答案: A C (錯誤)
被GCroot強引用=Gcroot對象來說,隻要有強引用的存在,它就會一直存在于記憶體中
如果一個對象僅持有虛引用,那麼它就和沒有任何引用一樣,在任何時候都可能被垃圾回收器回收。
如果一個對象隻具有軟引用,則記憶體空間足夠,垃圾回收器就不會回收它;如果記憶體空間不足了,就會回收這些對象的記憶體
一旦發現了隻具有弱引用的對象,不管目前記憶體空間足夠與否,都會回收它的空間
發現這道題完全沒頭緒,就去查了一下,感覺說的比較清楚了。
四種引用類型
JDK1.2 之前,一個對象隻有“已被引用”和"未被引用"兩種狀态,這将無法描述某些特殊情況下的對象,比如,當記憶體充足時需要保留,而記憶體緊張時才需要被抛棄的一類對象。
是以在 JDK.1.2 之後,Java 對引用的概念進行了擴充,将引用分為了:強引用(Strong Reference)、軟引用(Soft Reference)、弱引用(Weak Reference)、虛引用(Phantom Reference)4 種,這 4 種引用的強度依次減弱。
一,強引用
Object obj = new Object(); //隻要obj還指向Object對象,Object對象就不會被回收 obj = null; //手動置null
隻要強引用存在,垃圾回收器将永遠不會回收被引用的對象,哪怕記憶體不足時,JVM也會直接抛出OutOfMemoryError,不會去回收。如果想中斷強引用與對象之間的聯系,可以顯示的将強引用指派為null,這樣一來,JVM就可以适時的回收對象了
二,軟引用
軟引用是用來描述一些非必需但仍有用的對象。在記憶體足夠的時候,軟引用對象不會被回收,隻有在記憶體不足時,系統則會回收軟引用對象,如果回收了軟引用對象之後仍然沒有足夠的記憶體,才會抛出記憶體溢出異常。這種特性常常被用來實作緩存技術,比如網頁緩存,圖檔緩存等。
在 JDK1.2 之後,用java.lang.ref.SoftReference類來表示軟引用。
三,弱引用
弱引用的引用強度比軟引用要更弱一些,無論記憶體是否足夠,隻要 JVM 開始進行垃圾回收,那些被弱引用關聯的對象都會被回收。在 JDK1.2 之後,用 java.lang.ref.WeakReference 來表示弱引用。
四,虛引用
會回收軟引用對象,如果回收了軟引用對象之後仍然沒有足夠的記憶體,才會抛出記憶體溢出異常**。這種特性常常被用來實作緩存技術,比如網頁緩存,圖檔緩存等。
在 JDK1.2 之後,用java.lang.ref.SoftReference類來表示軟引用。
三,弱引用
弱引用的引用強度比軟引用要更弱一些,無論記憶體是否足夠,隻要 JVM 開始進行垃圾回收,那些被弱引用關聯的對象都會被回收。在 JDK1.2 之後,用 java.lang.ref.WeakReference 來表示弱引用。
四,虛引用
虛引用是最弱的一種引用關系,如果一個對象僅持有虛引用,那麼它就和沒有任何引用一樣,它随時可能會被回收,在 JDK1.2 之後,用 PhantomReference 類來表示,通過檢視這個類的源碼,發現它隻有一個構造函數和一個 get() 方法,而且它的 get() 方法僅僅是傳回一個null,也就是說将永遠無法通過虛引用來擷取對象,虛引用必須要和 ReferenceQueue 引用隊列一起使用。
結束語🏆🏆🏆
🔥推薦一款模拟面試、刷題神器網站
點選跳轉進入網站點選進入 1、算法篇(398題):面試必刷100題、算法入門、面試高頻榜單