偶娑迹客網(wǎng)Java練習2

鏈接:https://www.nowcoder.com/questionTerminal/d785568007944278aa78418297c0d1e6
來源:胖祭裕客網(wǎng)

1. HashSet子類依靠()方法區(qū)分重復元素漂羊。

A toString(),equals()
B clone(),equals()
C hashCode(),equals()
D getClass(),clone()

答案 C
HashSet內(nèi)部使用Map保存數(shù)據(jù)驾锰,即將HashSet的數(shù)據(jù)作為Map的key值保存,這也是HashSet中元素不能重復的原因走越。而Map中保存key值前椭豫,會去判斷當前Map中是否含有該key對象,內(nèi)部是先通過key的hashCode,確定有相同的hashCode之后赏酥,再通過equals方法判斷是否相同喳整。

2.說明輸出結果。
package test;
import java.util.Date; 
public class SuperTest extends Date{ 
    private static final long serialVersionUID = 1L; 
    private void test(){ 
       System.out.println(super.getClass().getName()); 
    } 
      
    public static void main(String[]args){ 
       new SuperTest().test(); 
    } 
}

A SuperTest
B SuperTest.class
C test.SuperTest
D test.SuperTest.class

解析:

TestSuper和Date的getClass都沒有重寫裸扶,他們都是調(diào)用Object的getClass框都,而Object的getClass作用是返回的是運行時的類的名字。這個運行時的類就是當前類呵晨,所以
super.getClass().getName()
返回的是test.SuperTest魏保,與Date類無關
要返回Date類的名字需要寫super.getClass().getSuperclass()

3.jre 判斷程序是否執(zhí)行結束的標準是()

A 所有的前臺線程執(zhí)行完畢
B 所有的后臺線程執(zhí)行完畢
C 所有的線程執(zhí)行完畢
D 和以上都無關

main()函數(shù)即主函數(shù),是一個前臺線程摸屠,前臺進程是程序中必須執(zhí)行完成的谓罗,而后臺線程則是java中所有前臺結束后結束,不管有沒有完成餐塘,后臺線程主要用與內(nèi)存分配等方面妥衣。
前臺線程和后臺線程的區(qū)別和聯(lián)系:
1、后臺線程不會阻止進程的終止戒傻。屬于某個進程的所有前臺線程都終止后,該進程就會被終止蜂筹。所有剩余的后臺線程都會停止且不會完成需纳。
2、可以在任何時候?qū)⑶芭_線程修改為后臺線程艺挪,方式是設置Thread.IsBackground 屬性不翩。
3、不管是前臺線程還是后臺線程麻裳,如果線程內(nèi)出現(xiàn)了異常口蝠,都會導致進程的終止。
4津坑、托管線程池中的線程都是后臺線程妙蔗,使用new Thread方式創(chuàng)建的線程默認都是前臺線程。
說明:
應用程序的主線程以及使用Thread構造的線程都默認為前臺線程
使用Thread建立的線程默認情況下是前臺線程疆瑰,在進程中眉反,只要有一個前臺線程未退出,進程就不會終止穆役。主線程就是一個前臺線程寸五。而后臺線程不管線程是否結束,只要所有的前臺線程都退出(包括正常退出和異常退出)后耿币,進程就會自動終止梳杏。一般后臺線程用于處理時間較短的任務,如在一個Web服務器中可以利用后臺線程來處理客戶端發(fā)過來的請求信息。而前臺線程一般用于處理需要長時間等待的任務十性,如在Web服務器中的監(jiān)聽客戶端請求的程序叭莫,或是定時對某些系統(tǒng)資源進行掃描的程序

3.下面有關java的一些細節(jié)問題,描述錯誤的是烁试?

A 構造方法不需要同步化
B 一個子類不可以覆蓋掉父類的同步方法
C 定義在接口中的方法默認是public的
D 容器保存的是對象的引用

答案B
構造方法每次都是構造出新的對象雇初,不存在多個線程同時讀寫同一對象中的屬性的問題,所以不需要同步 减响。
如果父類中的某個方法使用了 synchronized關鍵字靖诗,而子類中也覆蓋了這個方法,默認情況下子類中的這個方法并不是同步的支示,必須顯示的在子類的這個方法中加上 synchronized關鍵字才可刊橘。當然,也可以在子類中調(diào)用父類中相應的方法颂鸿,這樣雖然子類中的方法并不是同步的促绵,但子類調(diào)用了父類中的同步方法,也就相當子類方法也同步了嘴纺。

4.下列說法正確的是

A 在類方法中可用this來調(diào)用本類的類方法
B 在類方法中調(diào)用本類的類方法可直接調(diào)用
C 在類方法中只能調(diào)用本類的類方法
D 在類方法中絕對不能調(diào)用實例方法
答案B
A this指當前對象只能在實際方法和構造函數(shù)中調(diào)用败晴。C 可以調(diào)用其他類的非私有類方法。D 不能直接調(diào)用栽渴,到先生成對象尖坤。通過對象即可調(diào)用實例方法。

5.java中闲擦,StringBuilder和StringBuffer的區(qū)別慢味,下面說法錯誤的是?

A StringBuffer是線程安全的
B StringBuilder是非線程安全的
C StringBuffer對 String 類型進行改變的時候其實都等同于生成了一個新的 String 對象墅冷,然后將指針指向新的 String 對象纯路。
D 效率比較String<StringBuffer<StringBuilder,但是在 String S1 = “This is only a” + “ simple” + “ test”時寞忿,String效率最高驰唬。

答案 C

