Java錯題集(三)

@傑諾斯發表於2020-11-23

 

 

下面關於垃圾收集的描述哪個是錯誤的?

正確答案: D   你的答案: D (正確)

使用垃圾收集的程式不需要明確釋放物件
現代垃圾收集能夠處理迴圈引用問題
垃圾收集能提高程式設計師效率
使用垃圾收集的語言沒有內在洩漏問題
來源:https://www.nowcoder.com/questionTerminal/949ccecf4fd4471391577ec78739ff65
記憶體洩露(Memory Leak)是指一個不再被使用的物件或者變數還在記憶體中佔有儲存空間。
C/C++語言中,記憶體洩露出現在開發人員忘記釋放已分配的記憶體就會造成記憶體洩露。
在java語言中引入垃圾回收機制,有GC負責進行回收不再使用的物件,釋放記憶體。但是還是會存在記憶體洩露的問題。
記憶體洩露主要有兩種情況:
1.在堆中申請的空間沒有釋放。
2.物件已不再被使用(注意:這裡的不在被使用是指對程式來說沒有用處,如資料庫連線使用後沒有關。但是還是存在著引用),但是仍然在記憶體中保留著。
GC機制的引入只能解決第一種情況,對於第2種情況無法保證不再使用的物件會被釋放。java語言中的記憶體洩露主要指第2種情況。
記憶體洩露的原因:
1.靜態集合類。如HashMap和Vector。這些容器是靜態的,生命週期和程式的生命週期一致,那麼在容器中物件的生命週期也和其一樣,物件在程式結束之前將不能被釋放,從而會造成記憶體洩露。
2.各種連線,如資料庫連線,網路連線,IO連線,不再使用時如果連線不釋放容易造成記憶體洩露。
3.***,釋放物件時往往沒有相應的刪除***,可能會導致記憶體洩露。
記憶體溢位(OOM)是指程式在申請記憶體時沒有足夠的記憶體供使用,進而導致程式崩潰這是結果描述。
記憶體洩露(Memory Leak)最終會導致記憶體溢位。

 

Java的跨平臺特性是指它的原始碼可以在多個平臺執行。()

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

正確
錯誤

來源:https://www.nowcoder.com/questionTerminal/90db8f2b6c2d40babd21e9d25344e51d

1.Java的跨平臺特性是因為JVM的存在, 它可以執行.class位元組碼檔案,而不是.java原始碼

2.JAVA的跨平臺特性表述為“一次編譯,到處執行”,JAVA程式執行在JVM上,而JVM對上遮蔽了底層作業系統差異。

3.我們編譯好的檔案是以.java字尾儲存的,編譯器會自動幫我們生成一個標準的.class位元組碼檔案,JVM執行該檔案。JVM也是一個軟體,不同的系統平臺JVM不同,但都可以實現標準的.class位元組碼檔案。

 

下面哪種情況會導致持久區jvm堆記憶體溢位?

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

迴圈上萬次的字串處理
在一段程式碼內申請上百M甚至上G的記憶體
使用CGLib技術直接操作位元組碼執行,生成大量的動態類
不斷建立物件

來源:https://www.nowcoder.com/questionTerminal/1999635c228d49be84eb7623108be35e

學習部落格 :https://blog.csdn.net/sivyer123/article/details/17139443

簡單的來說 java的堆記憶體分為兩塊:

permantspace(持久帶)heapspace。

持久帶中主要存放用於存放靜態型別資料,如 Java Class, Method 等, 與垃圾收集器要收集的Java物件關係不大。

而heapspace分為年輕帶年老帶 

年輕代的垃圾回收叫 Young GC, 年老代的垃圾回收叫 Full GC

在年輕代中經歷了N次(可配置)垃圾回收後仍然存活的物件,就會被複制到年老代中。因此,可以認為年老代中存放的都是一些生命週期較長的物件

年老代溢位原因  迴圈上萬次的字串處理、建立上千萬個物件、在一段程式碼內申請上百M甚至上G的記憶體,既A B D選項

持久代溢位原因  動態載入了大量Java類而導致溢位

 

package Wangyi;
class Base
{
    public void method()
    {
        System.out.println("Base");
    } 
}
class Son extends Base
{
    public void method()
    {
        System.out.println("Son");
    }
    
    public void methodB()
    {
        System.out.println("SonB");
    }
}
public class Test01
{
    public static void main(String[] args)
    {
        Base base = new Son();
        base.method();
        base.methodB();
    }
}

問這個程式的輸出結果。

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

Base SonB
Son SonB
Base Son SonB
編譯不通過

來源:https://www.nowcoder.com/questionTerminal/711badc732d84bd98e4ac684e09791b8

學習部落格:https://www.cnblogs.com/111testing/p/6880831.html

成員變數:編譯看左邊,執行看左邊
靜態變數:編譯看左邊,執行看左邊
成員方法:編譯看左邊,執行看右邊
靜態方法:編譯看左邊,執行看左邊

編譯時要看左邊有沒有該方法

 

下面的switch語句中,x可以是哪些型別的資料:()

switch(x)
{
default:
System.out.println("Hello");
}

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

long
char
float
byte
double
Object

以java8為準,switch支援10種型別

基本型別:byte char short int

包裝類 :Byte,Short,Character,Integer String enum

2、實際只支援int型別 Java實際只能支援int型別的switch語句,那其他的型別時如何支援的

a、基本型別byte char short 原因:這些基本數字型別可自動向上轉為int, 實際還是用的int。

b、基本型別包裝類Byte,Short,Character,Integer 原因:java的自動拆箱機制 可看這些物件自動轉為基本型別

c、String 型別 原因:實際switch比較的string.hashCode值,它是一個int型別 如何實現的,網上例子很多。此處不表。

d、enum型別 原因 :實際比較的是enum的ordinal值(表示列舉值的順序),它也是一個int型別 所以也可以說 switch語句只支援int型別

 

Java1.8版本之前的前提,Java特性中,abstract class和interface有什麼區別()

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

抽象類可以有構造方法,介面中不能有構造方法
抽象類中可以有普通成員變數,介面中沒有普通成員變數
抽象類中不可以包含靜態方法,介面中可以包含靜態方法
一個類可以實現多個介面,但只能繼承一個抽象類。

來源:https://www.nowcoder.com/questionTerminal/f0b4438ea8554423a53740ffdc08faf2

學習文章:https://zhuanlan.zhihu.com/p/94770324

相關文章