牛客錯題集
1.對介面的描述正確的是()
A.一個類可以實現多個介面
B.介面可以有非靜態的成員變數
C.在jdk8之前,介面可以實現方法
D.實現介面的任何類,都需要實現介面的方法
解析:
答案:A
A,一個類只能有一個直接父類,但是繼承是有傳遞性的。一個類可以實現多的介面。一個介面可以繼承多個類。
B,介面中沒有普通變數(普通成員變數),介面中都是常量,預設修飾符:public static final
C,JDK8之前,介面中的方法都是預設public abstract的,JDK8之後,介面中可以有static、default的修飾的方法,一旦被修飾,方法必須有方法體(抽象方法是可以沒有方法體的),介面中的方法都不能被private和protected修飾,同時外部介面、類只能被public修飾或者不寫,但是內部介面、類可以被四個訪問修飾符修飾。
D, 實現介面,其實就是需要重寫介面中的abstract方法,一旦實現的類沒有重寫完,那麼這個類必須是個抽象類(抽象類中可以沒有抽象方法,但是有抽象方法的類必須是抽象類)。
2.在 applet 的方法中 , 可關閉小應用程式並釋放其佔用資源的是( )
A.stop()
B.paint()
C.init()
D.destroy()
解析:
答案:D
Applet 類是瀏覽器類庫中最為重要的類,同時也是所有 JAVA 小應用程式的基本類。 一個 Applet 應用程式從開始執行到結束時所經歷的過程被稱為 Applet 的生命週期。 Applet 的生命週期涉及 init() 、 start() 、 stop() 和 destroy() 四種方法,這 4 種方法都是 Applet 類的成員,可以繼承這些方法,也可以重寫這些方法,覆蓋原來定義的這些方法。除此之外,為了在 Applet 程式中實現輸出功能,每個 Applet 程式中還需要過載 paint() 方法:
1、 public void init()
init()方法是 Applet 執行的起點。當啟動 Applet 程式時,系統首先呼叫此方法,以執行初始化任務。
2、 public void start()
start()方法是表明 Applet 程式開始執行的方法。當含有此 Applet 程式的 Web 頁被再次訪問時呼叫此方法。因此,如果每次訪問 Web 頁都需要執行一些操作的話,就需要在 Applet 程式中過載該方法。在 Applet 程式中,系統總是先呼叫 init() 方法,後呼叫 start() 方法。
3、 public void stop()
stop()方法使 Applet 停止執行,當含有該 Applet 的 Web 頁被其他頁代替時也要呼叫該方法。
4、 public void destroy()
destroy()方法收回 Applet 程式的所有資源,即釋放已分配給它的所有資源。在 Applet 程式中,系統總是先呼叫 stop() 方法,後呼叫 destroy() 方法。
5、 paint(Graphics g)
paint(Graphics g)方法可以使 Applet 程式在螢幕上顯示某些資訊,如文字、色彩、背景或影像等。引數 g 是 Graphics 類的一個物件例項,實際上可以把 g 理解為一個畫筆。物件 g 中包含了許多繪製方法,如 drawstring() 方法就是輸出字串。
3.java語言的下面幾種陣列複製方法中,哪個效率最高?
A.for 迴圈逐一複製
B.System.arraycopy
C.Array.copyOf
D.使用clone方法
解析:
答案:B
複製的效率System.arraycopy>clone>Arrays.copyOf>for迴圈
這裡面在System類原始碼中給出了arraycopy的方法,是native方法,也就是本地方法,肯定是最快的。而Arrays.copyOf(注意是Arrays類,不是Array)的實現,在原始碼中是呼叫System.copyOf的,多了一個步驟,肯定就不是最快的
4.有關會話跟蹤技術描述正確的是()
A.Cookie是Web伺服器傳送給客戶端的一小段資訊,客戶端請求時,可以讀取該資訊傳送到伺服器端
B.關閉瀏覽器意味著臨時會話ID丟失,但所有與原會話關聯的會話資料仍保留在伺服器上,直至會話過期
C.在禁用Cookie時可以使用URL重寫技術跟蹤會話
D.隱藏表單域將欄位新增到HTML表單並在客戶端瀏覽器中顯示
解析:
答案:A B C
1.session用來表示使用者會話,session物件在服務端維護,一般tomcat設定session生命週期為30分鐘,超時將失效,也可以主動設定無效;
2.cookie存放在客戶端,可以分為記憶體cookie和磁碟cookie。記憶體cookie在瀏覽器關閉後消失,磁碟cookie超時後消失。當瀏覽器傳送請求時,將自動傳送對應cookie資訊,前提是請求url滿足cookie路徑;
3.可以將sessionId存放在cookie中,也可以通過重寫url將sessionId拼接在url。因此可以檢視瀏覽器cookie或位址列url看到sessionId;
4.請求到服務端時,將根據請求中的sessionId查詢session,如果可以獲取到則返回,否則返回null或者返回新構建的session,老的session依舊存在
5.隱藏域在頁面中對於使用者是不可見的,在表單中插入隱藏域的目的在於收集或傳送資訊,以利於被處理表單的程式所使用。瀏覽者單擊傳送按鈕傳送表單的時候,隱藏域的資訊也被一起傳送到伺服器。
5.在使用super和this關鍵字時,以下描述錯誤的是()
A.在子類構造方法中使用super()顯示呼叫父類的構造方法,super()必須寫在子類構造方法的第一行,否則編譯不通過
B.super()和this()不一定要放在構造方法內第一行
C.this()和super()可以同時出現在一個建構函式中
D.this()和super()可以在static環境中使用,包括static方法和static語句塊
解析:
答案:B C D
1.super和this都只能位於構造器的第一行,而且不能同時使用,這是因為會造成初始化兩次,this用於呼叫過載的構造器,super用於呼叫父類被子類重寫的方法,由於super()和this()必須在建構函式第一行,所以這一點也表明他倆不能在一個建構函式中
2.super()表示呼叫父類建構函式、this()呼叫自己的建構函式,而自己的建構函式第一行要使用super()呼叫父類的建構函式,所以這倆不能在一個建構函式中會出現重複引用的情況
3.this()和super()都指的是物件,所以,均不可以在static環境中使用。包括:static變數,static方法,static語句塊(裡面不能使用非static型別的)。因為static修飾的方法不能存在this指標
6.下面有關forward和redirect的描述,正確的是() ?
A.forward是伺服器將控制權轉交給另外一個內部伺服器物件,由新的物件來全權負責響應使用者的請求
B.執行forward時,瀏覽器不知道伺服器傳送的內容是從何處來,瀏覽器位址列中還是原來的地址
C.執行redirect時,伺服器端告訴瀏覽器重新去請求地址
D.forward是內部重定向,redirect是外部重定向
E.redirect預設將產生301 Permanently moved的HTTP響應
解析:
答案:B C D
1.從位址列顯示來說
forward是伺服器請求資源,伺服器直接訪問目標地址的URL,把那個URL的響應內容讀取過來,然後把這些內容再發給瀏覽器.瀏覽器根本不知道伺服器傳送的內容從哪裡來的,所以它的位址列還是原來的地址.
redirect是服務端根據邏輯,傳送一個狀態碼,告訴瀏覽器重新去請求那個地址.所以位址列顯示的是新的URL.
2.從資料共享來說
forward:轉發頁面和轉發到的頁面可以共享request裡面的資料.
redirect:不能共享資料.
3.從運用地方來說
forward:一般用於使用者登陸的時候,根據角色轉發到相應的模組.
redirect:一般用於使用者登出登陸時返回主頁面和跳轉到其它的網站等.
4.從效率來說
forward:高.
redirect:低.
7.下面有關forward和redirect的描述,正確的是() ?
A.forward是伺服器將控制權轉交給另外一個內部伺服器物件,由新的物件來全權負責響應使用者的請求
B.執行forward時,瀏覽器不知道伺服器傳送的內容是從何處來,瀏覽器位址列中還是原來的地址
C.執行redirect時,伺服器端告訴瀏覽器重新去請求地址
D.forward是內部重定向,redirect是外部重定向
E.redirect預設將產生301 Permanently moved的HTTP響應
解析:
答案:B C D
1.從位址列顯示來說
forward是伺服器請求資源,伺服器直接訪問目標地址的URL,把那個URL的響應內容讀取過來,然後把這些內容再發給瀏覽器.瀏覽器根本不知道伺服器傳送的內容從哪裡來的,所以它的位址列還是原來的地址.
redirect是服務端根據邏輯,傳送一個狀態碼,告訴瀏覽器重新去請求那個地址.所以位址列顯示的是新的URL.
2.從資料共享來說
forward:轉發頁面和轉發到的頁面可以共享request裡面的資料.
redirect:不能共享資料.
3.從運用地方來說
forward:一般用於使用者登陸的時候,根據角色轉發到相應的模組.
redirect:一般用於使用者登出登陸時返回主頁面和跳轉到其它的網站等.
4.從效率來說
forward:高.
redirect:低.
8.執行下列程式碼的輸出結果是( )
public class Demo{
public static void main(String args[]){
int num = 10;
System.out.println(test(num));
}
public static int test(int b){
try
{
b += 10;
return b;
}
catch(RuntimeException e)
{
}
catch(Exception e2)
{
}
finally
{
b += 10;
return b;
}
}
}
A.10
B.20
C.30
D.40
解析:
答案:C
如果finally塊中有return語句的話,它將覆蓋掉函式中其他return語句。
9.若有定義語句: int a=10 ; double b=3.14 ; 則表示式 ‘A’+a+b 值的型別是()
A.char
B.int
C.double
D.float
解析:
答案:C
不同型別運算結果型別向右邊靠齊。
char < short < int < float < double
10.下面論述正確的是()?
A.如果兩個物件的hashcode相同,那麼它們作為同一個HashMap的key時,必然返回同樣的值
B.如果a,b的hashcode相同,那麼a.equals(b)必須返回true
C.對於一個類,其所有物件的hashcode必須不同
D.如果a.equals(b)返回true,那麼a,b兩個物件的hashcode必須相同
解析:
答案:D
hashCode()方法和equals()方法的作用其實是一樣的,在Java裡都是用來對比兩個物件是否相等一致。
那麼equals()既然已經能實現對比的功能了,為什麼還要hashCode()呢?因為重寫的equals()裡一般比較的比較全面比較複雜,這樣效率就比較低,而利用hashCode()進行對比,則只要生成一個hash值進行比較就可以了,效率很高。
那麼hashCode()既然效率這麼高為什麼還要equals()呢? 因為hashCode()並不是完全可靠,有時候不同的物件他們生成的hashcode也會一樣(生成hash值得公式可能存在的問題),所以hashCode()只能說是大部分時候可靠,並不是絕對可靠,
所以我們可以得出:
1.equals()相等的兩個物件他們的hashCode()肯定相等,也就是用equals()對比是絕對可靠的。
2.hashCode()相等的兩個物件他們的equal()不一定相等,也就是hashCode()不是絕對可靠的。
所有對於需要大量並且快速的對比的話如果都用equals()去做顯然效率太低,所以解決方式是,每當需要對比的時候,首先用hashCode()去對比,如果hashCode()不一樣,則表示這兩個物件肯定不相等(也就是不必再用equal()去再對比了),如果hashCode()相同,此時再對比他們的equals(),如果equals()也相同,則表示這兩個物件是真的相同了,這樣既能大大提高了效率也保證了對比的絕對正確性!
11.下面程式的輸出結果為()
public class Demo {
public static String sRet = "";
public static void func(int i)
{
try
{
if (i%2==0)
{
throw new Exception();
}
}
catch (Exception e)
{
sRet += "0";
return;
}
finally
{
sRet += "1";
}
sRet += "2";
}
public static void main(String[] args)
{
func(1);
func(2);
System.out.println(sRet);
}
}
A.120
B.1201
C.12012
D.101
解析:
答案:B
- 呼叫func(1),if不符合,直接進入finally,sRet=“1"
- finally語句中沒有返回值,故繼續向下執行,sRet=“12”
- 呼叫func(2),if符合,sRet=“120”,此時有返回值!!!
- 呼叫finally語句,sRet=“1201”
- 因為已經有返回值了,finally之後的語句也不再執行,sRet=“1201”。
12.在java7中,下列不能做switch()的引數型別是?
A.int型
B.列舉型別
C.字串
D.浮點型
解析:
答案:D
switch語句後的控制表示式只能是short、char、int、String、long整數型別和列舉型別,不能是float,double和boolean型別。String型別是java7開始支援。
13.以下程式碼可以使用的修飾符是:()
A.final
B.static
C.abstract
D.public
解析:
答案:C
- 介面中欄位的修飾符:public static final(預設不寫)
- 介面中方法的修飾符:public abstract(預設不寫)
abstract只能修飾類和方法 不能修飾欄位
14.下面有關java classloader說法錯誤的是?
A.Java預設提供的三個ClassLoader是BootStrap ClassLoader,Extension ClassLoader,App ClassLoader
B.ClassLoader使用的是雙親委託模型來搜尋類的
C.JVM在判定兩個class是否相同時,只用判斷類名相同即可,和類載入器無關
D.ClassLoader就是用來動態載入class檔案到記憶體當中用的
解析:
答案:C
一個jvm中預設的classloader有Bootstrap ClassLoader、Extension ClassLoader、App ClassLoader,分別各司其職:
- Bootstrap ClassLoader 負責載入java基礎類,主要是 %JRE_HOME/lib/ 目錄下的rt.jar、resources.jar、charsets.jar和class等
- Extension ClassLoader 負責載入java擴充套件類,主要是 %JRE_HOME/lib/ext 目錄下的jar和class
- App ClassLoader負責載入當前java應用的classpath中的所有類。
classloader 載入類用的是全盤負責委託機制。 所謂全盤負責,即是當一個classloader載入一個Class的時候,這個Class所依賴的和引用的所有 Class也由這個classloader負責載入,除非是顯式的使用另外一個classloader載入。
所以,當我們自定義的classloader載入成功了 com.company.MyClass以後,MyClass裡所有依賴的class都由這個classLoader來載入完成。
比較兩個類是否相等,只有這兩個類是由同一個類載入器載入才有意義。否則,即使這兩個類是來源於同一個Class檔案,只要載入它們的類載入器不同,那麼這兩個類必定不相等。
補充:
1. 什麼是類載入器?
把類載入的過程放到Java虛擬機器外部去實現,讓應用程式決定如何去獲取所需要的類。實現這個動作的程式碼模組稱為“類載入器”。
2. 有哪些類載入器,分別載入哪些類
類載入器按照層次,從頂層到底層,分為以下三種:
(1)啟動類載入器 : 它用來載入 Java 的核心庫,比如String、System這些類
(2)擴充套件類載入器 : 它用來載入 Java 的擴充套件庫。
(3) 應用程式類載入器 : 負責載入使用者類路徑上所指定的類庫,一般來說,Java 應用的類都是由它來完成載入的。
3. 雙親委派模型
我們應用程式都是由以上三種類載入器互相配合進行載入的,還可以加入自己定義的類載入器。稱為 類載入器的雙親委派模型 ,這裡類載入器之間的父子關係一般不會以繼承的關係來實現,而是都使用 組合關係 來複用父載入器的。
4. 雙親委託模型的工作原理
是當一個類載入器收到了類載入的請求,它首先不會自己去嘗試載入這個類,而是把這個請求委派給父類載入器去完成,每一個層次的類載入都是如此,因此所有的載入請求最終都應該傳送到頂層的啟動類載入器中,只有當父載入器反饋自己無法載入這個載入請求的時候,子載入器才會嘗試自己去載入。
5. 使用雙親委派模型好處?(原因)
第一:可以避免重複載入,當父親已經載入了該類的時候,子類不需要再次載入。
第二:考慮到安全因素,如果不使用這種委託模式,那我們就可以隨時使用自定義的String來動態替代java核心api中定義型別,這樣會存在非常大的安全隱患,而雙親委託的方式,就可以避免這種情況,因為String已經在啟動時被載入,所以使用者自定義類是無法載入一個自定義的類裝載器。
15.以下程式執行的結果是:
class X{
Y y=new Y();
public X(){
System.out.print("X");
}
}
class Y{
public Y(){
System.out.print("Y");
}
}
public class Z extends X{
Y y=new Y();
public Z(){
System.out.print("Z");
}
public static void main(String[] args) {
new Z();
}
}
A.ZYXX
B.ZYXY
C.YXYZ
D.ClaXYZXssLoader就是用來動態載入class檔案到記憶體當中用的
解析:
答案:C
初始化過程:
- 初始化父類中的靜態成員變數和靜態程式碼塊 ;
- 初始化子類中的靜態成員變數和靜態程式碼塊 ;
- 初始化父類的普通成員變數和程式碼塊,再執行父類的構造方法;
- 初始化子類的普通成員變數和程式碼塊,再執行子類的構造方法;
(1)初始化父類的普通成員變數和程式碼塊,執行 Y y=new Y(); 輸出Y
(2)再執行父類的構造方法;輸出X
(3) 初始化子類的普通成員變數和程式碼塊,執行 Y y=new Y(); 輸出Y
(4)再執行子類的構造方法;輸出Z
所以輸出YXYZ
16.下列語句:int *p, a = 10; p = &a.
均表示地址的是()
A.a , p, &a
B.&*a,&a,*p
C.*&p, *p, &a
D.&a, p, &*p
解析:
答案:D
- *p表示指標p
- &a表示取a的記憶體地址
- p = &a 表示p等於a的記憶體地址
- &*p表示獲取指標p的記憶體地址
- *&p表示指向P記憶體地址的一個指標
17.ArrayList list = new ArrayList(20);中的list擴充幾次
A.0
B.1
C.2
D.3
解析:
答案:A
Arraylist預設陣列大小是10,擴容後的大小是擴容前的1.5倍,最大值小於Integer 的最大值減8,如果新建立的集合有帶初始值,預設就是傳入的大小,也就不會擴容,由於本地在建立陣列時直接分配了記憶體大小,所以不會擴充
18.Thread. sleep()是否會丟擲checked exception?
A.會
B.不會
解析:
答案:A
checked exception:指的是編譯時異常,該類異常需要本函式必須處理的,用try和catch處理,或者用throws丟擲異常,然後交給呼叫者去處理異常。
runtime exception:指的是執行時異常,該類異常不必須本函式必須處理,當然也可以處理。
Thread.sleep()丟擲的InterruptException屬於checked exception;IllegalArgumentException屬於Runtime exception;
相關文章
- 牛客錯題集(Java)Java
- 錯題集1-牛客
- 牛客網專項練習(八)——選擇題(錯題&不懂的題)
- 牛客多校H題題解
- 【牛客訓練記錄】2024牛客國慶集訓派對day2
- 【牛客訓練記錄】2024牛客國慶集訓派對day1
- 【牛客訓練記錄】2024牛客國慶集訓派對day3
- 牛客網Java評估題Java
- 牛客題霸--求路徑
- 【10.22 牛客普及(三)】 牛半仙的妹子gcd 題解GC
- 牛客小白月賽105 題解
- 牛客周賽 Round 66 題解
- 【10.24 牛客普及(四)】 卡片 題解
- 牛客SQL練習第21題SQL
- 牛客網--華為機試題
- 牛客2020跨年場 部分題解
- 牛客
- 2020牛客國慶集訓派對4 C
- 牛客網刷題(純java題型 31~60題)Java
- 牛客網刷題(純java題型 1~30題)Java
- 牛客網刷題(純java題型 91~120題)Java
- 牛客網刷題(純java題型 241~270題)Java
- 牛客網刷題(純java題型 421~450題)Java
- 牛客周賽 Round 70 A~G 題解
- 牛客周賽 Round 62 全部題解
- 牛客網SQL刷題31-40SQL
- 牛客網SQL刷題41-50SQL
- 牛客網字串排序程式設計題字串排序程式設計
- golang 錯題集Golang
- golang錯題集Golang
- 牛客題霸 [括號序列] C++題解/答案C++
- 牛客小白月賽88-DE題解
- 牛客網刷題hj1-hj4
- 牛客 215E 黃魔法師 題解
- 牛客小白月賽88 出題覆盤
- 2020牛客多校第八場K題
- 牛客練習賽73 D題:離別
- ABB (2020牛客國慶集訓派對day1)