String對String 類型進行改變的時候其實都等同于生成了一個新的 String 對象,然后將指針指向新的 String 對象罐脊,而不是StringBuffer定嗓;StringBuffer每次結果都會對 StringBuffer 對象本身進行操作,而不是生成新的對象萍桌,再改變對象引用宵溅。

6.下面哪種情況會導致持久區(qū)jvm堆內(nèi)存溢出?

A 循環(huán)上萬次的字符串處理
B 在一段代碼內(nèi)申請上百M甚至上G的內(nèi)存
C 使用CGLib技術直接操作字節(jié)碼運行上炎,生成大量的動態(tài)類
D 不斷創(chuàng)建對象

答案 C

簡單的來說 java的堆內(nèi)存分為兩塊:permantspace(持久帶) 和 heap space恃逻。
持久帶中主要存放用于存放靜態(tài)類型數(shù)據(jù)雏搂,如 Java Class, Method 等, 與垃圾收集器要收集的Java對象關系不大寇损。
而heapspace分為年輕帶和年老帶
年輕代的垃圾回收叫 Young GC凸郑, 年老代的垃圾回收叫 Full GC。
在年輕代中經(jīng)歷了N次(可配置)垃圾回收后仍然存活的對象矛市,就會被復制到年老代中芙沥。因此,可以認為年老代中存放的都是一些生命周期較長的對象
年老代溢出原因有 循環(huán)上萬次的字符串處理浊吏、創(chuàng)建上千萬個對象而昨、在一段代碼內(nèi)申請上百M甚至上G的內(nèi)存,既A B D選項
持久代溢出原因 動態(tài)加載了大量Java類而導致溢出

原理

JVM堆內(nèi)存分為2塊:Permanent Space 和 Heap Space找田。

  • Permanent 即 持久代(Permanent Generation)歌憨,主要存放的是Java類定義信息,與垃圾收集器要收集的Java對象關系不大墩衙。
  • Heap = { Old + NEW = {Eden, from, to} }务嫡,Old 即 年老代(Old Generation),New 即 年輕代(Young Generation)漆改。年老代和年輕代的劃分對垃圾收集影響比較大心铃。

年輕代

所有新生成的對象首先都是放在年輕代。年輕代的目標就是盡可能快速的收集掉那些生命周期短的對象籽懦。年輕代一般分3個區(qū)于个,1個Eden區(qū),2個Survivor區(qū)(from 和 to)暮顺。

大部分對象在Eden區(qū)中生成。當Eden區(qū)滿時秀存,還存活的對象將被復制到Survivor區(qū)(兩個中的一個)捶码,當一個Survivor區(qū)滿時,此區(qū)的存活對象將被復制到另外一個Survivor區(qū)或链,當另一個Survivor區(qū)也滿了的時候惫恼,從前一個Survivor區(qū)復制過來的并且此時還存活的對象,將可能被復制到年老代澳盐。

2個Survivor區(qū)是對稱的祈纯,沒有先后關系,所以同一個Survivor區(qū)中可能同時存在從Eden區(qū)復制過來對象叼耙,和從另一個Survivor區(qū)復制過來的對象腕窥;而復制到年老區(qū)的只有從另一個Survivor區(qū)過來的對象。而且筛婉,因為需要交換的原因簇爆,Survivor區(qū)至少有一個是空的。特殊的情況下,根據(jù)程序需要入蛆,Survivor區(qū)是可以配置為多個的(多于2個)响蓉,這樣可以增加對象在年輕代中的存在時間,減少被放到年老代的可能哨毁。

針對年輕代的垃圾回收即 Young GC枫甲。

年老代

在年輕代中經(jīng)歷了N次(可配置)垃圾回收后仍然存活的對象,就會被復制到年老代中扼褪。因此想幻,可以認為年老代中存放的都是一些生命周期較長的對象。

針對年老代的垃圾回收即 Full GC迎捺。

持久代

用于存放靜態(tài)類型數(shù)據(jù)举畸,如 Java Class, Method 等。持久代對垃圾回收沒有顯著影響凳枝。但是有些應用可能動態(tài)生成或調(diào)用一些Class抄沮,例如 Hibernate CGLib 等,在這種時候往往需要設置一個比較大的持久代空間來存放這些運行過程中動態(tài)增加的類型岖瑰。

所以叛买,當一組對象生成時,內(nèi)存申請過程如下:

  1. JVM會試圖為相關Java對象在年輕代的Eden區(qū)中初始化一塊內(nèi)存區(qū)域蹋订。
  2. 當Eden區(qū)空間足夠時率挣,內(nèi)存申請結束。否則執(zhí)行下一步露戒。
  3. JVM試圖釋放在Eden區(qū)中所有不活躍的對象(Young GC)椒功。釋放后若Eden空間仍然不足以放入新對象,JVM則試圖將部分Eden區(qū)中活躍對象放入Survivor區(qū)智什。
  4. Survivor區(qū)被用來作為Eden區(qū)及年老代的中間交換區(qū)域动漾。當年老代空間足夠時,Survivor區(qū)中存活了一定次數(shù)的對象會被移到年老代荠锭。
  5. 當年老代空間不夠時旱眯,JVM會在年老代進行完全的垃圾回收(Full GC)。
  6. Full GC后证九,若Survivor區(qū)及年老代仍然無法存放從Eden區(qū)復制過來的對象删豺,則會導致JVM無法在Eden區(qū)為新生成的對象申請內(nèi)存,即出現(xiàn)“Out of Memory”愧怜。

