天天看點

牛客java選擇題每日打卡Day23

牛客java選擇題每日打卡Day23

👩‍💻部落格首頁:京與舊鋪的部落格首頁

✨歡迎關注🖱點贊🎀收藏⭐留言✒

🔮本文由京與舊鋪原創

😘系列專欄:java學習

👕參考網站:牛客網

💻首發時間:🎞2022年7月10日🎠

🎨你做三四月的事,八九月就會有答案,一起加油吧

🀄如果覺得部落客的文章還不錯的話,請三連支援一下部落客哦

🎧最後的話,作者是一個新人,在很多方面還做的不好,歡迎大佬指正,一起學習哦,沖沖沖

💬推薦一款模拟面試、刷題神器👉​​點選進入網站​​
牛客java選擇題每日打卡Day23

🛒導航小助手🎪

文章目錄

  • ​​牛客java選擇題每日打卡Day23​​
  • ​​🛒導航小助手🎪​​
  • ​​@[toc]​​
  • ​​🐱‍🚀選擇題1​​
  • ​​正确答案: A D 你的答案: B D (錯誤)​​
  • ​​🐱‍🚀選擇題2​​
  • ​​正确答案: A C 你的答案: A C D (錯誤)​​
  • ​​🐱‍🚀選擇題3​​
  • ​​正确答案: A B C D 你的答案: B C D (錯誤)​​
  • ​​🐱‍🚀選擇題4​​
  • ​​正确答案: A B C D 你的答案: B D (錯誤)​​
  • ​​🐱‍🚀選擇題5​​
  • ​​正确答案: A C F 你的答案: C D E (錯誤)​​
  • ​​🐱‍🚀選擇題6​​
  • ​​正确答案: A C D E F 你的答案: A D F (錯誤)​​
  • ​​🐱‍🚀選擇題7​​
  • ​​正确答案: A C 你的答案: A D (錯誤)​​

🐱‍🚀選擇題1

關于下面的一段代碼,以下哪些說法是正确的:

public static void main(String[] args) {
    String a = new String("myString");
    String b = "myString";
    String c = "my" + "String";
    String d = c;
    System.out.print(a == b);
    System.out.print(a == c);
    System.out.print(b == c);
    System.out.print(b == d);
}      

正确答案: A D 你的答案: B D (錯誤)

System.out.print(a == b)列印出來的是false
System.out.print(a == c)列印出來的是true
System.out.print(b == c)列印出來的是false
System.out.print(b == d)列印出來的是true      

a是運作時動态加載的,此時會在堆記憶體中生成一個myString字元串,指向堆記憶體字元串位址

b是編譯時靜态加載的,此時會在常量池中存放一個myString字元串,指向常量池字元串位址

c會在編譯時對"my" + "String"進行拼接成myString字元串,再去常量池查找,找到之後指向該字元串位址

d是c的腳本,位址相同

最後:Sting的==比較的是位址值是否相同

🐱‍🚀選擇題2

下面哪些接口直接繼承自Collection接口()

正确答案: A C 你的答案: A C D (錯誤)

List
Map
Set
Iterator      

🐱‍🚀選擇題3

下面有關java類加載器,說法正确的是?

正确答案: A B C D 你的答案: B C D (錯誤)

引導類加載器(bootstrap class loader):它用來加載 Java 的核心庫,是用原生代碼來實作的
擴充類加載器(extensions class loader):它用來加載 Java 的擴充庫。
系統類加載器(system class loader):它根據 Java 應用的類路徑(CLASSPATH)來加載 Java 類
tomcat為每個App建立一個Loader,裡面儲存着此WebApp的ClassLoader。需要加載WebApp下的類時,就取出ClassLoader來使用      

jvm classLoader architecture :

a、Bootstrap ClassLoader/啟動類加載器

主要負責jdk_home/lib目錄下的核心 api 或 -Xbootclasspath 選項指定的jar包裝入工作.

B、Extension ClassLoader/擴充類加載器

主要負責jdk_home/lib/ext目錄下的jar包或 -Djava.ext.dirs 指定目錄下的jar包裝入工作

C、System ClassLoader/系統類加載器

主要負責java -classpath/-Djava.class.path所指的目錄下的類與jar包裝入工作.

B、 User Custom ClassLoader/使用者自定義類加載器(java.lang.ClassLoader的子類)

在程式運作期間, 通過java.lang.ClassLoader的子類動态加載class檔案, 展現java動态實時類裝入特性.

🐱‍🚀選擇題4

通過以下哪些方法可反射擷取到User對象中static屬性的值?

正确答案: A B C D 你的答案: B D (錯誤)

User. class. getDeclaredField ("name"). get (null);
User. class. getField ("name"). get (null);
User user=new User(); return user. getClass(). getField ("name").get (user);
User user=new User(): return user. getClass(). getDeclaredField ("name"). get (user);      

答案:A、D

考察點:getDeclaredField和 getField的差異

參考資料

getDeclaredField:查找該Class所有聲明屬性(靜态/非靜态),但是他不會去找實作的接口/父類的屬性

getField:隻查找該類public類型的屬性,如果找不到則往上找他的接口、父類,依次往上,直到找到或者已經沒有接口/父類