OOM(“Out of Memory”)異常一般主要有如下2種原因

  1. 年老代溢出呀页,表現(xiàn)為:java.lang.OutOfMemoryError:Javaheapspace

這是最常見的情況,產(chǎn)生的原因可能是:設置的內(nèi)存參數(shù)Xmx過小或程序的內(nèi)存泄露及使用不當問題叫搁。

例如循環(huán)上萬次的字符串處理赔桌、創(chuàng)建上千萬個對象供炎、在一段代碼內(nèi)申請上百M甚至上G的內(nèi)存。還有的時候雖然不會報內(nèi)存溢出疾党,卻會使系統(tǒng)不間斷的垃圾回收音诫,也無法處理其它請求。這種情況下除了檢查程序雪位、打印堆內(nèi)存等方法排查竭钝,還可以借助一些內(nèi)存分析工具,比如MAT就很不錯雹洗。

  1. 持久代溢出香罐,表現(xiàn)為:java.lang.OutOfMemoryError:PermGenspace

通常由于持久代設置過小,動態(tài)加載了大量Java類而導致溢出时肿,解決辦法唯有將參數(shù) -XX:MaxPermSize 調(diào)大(一般256m能滿足絕大多數(shù)應用程序需求)庇茫。將部分Java類放到容器共享區(qū)(例如Tomcat share lib)去加載的辦法也是一個思路,但前提是容器里部署了多個應用螃成,且這些應用有大量的共享類庫

7.下面敘述那個是正確的旦签?()

A java中的集合類(如Vector)可以用來存儲任何類型的對象,且大小可以自動調(diào)整寸宏。但需要事先知道所存儲對象的類型宁炫,才能正常使用。
B 在java中氮凝,我們可以用違例(Exception)來拋出一些并非錯誤的消息羔巢,但這樣比直接從函數(shù)返回一個結果要更大的系統(tǒng)開銷。
C java接口包含函數(shù)聲明和變量聲明罩阵。
D java中竿秆,子類不可以訪問父類的私有成員和受保護的成員。
答案C
A.vector是線程安全的ArrayList稿壁,在內(nèi)存中占用連續(xù)的空間袍辞。初始時有一個初始大小,當數(shù)據(jù)條數(shù)大于這個初始大小后會重寫分配一個更大的連續(xù)空間常摧。如果Vector定義為保存Object則可以存放任意類型。

B.try{}catch{}會增加額外的開銷

C.接口中聲明的'變量'必須為public final static,所以為常量

D.子類可以訪問父類受保護的成員

8.對于子類的構造函數(shù)說明威创,下列敘述中錯誤的是( )落午。

A 子類可以繼承父類的構造函數(shù)。
B 子類中調(diào)用父類構造函數(shù)不可以直接書寫父類構造函數(shù)肚豺,而應該用super();溃斋。
C 用new創(chuàng)建子類的對象時,若子類沒有帶參構造函數(shù)吸申,將先執(zhí)行父類的無參構造函數(shù)梗劫,然后再執(zhí)行自己的構造函數(shù)享甸。
D 子類的構造函數(shù)中可以調(diào)用其他函數(shù)。

答案 A
A.java繼承中對構造函數(shù)是不繼承的梳侨,只是顯式或者隱式調(diào)用

9.String與StringBuffer的區(qū)別蛉威。

A String是不可變的對象,StringBuffer是可以再編輯的
B 字符串是常量走哺,StringBuffer是變量
C String是可變的對象蚯嫌,StringBuffer是不可以再編輯的
D 以上說法都不正確

答案 AB
String, StringBuffer,StringBuilder的區(qū)別

java中String、StringBuffer丙躏、StringBuilder是編程中經(jīng)常使用的字符串類择示,他們之間的區(qū)別也是經(jīng)常在面試中會問到的問題。現(xiàn)在總結一下晒旅,看看他們的不同與相同栅盲。

1.可變與不可變

String類中使用字符數(shù)組保存字符串,如下就是废恋,因為有“final”修飾符谈秫,所以可以知道string對象是不可變的。

private final char value[];

  String 為不可變對象,一旦被創(chuàng)建,就不能修改它的值. . 對于已經(jīng)存在的String對象的修改都是重新創(chuàng)建一個新的對象,然后把新的值保存進去.

StringBuilder與StringBuffer都繼承自AbstractStringBuilder類拴签,在AbstractStringBuilder中也是使用字符數(shù)組保存字符串孝常,如下就是,可知這兩種對象都是可變的蚓哩。

char[] value;

 StringBuffer:是一個可變對象,當對他進行修改的時候不會像String那樣重新建立對象 , 它只能通過構造函數(shù)來建立,  如: StringBuffer sb = new StringBuffer();

不能通過賦值符號對他進行付值. 构灸, 如 sb = "welcome to here!";//error
對象被建立以后,在內(nèi)存中就會分配內(nèi)存空間,并初始保存一個null.向StringBuffer中賦值的時候可以通過它的append方法. sb.append("hello");

2.是否多線程安全

String中的對象是不可變的,也就可以理解為常量岸梨, 顯然線程安全 喜颁。

AbstractStringBuilder是StringBuilder與StringBuffer的公共父類,定義了一些字符串的基本操作曹阔,如expandCapacity半开、append、insert赃份、indexOf等公共方法寂拆。

StringBuffer對方法加了同步鎖或者對調(diào)用的方法加了同步鎖,所以是 線程安全的 抓韩÷贡睿看如下源碼:

   public   synchronized  StringBuffer reverse() {
       super .reverse();
       return   this ;
  }

  

   public   int  indexOf(String str) {
      return  indexOf(str, 0);         //存在 public synchronized int indexOf(String str, int fromIndex) 方法
  }

StringBuilder并沒有對方法進行加同步鎖癞埠,所以是 非線程安全的 。

3.StringBuilder與StringBuffer共同點

StringBuilder與StringBuffer有公共父類AbstractStringBuilder( 抽象類 )。

抽象類與接口的其中一個區(qū)別是:抽象類中可以定義一些子類的公共方法杂抽,子類只需要增加新的功能舅列,不需要重復寫已經(jīng)存在的方法;而接口中只是對方法的申明和常量的定義。

StringBuilder啤覆、StringBuffer的方法都會調(diào)用AbstractStringBuilder中的公共方法,如super.append(...)惭聂。只是StringBuffer會在方法上加synchronized關鍵字窗声,進行同步。

最后彼妻,如果程序不是多線程的嫌佑,那么使用StringBuilder效率高于StringBuffer。

效率比較String < StringBuffer < StringBuilder侨歉,但是在String S1 =“This is only a”+“simple”+“test”時屋摇,String效率最高。

10.下面描述屬于java虛擬機功能的是幽邓?

A 通過 ClassLoader 尋找和裝載 class 文件
B 解釋字節(jié)碼成為指令并執(zhí)行炮温,提供 class 文件的運行環(huán)境
C 進行運行期間垃圾回收
D 提供與硬件交互的平臺

答案 A B C D
通過 ClassLoader 尋找和裝載 class 文件
解釋字節(jié)碼成為指令并執(zhí)行,提供 class 文件的運行環(huán)境
進行運行期間垃圾回收
提供與硬件交互的平臺

11.接口不能擴展(繼承)多個接口牵舵。( )

A 正確
B 錯誤
答案 B
java類是單繼承的柒啤。classB Extends classA
java接口可以多繼承。Interface3 Extends Interface0, Interface1, interface……

    不允許類多重繼承的主要原因是畸颅,如果A同時繼承B和C担巩,而b和c同時有一個D方法,A如何決定該繼承那一個呢没炒?
    但接口不存在這樣的問題涛癌,接口全都是抽象方法繼承誰都無所謂,所以接口可以繼承多個接口送火。
12.接口不能擴展(繼承)多個接口拳话。( )

A class中的constructor不可省略
B constructor必須與class同名,但方法不能與class同名
C constructor在一個對象被new時執(zhí)行
D 一個class只能定義一個constructor

答案:C

A.構造函數(shù)可以省略种吸,省略構造函數(shù)則new對象實例時弃衍,所有的數(shù)據(jù)類型賦值為0,bool類型賦值為FALSE坚俗,引用類型賦值為NULL镜盯。

B.構造函數(shù)必須與類同名,而且不能有返回類型猖败。而方法是可以與類同名的形耗,但是必須聲明返回數(shù)據(jù)類型。

C.正確辙浑,當new對象是首先調(diào)用靜態(tài)初始數(shù)據(jù)塊(可省略),然后調(diào)用父類構造函數(shù)(不是子類則不調(diào)用)拟糕,最后調(diào)用自己的構造函數(shù)(一定調(diào)用)判呕,這樣才能生成一個對象的實例倦踢。

D.構造函數(shù)是可以重載的,重載的要求是參數(shù)不同侠草。

13.在使用super 和this關鍵字時辱挥,以下描述正確的是

A 在子類構造方法中使用super()顯示調(diào)用父類的構造方法,super()必須寫在子類構造方法的第一行边涕,否則編譯不通過
B super()和this()不一定要放在構造方法內(nèi)第一行
C this()和super()可以同時出現(xiàn)在一個構造函數(shù)中
D this()和super()可以在static環(huán)境中使用晤碘,包括static方法和static語句塊

答案 A
1)調(diào)用super()必須寫在子類構造方法的第一行,否則編譯不通過功蜓。每個子類構造方法的第一條語句园爷,都是隱含地調(diào)用super(),如果父類沒有這種形式的構造函數(shù)式撼,那么在編譯的時候就會報錯童社。

2)super()和this()類似,區(qū)別是,super從子類中調(diào)用父類的構造方法著隆,this()在同一類內(nèi)調(diào)用其它方法扰楼。

3)super()和this()均需放在構造方法內(nèi)第一行。

4)盡管可以用this調(diào)用一個構造器美浦,但卻不能調(diào)用兩個弦赖。

5)this和super不能同時出現(xiàn)在一個構造函數(shù)里面,因為this必然會調(diào)用其它的構造函數(shù)浦辨,其它的構造函數(shù)必然也會有super語句的存在蹬竖,所以在同一個構造函數(shù)里面有相同的語句,就失去了語句的意義荤牍,編譯器也不會通過案腺。

6)this()和super()都指的是對象,所以康吵,均不可以在static環(huán)境中使用劈榨。包括:static變量,static方法,static語句塊晦嵌。

7)從本質(zhì)上講同辣,this是一個指向本對象的指針, 然而super是一個Java關鍵字。

14.下列語句正確的是( )

A 形式參數(shù)可被視為local variable
B 形式參數(shù)可被所有的字段修飾符修飾
C 形式參數(shù)為方法被調(diào)用時惭载,是真正被傳遞的參數(shù)
D 形式參數(shù)不可以是對象

答案 A
A:形式參數(shù)可被視為local variable旱函。形參和局部變量一樣都不能離開方法。都只有在方法內(nèi)才會發(fā)生作用描滔,也只有在方法中使用棒妨,不會在方法外可見。