問題:此題本身就有問題,不夠嚴謹, 沒有給出User類的實作代碼,是以我們并不知道這個"static"屬性的通路類型啊,是public/protect/privare/還是包通路類型呢?上面選答案A、D,隻是因為這四種情況都滿足

🐱‍🚀選擇題5

關于Java中的數組,下面的一些描述,哪些描述是準确的:( )

正确答案: A C F 你的答案: C D E (錯誤)

數組是一個對象,不同類型的數組具有不同的類
數組長度是可以動态調整的
數組是一個連續的存儲結構
一個固定長度的數組可類似這樣定義: int array[100]
兩個數組用equals方法比較時,會逐個周遊其中的元素,對每個元素進行比較
可以二維數組,且可以有多元數組,都是在Java中合法的      

當數組的初始化完成後數組在記憶體中所占用的空間将會被固定,即使我們清空這個數組中的元素,它所占用的空間依然會被保留。這造成了Java數組長度的不可變,選項B錯誤。

Java語言中,數組是一種引用類型的變量,使用它定義變量時,這個引用變量還沒有指向任何有效的記憶體空間,是以定義數組時不能指定數組的長度。而由于這個引用變量并沒有指向任何有效的記憶體空間,是以沒有空間來存儲任何元素,隻有當對數組初始化後,才可以使用這個數組。D選項正确的定義方式為int[] array =new int[100]。

本題易錯點是E選項,數組是一種引用資料類型,繼承自Object類的,是以其中也包含了未被重寫的equals()方法,所有的引用變量都能調用equals()方法來判斷他是否與其他引用變量相等,使用這個方法來判斷兩個引用對象是否相等的判斷标準與使用==運算符沒有差別,隻有在兩個引用變量指向同一個對象才會傳回true。如果想達到E選項描述的效果,需要使用Arrays.equals()方法。

🐱‍🚀選擇題6

下面有關Java的說法正确的是( )

正确答案: A C D E F 你的答案: A D F (錯誤)

一個類可以實作多個接口
抽象類必須有抽象方法
protected成員在子類可見性可以修改
通過super可以調用父類構造函數
final的成員方法實作中隻能讀取類的成員變量
String是不可修改的,且java運作環境中對string對象有一個常量池儲存      
  • A對:java類單繼承,多實作

    B錯:被abstract修飾的類就是抽象類,有沒有抽象方法無所謂

    C錯:描述有問題。protected成員在子類的可見性,我最初了解是子類(不繼承父類protected成員方法)擷取父類被protected修飾的成員屬性或方法,可見性是不可能變的,因為修飾符protected就是描述可見性的。

    這道題應該是要考察子類繼承父類,并重寫父類的protected成員方法,該方法的可見性可以修改,這是對的,因為子類繼承父類的方法,通路權限可以相同或往大了改

    D對。

    E錯:final修飾的方法隻是不能重寫,static修飾的方法隻能通路類的成員變量

    F對。

🐱‍🚀選擇題7

public class Test {
    private synchronized void a() {
    }
    private void b() {
        synchronized (this) {
        }
    }
    private synchronized static void c() {
    }
    private void d() {
        synchronized (Test.class) {
        }
    }
}      

正确答案: A C 你的答案: A D (錯誤)

同一個對象,分别調用方法a和b,鎖住的是同一個對象
同一個對象,分别調用方法a和c,鎖住的是同一個對象
同一個對象,分别調用方法b和c,鎖住的不是同一個對象
同一個對象,分别調用方法a、b、c,鎖住的不是同一個對象      
  • 同步代碼塊(synchronized(this),synchronized(類執行個體對象),鎖是小括号()中的執行個體對象)
  • 同步非靜态方法(synchronized method),鎖的是目前對象的執行個體對象

擷取類鎖

  • 同步代碼塊(synchronized(類.class)),鎖是最小括号 () 中的類對象(Class對象)
  • 同步靜态方法(synchronized static method),鎖是目前對象的類對象(Class 對象)
  • 有線程通路對象的同步代碼塊時,另外的線程可以通路該對象的非同步代碼塊
  • 若鎖住的是同一個對象,一個線程在通路對象的同步代碼塊時,另一個通路對象的同步代碼塊的線程會被阻塞。
  • 若鎖住的是同一個對象,一個線程在通路對象的同步方法時,另一個通路對象的同步方法的線程會被阻塞。
  • 若鎖住的是同一個對象,一個線程在通路對象的同步代碼塊時,另一個通路對象同步方法的線程會被阻塞,反之亦然。
  • 同一個類的不同對象的鎖互不幹擾
  • 類鎖由于也是一種特殊的對象鎖,是以表現和上述一緻,而由于一個類隻有一把對象鎖,是以同一個類的不同對象使用類鎖将會是同步的

    象的同步代碼塊時,另一個通路對象的同步代碼塊的線程會被阻塞。

  • 若鎖住的是同一個對象,一個線程在通路對象的同步方法時,另一個通路對象的同步方法的線程會被阻塞。
  • 若鎖住的是同一個對象,一個線程在通路對象的同步代碼塊時,另一個通路對象同步方法的線程會被阻塞,反之亦然。
  • 同一個類的不同對象的鎖互不幹擾
  • 類鎖由于也是一種特殊的對象鎖,是以表現和上述一緻,而由于一個類隻有一把對象鎖,是以同一個類的不同對象使用類鎖将會是同步的
  • 類鎖和對象鎖互不幹擾