B: 對于形式參數(shù)只能用final修飾符含长,其它任何修飾符都會引起編譯器錯誤券腔。但是用這個修飾符也有一定的限制伏穆,就是在方法中不能對參數(shù)做任何修改。 不過一般情況下纷纫,一個方法的形參不用final修飾枕扫。只有在特殊情況下,那就是:方法內(nèi)部類辱魁。 一個方法內(nèi)的內(nèi)部類如果使用了這個方法的參數(shù)或者局部變量的話烟瞧,這個參數(shù)或局部變量應該是final。

C:形參的值在調(diào)用時根據(jù)調(diào)用者更改染簇,實參則用自身的值更改形參的值(指針参滴、引用皆在此列),也就是說真正被傳遞的是實參剖笙。

D:方法的參數(shù)列表指定要傳遞給方法什么樣的信息卵洗,采用的都是對象的形式。因此弥咪,在參數(shù)列表中必須指定每個所傳遞對象的類型及名字过蹂。想JAVA中任何傳遞對象的場合一樣,這里傳遞的實際上也是引用聚至,并且引用的類型必須正確酷勺。

15.java如何接受request域中的參數(shù)?

A request.getRequestURL()
B request. getAttribute()
C request.getParameter()
D request.getWriter()

答案 C
request.getAttribute 其實是取的web容器里面的值,而不是頁面通過get或者post方式傳上來的參數(shù)值扳躬。 一個request就是一個對象脆诉,setAttribute,其實就是在request scope里面添加了一個變量贷币。我們打個比方击胜,request里有一個map,setAttribute就是map.put役纹。 request.getParameter("username") 只是處理參數(shù)偶摔,但是在有username這個參數(shù)的情況下,你可以認為是等價促脉。 但是paramter是個string返回值辰斋。 request.setAttribute()和getAttribute()方法傳遞的數(shù)據(jù)只會存在于Web容器內(nèi)部,在具有轉發(fā)關系的web組件之間共享瘸味。 這兩個方法能夠設置Object類型的共享數(shù)據(jù)宫仗。

16.指出下列程序運行的結果()
public class Example{
    String str = new String("good");
    char[ ] ch = { 'a' , 'b' , 'c' };
    public static void main(String args[]){
        Example ex = new Example();
        ex.change(ex.str,ex.ch);
        System.out.print(ex.str + " and ");
        System.out.print(ex.ch);
    }
    public void change(String str,char ch[ ]){
        str = "test ok";
        ch[0] = 'g';
    }
}

A good and abc
B good and gbc
C test ok and abc
D test ok and gbc

答案 B
首先說下String確實是個不可變對象,這個不可變是JDK特有的旁仿,寫JAVA的人特意針對的
但是這與本題無關藕夫,題目中的形參str只是原引用ex.str的一個引用副本,傳的是一個副本地址值,這個值與ex.str地址值是不一樣的,但是它們同時指向了堆中的對象new String("good")汁胆,當你在函數(shù)中改變形參也就是地址的副本值也就是這句str="test ok"只是將副本地址指向常量"test ok"梭姓,并沒有改變原ex.str的指向方向,它還是指向?qū)ο髇ew String("good")的
char數(shù)組與String一樣傳的也是地址的副本嫩码,但是關鍵是形參ch它沒有新的指向 ch[0]只是ch在指向原對象時改變了對象的內(nèi)部結構, 所以在ex.ch指向與它是同一個對象的情況下當然也會隨之變化

17.HashMap和HashTable的描述,錯誤的是罪既?

A 他們都實現(xiàn)了Map接口铸题。
B HashMap非線程安全,在多個線程訪問Hashtable時琢感,不需要自己為它的方法實現(xiàn)同步丢间,而HashMap就必須為之提供額外同步。
C HashMap允許將null作為一個entry的key或者value驹针,而Hashtable不允許烘挫。
D 通過contains方法可以判斷一個對象是否存在于HashMap或者Hashtable中。

答案 D

//HashMap的源碼
public class HashMap<K,V>
    extends AbstractMap<K,V>
    implements Map<K,V>, Cloneable, Serializable
-----------------------------------
//Hashtable的源碼
public class Hashtable<K,V>
    extends Dictionary<K,V>
    implements Map<K,V>, Cloneable, java.io.Serializable
----------------------------------
public V put(K key, V value) //HashMap的put方法柬甥,沒有同步
 
public synchronized V put(K key, V value) //Hashtable的put方法
//當然饮六,Hashtable的其他方法,如get苛蒲,size卤橄,remove等方法,
//都加了synchronized關鍵詞同步操作
//Hashtable的put方法有以下語句塊臂外,大伙看了都知道
// Make sure the value is not null
if (value == null) {
    throw new NullPointerException();
}
 
//那么窟扑,我們再來看下HashMap的put方法中,有如下語句
//調(diào)用某個方法直接把key為null漏健,值為value的鍵值對插入進去嚎货。
if (key == null)
    return putForNullKey(value);

//以下是Hashtable的方法
public synchronized boolean contains(Object value)
public synchronized boolean containsKey(Object key)
public boolean containsValue(Object value)
 
//以下是HashMap中的方法,注意蔫浆,沒有contains方法殖属,所以,D錯誤
public boolean containsKey(Object key)
public boolean containsValue(Object value)

關于HashMap的一些說法:

a) HashMap實際上是一個“鏈表散列”的數(shù)據(jù)結構克懊,即數(shù)組和鏈表的結合體忱辅。HashMap的底層結構是一個數(shù)組,數(shù)組中的每一項是一條鏈表谭溉。
b) HashMap的實例有倆個參數(shù)影響其性能: “初始容量” 和 裝填因子墙懂。
c) HashMap實現(xiàn)不同步,線程不安全扮念。 HashTable線程安全
d) HashMap中的key-value都是存儲在Entry中的损搬。
e) HashMap可以存null鍵和null值,不保證元素的順序恒久不變,它的底層使用的是數(shù)組和鏈表巧勤,通過hashCode()方法和equals方法保證鍵的唯一性
f) 解決沖突主要有三種方法:定址法嵌灰,拉鏈法,再散列法颅悉。HashMap是采用拉鏈法解決哈希沖突的沽瞭。
注: 鏈表法是將相同hash值的對象組成一個鏈表放在hash值對應的槽位;
用開放定址法解決沖突的做法是:當沖突發(fā)生時剩瓶,使用某種探查(亦稱探測)技術在散列表中形成一個探查(測)序列驹溃。 沿此序列逐個單元地查找,直到找到給定 的關鍵字延曙,或者碰到一個開放的地址(即該地址單元為空)為止(若要插入豌鹤,在探查到開放的地址,則可將待插入的新結點存人該地址單元)枝缔。
拉鏈法解決沖突的做法是: 將所有關鍵字為同義詞的結點鏈接在同一個單鏈表中 布疙。若選定的散列表長度為m,則可將散列表定義為一個由m個頭指針組成的指針數(shù) 組T[0..m-1]愿卸。凡是散列地址為i的結點灵临,均插入到以T[i]為頭指針的單鏈表中。T中各分量的初值均應為空指針擦酌。在拉鏈法中俱诸,裝填因子α可以大于1,但一般均取α≤1赊舶。拉鏈法適合未規(guī)定元素的大小睁搭。

  1. Hashtable和HashMap的區(qū)別:

a) 繼承不同。
public class Hashtable extends Dictionary implements Map
public class HashMap extends AbstractMap implements Map
b) Hashtable中的方法是同步的笼平,而HashMap中的方法在缺省情況下是非同步的园骆。在多線程并發(fā)的環(huán)境下,可以直接使用Hashtable寓调,但是要使用HashMap的話就要自己增加同步處理了锌唾。
c) Hashtable 中, key 和 value 都不允許出現(xiàn) null 值夺英。 在 HashMap 中晌涕, null 可以作為鍵,這樣的鍵只有一個痛悯;可以有一個或多個鍵所對應的值為 null 余黎。當 get() 方法返回 null 值時,即可以表示 HashMap 中沒有該鍵载萌,也可以表示該鍵所對應的值為 null 惧财。因此巡扇,在 HashMap 中不能由 get() 方法來判斷 HashMap 中是否存在某個鍵, 而應該用 containsKey() 方法來判斷垮衷。
d) 兩個遍歷方式的內(nèi)部實現(xiàn)上不同厅翔。Hashtable、HashMap都使用了Iterator搀突。而由于歷史原因刀闷,Hashtable還使用了Enumeration的方式 。
e) 哈希值的使用不同仰迁,HashTable直接使用對象的hashCode涩赢。而HashMap重新計算hash值。
f) Hashtable和HashMap它們兩個內(nèi)部實現(xiàn)方式的數(shù)組的初始大小和擴容的方式轩勘。HashTable中hash數(shù)組默認大小是11,增加的方式是old*2+1怯邪。HashMap中hash數(shù)組的默認大小是16绊寻,而且一定是2的指數(shù)。

注: HashSet子類依靠hashCode()和equal()方法來區(qū)分重復元素悬秉。
HashSet內(nèi)部使用Map保存數(shù)據(jù)澄步,即將HashSet的數(shù)據(jù)作為Map的key值保存,這也是HashSet中元素不能重復的原因和泌。而Map中保存key值的,會去判斷當前Map中是否含有該Key對象村缸,內(nèi)部是先通過key的hashCode,確定有相同的hashCode之后,再通過equals方法判斷是否相同武氓。

18.volatile關鍵字的說法錯誤的是

A 能保證線程安全
B volatile關鍵字用在多線程同步中梯皿,可保證讀取的可見性
C JVM保證從主內(nèi)存加載到線程工作內(nèi)存的值是最新的
D volatile能禁止進行指令重排序

答案 A
出于運行速率的考慮,java編譯器會把經(jīng)常經(jīng)常訪問的變量放到緩存(嚴格講應該是工作內(nèi)存)中县恕,讀取變量則從緩存中讀东羹。但是在多線程編程中,內(nèi)存中的值和緩存中的值可能會出現(xiàn)不一致。volatile用于限定變量只能從內(nèi)存中讀取忠烛,保證對所有線程而言属提,值都是一致的。但是volatile不能保證原子性美尸,也就不能保證線程安全冤议。

19.運行下面代碼,輸出的結果是()
    class A {

        static {
            System.out.println("class A static");
        }

        {
            System.out.println("I'm A class");
        }

        public A() {

            System.out.println("class A");

        }

    }

    public class B extends A {

        static {
            System.out.println("class B static");
        }

        {
            System.out.println("I'm B class");
        }

        public B() {

            System.out.println("class B");
        }

        public static void main(String[] args) {
            new B();
        }
    }

答案

class A static        
class B static           
I'm A class             
class A               
I'm B class 
class B

B繼承A new B會
1.把A的靜態(tài)的執(zhí)行完 執(zhí)行B的靜態(tài)的
2.再執(zhí)行A的初始化代碼塊师坎,構造函數(shù)
3.再執(zhí)行B的初始化代碼塊恕酸,構造函數(shù)

20.設有下面兩個賦值語句:
a = Integer.parseInt("1024");

b = Integer.valueOf("1024").intValue();

下述說法正確的是()
A a是整數(shù)類型變量,b是整數(shù)類對象屹耐。
B a是整數(shù)類對象尸疆,b是整數(shù)類型變量椿猎。
C a和b都是整數(shù)類對象并且它們的值相等。
D a和b都是整數(shù)類型變量并且它們的值相等寿弱。

答案D
intValue()是把Integer對象類型變成int的基礎數(shù)據(jù)類型犯眠;
parseInt()是把String 變成int的基礎數(shù)據(jù)類型;
Valueof()是把String 轉化成Integer對象類型症革;(現(xiàn)在JDK版本支持自動裝箱拆箱了筐咧。)
本題:parseInt得到的是基礎數(shù)據(jù)類型int,valueof得到的是裝箱數(shù)據(jù)類型Integer噪矛,然后再通過valueInt轉換成int量蕊,所以選擇D

21.對文件名為Test.java的java代碼描述正確的是()
class Person {
    String name = "No name";
    public Person(String nm) {
        name = nm;
    }
}
class Employee extends Person {
    String empID = "0000";
    public Employee(String id) {
        empID = id;
    }
}
public class Test {
    public static void main(String args[]) {
        Employee e = new Employee("123");
        System.out.println(e.empID);
    }
}

A 輸出:0000
B 輸出:123
C 編譯報錯
D 輸出:No name

答案 C
子類的構造方法總是先調(diào)用父類的構造方法,如果子類的構造方法沒有明顯地指明使用父類的哪個構造方法艇挨,子類就調(diào)用父類不帶參數(shù)的構造方法残炮。
而父類沒有無參的構造函數(shù),所以子類需要在自己的構造函數(shù)中顯示的調(diào)用父類的構造函數(shù)缩滨。

22.下列關于容器集合類的說法正確的是势就?

A LinkedList繼承自List
B AbstractSet繼承自Set
C HashSet繼承自AbstractSet
D WeakMap繼承自HashMap

答案 C
首先這道題很多人都對接口以及抽象實現(xiàn)類認識混亂。
A.LinkedList是繼承自AbstractSequentialList(抽象類脉漏,實現(xiàn)了List接口)的苞冯,并且實現(xiàn)了List接口。所以A錯誤侧巨。
B.AbstractSet是實現(xiàn)了Set接口的舅锄,本身是一個抽象類。繼承自AbstractCollection(抽象類司忱,實現(xiàn)了Collection接口)皇忿。所以B錯誤。
C.HashSet是繼承自AbstractSet烘贴,實現(xiàn)了Set接口禁添。所以C正確。
D.WeakMap不存在于java集合框架的桨踪。只有一個叫做WeakHashMap(繼承自AbstractMap)老翘。
最后附上java集合框架圖。


image.png
23.以下關于對象序列化描述正確的是

A 使用FileOutputStream可以將對象進行傳輸
B 使用PrintWriter可以將對象進行傳輸
C 使用transient修飾的變量不會被序列化
D 對象序列化的所屬類需要實現(xiàn)Serializable接口

答案 C锻离、D铺峭。

A、B 對象傳輸有專門的對象流汽纠。

C卫键、序列化的過程中只有屬性可以被序列化,方法不可以虱朵。同時一旦屬性被transient或者static修飾莉炉。屬性不可序列化钓账。

D、看了一下有人說可以利用外部序列化絮宁,但是這個外部序列化的接口可是繼承了序列化的接口啊 public interface Externalizable extends java.io.Serializable

24.下面幾個關于Java里queue的說法哪些是正確的()梆暮?

A LinkedBlockingQueue是一個可選有界隊列,不允許null值
B PriorityQueue绍昂,LinkedBlockingQueue都是線程不安全的
C PriorityQueue是一個無界隊列啦粹,不允許null值,入隊和出隊的時間復雜度是O(log(n))
D PriorityQueue窘游,ConcurrentLinkedQueue都遵循FIFO原則

答案 A唠椭、C
1、LinkedBlockingQueue:基于鏈接節(jié)點的可選限定的blocking queue 忍饰。 這個隊列排列元素FIFO(先進先出)贪嫂。 隊列的頭部是隊列中最長的元素。 隊列的尾部是隊列中最短時間的元素艾蓝。 新元素插入隊列的尾部撩荣,隊列檢索操作獲取隊列頭部的元素。 鏈接隊列通常具有比基于陣列的隊列更高的吞吐量饶深,但在大多數(shù)并發(fā)應用程序中的可預測性能較低。
blocking queue說明:不接受null元素逛拱;可能是容量有限的敌厘;實現(xiàn)被設計為主要用于生產(chǎn)者 - 消費者隊列;不支持任何類型的“關閉”或“關閉”操作朽合,表示不再添加項目實現(xiàn)是線程安全的俱两;

2、PriorityQueue:
2.1曹步、基于優(yōu)先級堆的無限優(yōu)先級queue 宪彩。 優(yōu)先級隊列的元素根據(jù)它們的有序natural ordering ,或由一個Comparator在隊列構造的時候提供讲婚,這取決于所使用的構造方法尿孔。 優(yōu)先隊列不允許null元素。 依靠自然排序的優(yōu)先級隊列也不允許插入不可比較的對象(這樣做可能導致ClassCastException )筹麸。
2.2活合、該隊列的頭部是相對于指定順序的最小元素。 如果多個元素被綁定到最小值物赶,那么頭就是這些元素之一 - 關系被任意破壞白指。 隊列檢索操作poll , remove 酵紫, peek和element訪問在隊列的頭部的元件告嘲。
2.3错维、優(yōu)先級隊列是無限制的,但是具有管理用于在隊列上存儲元素的數(shù)組的大小的內(nèi)部容量 橄唬。 它始終至少與隊列大小一樣大赋焕。 當元素被添加到優(yōu)先級隊列中時,其容量會自動增長轧坎。 沒有規(guī)定增長政策的細節(jié)宏邮。
2.4、該類及其迭代器實現(xiàn)Collection和Iterator接口的所有可選方法缸血。 方法iterator()中提供的迭代器不能保證以任何特定順序遍歷優(yōu)先級隊列的元素蜜氨。 如果需要有序遍歷,請考慮使用Arrays.sort(pq.toArray()) 捎泻。
2.5飒炎、請注意,此實現(xiàn)不同步笆豁。 如果任何線程修改隊列郎汪,多線程不應同時訪問PriorityQueue實例。 而是使用線程安全的PriorityBlockingQueue類闯狱。
實現(xiàn)注意事項:此實現(xiàn)提供了O(log(n))的時間入隊和出隊方法( offer 煞赢, poll , remove()和add ); remove(Object)和contains(Object)方法的線性時間; 和恒定時間檢索方法( peek 哄孤, element和size )照筑。

3、ConcurrentLinkedQueue:基于鏈接節(jié)點的無界并發(fā)deque(deque是雙端隊列) 瘦陈。 并發(fā)插入凝危,刪除和訪問操作可以跨多個線程安全執(zhí)行。 A ConcurrentLinkedDeque是許多線程將共享對公共集合的訪問的適當選擇晨逝。像大多數(shù)其他并發(fā)集合實現(xiàn)一樣蛾默,此類不允許使用null元素。

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末捉貌,一起剝皮案震驚了整個濱河市支鸡,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌趁窃,老刑警劉巖苍匆,帶你破解...
    沈念sama閱讀 217,826評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異棚菊,居然都是意外死亡浸踩,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評論 3 395
  • 文/潘曉璐 我一進店門统求,熙熙樓的掌柜王于貴愁眉苦臉地迎上來检碗,“玉大人据块,你說我怎么就攤上這事≌厶辏” “怎么了另假?”我有些...
    開封第一講書人閱讀 164,234評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長怕犁。 經(jīng)常有香客問我边篮,道長,這世上最難降的妖魔是什么奏甫? 我笑而不...
    開封第一講書人閱讀 58,562評論 1 293
  • 正文 為了忘掉前任戈轿,我火速辦了婚禮,結果婚禮上阵子,老公的妹妹穿的比我還像新娘思杯。我一直安慰自己,他們只是感情好挠进,可當我...
    茶點故事閱讀 67,611評論 6 392
  • 文/花漫 我一把揭開白布色乾。 她就那樣靜靜地躺著,像睡著了一般领突。 火紅的嫁衣襯著肌膚如雪暖璧。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,482評論 1 302
  • 那天君旦,我揣著相機與錄音漆撞,去河邊找鬼。 笑死于宙,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的悍汛。 我是一名探鬼主播捞魁,決...
    沈念sama閱讀 40,271評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼离咐!你這毒婦竟也來了谱俭?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,166評論 0 276
  • 序言:老撾萬榮一對情侶失蹤宵蛀,失蹤者是張志新(化名)和其女友劉穎昆著,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體术陶,經(jīng)...
    沈念sama閱讀 45,608評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡凑懂,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,814評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了梧宫。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片接谨。...
    茶點故事閱讀 39,926評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡摆碉,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出脓豪,到底是詐尸還是另有隱情巷帝,我是刑警寧澤,帶...
    沈念sama閱讀 35,644評論 5 346
  • 正文 年R本政府宣布扫夜,位于F島的核電站楞泼,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏笤闯。R本人自食惡果不足惜堕阔,卻給世界環(huán)境...
    茶點故事閱讀 41,249評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望望侈。 院中可真熱鬧印蔬,春花似錦、人聲如沸脱衙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽捐韩。三九已至退唠,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間荤胁,已是汗流浹背瞧预。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留仅政,地道東北人垢油。 一個月前我還...
    沈念sama閱讀 48,063評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像圆丹,于是被迫代替她去往敵國和親滩愁。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,871評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 1. Java基礎部分 基礎部分的順序:基本語法辫封,類相關的語法硝枉,內(nèi)部類的語法,繼承相關的語法倦微,異常的語法妻味,線程的語...
    子非魚_t_閱讀 31,631評論 18 399
  • wap中,如果是不需要隱藏的導航欣福,而且不需要在其內(nèi)部使用滾輪责球,那可以直接使用css3屬性代替js 網(wǎng)站上很多使用 ...
    進擊的阿群閱讀 312評論 0 1
  • 沒有反思的人生不值得過-蘇格拉底 1、日歷: 2018.9.30-10.1公司連州兩日游 2018.10.3參加賀...
    Jacky先生閱讀 222評論 0 0
  • ――人可以窮,但是一定不能心窮棕诵。 我仍記得語文課上老師和我們說的一句話裁良,記不太清這句話最開始出自誰口,但卻清晰的記...
    凰凰涼涼閱讀 166評論 0 0