1. 程式人生 > >java面試題彙總(一)-----java基礎

java面試題彙總(一)-----java基礎

1、一個".java"原始檔中是否可以包括多個類(不是內部類)?有什麼限制?

可以有多個類,但只能有一個public的類,並且public的類名必須與檔名相一致。

一個檔案中可以只有非public類,如果只有一個非public類,此類可以跟檔名不同

2、說說&和&&的區別。

&和&&都可以用作邏輯與的運算子,&&為短路與,&不是短路與。

另外&可以做為整數的位運算子

例1:對於if(str != null&& !str.equals(“”))表示式,當str為null時,後面的表示式不會執行,所以不會出現NullPointerException如果將&&改為&,則會丟擲NullPointerException異常。

例2:If(x==33 &++y>0) y會增長,If(x==33 && ++y>0)不會增長

3、在JAVA中如何跳出當前的多重巢狀迴圈?

1. Break + 標籤

2. 使用多個條件判斷

3. 使用方法的return

在Java中,要想跳出多重迴圈,可以在外面的迴圈語句前定義一個標號,然後在裡層迴圈體的程式碼中使用帶有標號的break語句,即可跳出外層迴圈。例如,

ok: for (int i = 0; i < 10; i++) {

    for (int j = 0; j < 10; j++) {

        System.out

.println("i=" + i + ",j=" + j);

        if (j == 5)

            break ok;

    }

}

另外,我個人通常並不使用標號這種方式,而是讓外層的迴圈條件表示式的結果可以受到裡層迴圈體程式碼的控制,例如,要在二維陣列中查詢到某個數字。

int arr[][] ={{1,2,3},{4,5,6,7},{9}};

boolean found = false;

for(int i=0;i<arr.length&& !found;i++) {

    for(int j=0;j<arr[i].length;j++){

        System.out.println("i=" + i + ",j=" + j);

        if(arr[i][j]  ==5) {

            found = true;

            break;

        }

    }

}

第三種,使用方法的return

private static int test() {

    int count = 0;

    for (int i = 0; i < 10; i++) {

        for (int j = 0; j < 10; j++) {

            count++;

            System.out.println("i=" + i + ",j=" + j);

            if (j == 5) {

                return count;

            }

        }

    }

    return 0;

}

4、switch語句能否作用在byte上,能否作用在long上,能否作用在String上?

作用在byte, short, char, int, enum

封裝類物件,其它基本資料型別及引用資料型別都不能做為case的條件

6、用最有效率的方法算出2乘以8等於幾?

2 << 3

因為將一個數左移n位,就相當於乘以了2的n次方,那麼,一個數乘以8只要將其左移3位即可,而位運算cpu直接支援的,效率最高,所以,2乘以8等於幾的最效率的方法是2 << 3。

7、請設計一個一百億的計算器

如果只是大整數運算,使用BigInteger就可以

如果有浮點資料參與去處,需要使用BigDecimal進行運算

Java中基本型別的浮點數運算是不精確的,需要使用BigDecimal運算,尤其是金融、會計方向的軟體

8、使用final關鍵字修飾一個變數時,是引用不能變,還是引用的物件不能變?

引用變數不能重新賦值,但是引用指向的物件的內容可以變化

例1:final StringBuffer a=new StringBuffer("immutable");

a=new StringBuffer("");

    有編譯錯

例2:

    final StringBuffer a=new StringBuffer("immutable");

    a.append(“123”);

    正確

9、"=="和equals方法究竟有什麼區別?

他們的區別主要存在在引用資料型別上

==為比較兩側的物件是否同一物件,是用記憶體地址來比較的

equals是方法,預設是用記憶體地址比較,重寫後,主要是用來比較兩側的物件的值是否相同,和equals方法中的實現有關

==可以兩側都為null,但equals左側的引用指向的物件不能空,不然有NullPointerException

除非需要比較兩個引用指向的物件是同一物件,一般都使用equals方法進行比較。尤其是String之類的值物件,另外,常量儘量放在比較的左側

10、靜態變數和例項變數的區別?

在語法定義上的區別:靜態變數前要加static關鍵字,而例項變數前則不加。

在程式執行時的區別:例項變數屬於某個物件的屬性,必須建立了例項物件,其中的例項變數才會被分配空間,才能使用這個例項變數。靜態變數不屬於某個例項物件,而是屬於類,所以也稱為類變數,只要程式載入了類的位元組碼,不用建立任何例項物件,靜態變數就會被分配空間,靜態變數就可以被使用了。

總之,例項變數必須建立物件後才可以通過這個物件來使用,靜態變數則可以直接使用類名來引用。

11、是否可以從一個static方法內部發出對非static方法的呼叫?

不可以。因為非static方法(例項方法)是要與物件關聯在一起的,必須建立一個物件後,才可以在該物件上進行方法呼叫,而static方法呼叫時不需要建立物件,可以直接呼叫。也就是說,當一個static方法被呼叫時,可能還沒有建立任何例項物件,如果從一個static方法中發出對非static方法的呼叫,那個非static方法是關聯到哪個物件上的呢?這個邏輯無法成立,所以,一個static方法內部發出對非static方法的呼叫。

12、Integer與int的區別

int是java提供的8種原始資料型別之一,意思整型,佔用4位元組。

Integer是java為int提供的封裝類,是引用資料型別。

int的預設值為0,而Integer的預設值為null,即Integer可以區分出未賦值和值為0的區別,int則無法表達出未賦值的情況。

例如,要想表達出沒有參加考試和考試成績為0的區別,則只能使用Integer

在JSP開發中,Integer的預設為null,所以用el表示式在文字框中顯示時,值為空白字串,而int預設的預設值為0,所以用el表示式在文字框中顯示時,結果為0,所以,int不適合作為web層的表單資料的型別。

在Hibernate中,如果將OID定義為Integer型別,那麼Hibernate就可以根據其值是否為null而判斷一個物件是否是臨時的,如果將OID定義為了int型別,還需要在hbm對映檔案中設定其unsaved-value屬性為0。

另外,Integer提供了多個與整數相關的操作方法,例如,將一個字串轉換成整數,Integer中還定義了表示整數的最大值和最小值的常量。

13、Math.round(11.5)等於多少? Math.round(-11.5)等於多少?

Math類中提供了三個與取整有關的方法:ceil、floor、round,這些方法的作用與它們的英文名稱的含義相對應,例如,ceil的英文意義是天花板,該方法就表示向上取整,Math.ceil(11.3)的結果為12,Math.ceil(-11.3)的結果是-11;floor的英文意義是地板,該方法就表示向下取整,Math.ceil(11.6)的結果為11,Math.ceil(-11.6)的結果是-12;最難掌握的是round方法,它表示“四捨五入”,演算法為Math.floor(x+0.5),即將原來的數字加上0.5後再向下取整,所以,Math.round(11.5)的結果為12,Math.round(-11.5)的結果為-11。

14、請說出作用域public,private,protected,以及不寫時的區別

這四個作用域的可見範圍如下表所示。

說明:如果在修飾的元素上面沒有寫任何訪問修飾符,則表示friendly/default。

作用域

當前類

同package

子孫類

其他package

public

protected

×

friendly

×

×

private

×

×

×

備註:只要記住了有4種訪問許可權,4個訪問範圍,然後將全選和範圍在水平和垂直方向上分別按排從小到大或從大到小的順序排列,就很容易畫出上面的圖了。

15、Overload和Override的區別。Overloaded的方法是否可以改變返回值的型別?

Overload是過載的意思,Override是覆蓋的意思,也就是重寫。

Overload和Override有共同之處,兩個方法的方法名都必須相同,如果不同,既不構成Overload,也不構成Override。

  1. Override必須發生在父子類之間,Overload可以不在父子類之間
  2. Override的特點:
    1. 引數列表完全相同:個數相同、型別相同、順序相同
    2. 子類的返回值不能比父類的返回值範圍大
    3. 子類方法丟擲的異常不能比父類方法丟擲的異常範圍大
    4. 修飾符只能為public、protected、friendly,不能為private
    5. 父子類方法不能使用static修飾
  3. 過載發生在同一個類或父子類之間,重寫中引數列表至少滿足個數不同、型別不同、順序不同中的一個條件,不包含父子類之間的static方法

17、寫clone()方法時,通常都有一行程式碼(不是必須有),是什麼?

clone 有預設行為,super.clone();因為首先要把父類中的成員複製到位,然後才是複製自己的成員。

18、面向物件的特徵有哪些方面

1. 封裝,隱藏內部實現,只暴露公共行為

2. 繼承,提高程式碼的重用性

3. 多型,體現現實生活中相似物件的差異性

4. 抽象,抽取現實世界中相似物件的共同點

19、java中實現多型的機制是什麼?

通過繼承父類或實現介面。不同子類或實現類對同一父類方法有不同的實現。根據物件呼叫相應的實現方法。另外對於相似的方法,可以使用過載。

20、abstract class和interface有什麼區別?

含有abstract修飾符的class即為抽象類,abstract類不能建立的例項物件。含有abstract方法的類必須定義為abstract class,abstract class類中的方法不必是抽象的。abstract class類中定義抽象方法必須在具體(Concrete)子類中實現,所以,不能有抽象構造方法或抽象靜態方法。如果的子類沒有實現抽象父類中的所有抽象方法,那麼子類也必須定義為abstract型別。

介面(interface)可以說成是抽象類的一種特例,介面中的所有方法都必須是抽象的。介面中的方法定義預設為public abstract型別,介面中的成員變數型別預設為public static final。

下面比較一下兩者的語法區別:

1.抽象類可以有構造方法,介面中不能有構造方法。

2.抽象類中可以有普通成員變數,介面中沒有普通成員變數

3.抽象類中可以包含非抽象的普通方法,介面中的所有方法必須都是抽象的,不能有非抽象的普通方法。

4. 抽象類中的抽象方法的訪問型別可以是public,protected和(預設型別,雖然

eclipse下不報錯,但應該也不行),但介面中的抽象方法只能是public型別的,並且預設即為public abstract型別。

5. 抽象類中可以包含靜態方法,介面中不能包含靜態方法

6. 抽象類和介面中都可以包含靜態成員變數,抽象類中的靜態成員變數的訪問型別可以任意,但介面中定義的變數只能是public static final型別,並且預設即為public static final型別。

7. 一個類可以實現多個介面,但只能繼承一個抽象類。

下面接著再說說兩者在應用上的區別:

介面更多的是在系統架構設計方法發揮作用,主要用於定義模組之間的通訊契約;

而抽象類在程式碼實現方面發揮作用,可以實現程式碼的重用。

21、abstract的method是否可同時是static,是否可同時是native,是否可同時是synchronized?

abstract的method不可以是static的,因為抽象的方法是要被子類實現的,而static與子類扯不上關係!

native方法表示該方法要用另外一種依賴平臺的程式語言實現的,不存在著被子類實現的問題,所以,它也不能是抽象的,不能與abstract混用。

synchronized和abstract合用的問題不能共用,abstract方法只能存在於抽象類或介面中,它不能直接產生物件,而預設synchronized方法對當前物件加鎖,沒有物件是不能加鎖。

另外synchronized不能被繼承,子類繼承時,需要另加修改符。

22、什麼是內部類?Static Nested Class和Inner Class的不同。

內部類就是在一個類的內部定義的類。內部可以定義在除引數位置上的任意位置。印象中有四種方式。

1. 靜態內部類需要使用static修飾,而普通內部類不能使用static修飾

2. 靜態內部類只能定義在和屬性同級,普通內部類可以定義在除引數位置以外的任意位置

3. 靜態內部類必需有名稱,而普通內部類可以是匿名的

4. 靜態內部類沒有this引用,只此只能訪問外部類的靜態成員,而普通內部類可以訪問外部類的全部成員

5. 靜態內部類訪問外部類的同名函式時,使用“外部類名.方法名”即可,而普通內部類需要使用“外部類名.this.外部方法”

6. 靜態內部類可以定義靜態方法,而普通內部類不能定義靜態方法

23、內部類可以引用它的包含類的成員嗎?有沒有什麼限制?

1. 如果內部類為靜態內部類,只能呼叫外部類的靜態成員;如果有重名成員,需要用“外部類名.成員名”訪問;不能呼叫外部類的物件成員。

2. 如果內部類為非靜態內部類,則可以呼叫外部類的所有成員;如果有重名成員,需要使用“外部類名.this.外部方法”

24、String是最基本的資料型別嗎?

基本資料型別包括byte、int、char、long、float、double、boolean和short。

String是引用資料型別。

java.lang.String類是final型別的,因此不可以繼承這個類、不能修改這個類。為了提高效率節省空間,我們應該用StringBuffer/StringBuilder類

27、String和StringBuffer的區別

這兩個類都實現了CharSequence介面。

1. 型別不同,因為不是一個類,也沒有繼承關係,做引數時不能共用

2. String物件是不可變物件,不能修改值。而StringBuffer是可變物件,能修改值。

3. 拼接字串時,String會產生新物件,而StringBuffer只是增加新字元,不產生新物件,因此效率高。

4. String覆蓋了equals方法和hashCode方法,而StringBuffer沒有覆蓋equals方法和hashCode方法,所以,將StringBuffer物件儲存進Java集合類中時會出現問題。

28、如何把一段逗號分割的字串轉換成一個數組?

如果不查jdk api,我很難寫出來!我可以說說我的思路:

  1. 用正則表示式,程式碼大概為:String [] result = orgStr.split(“,”, -1);
  2. 用 StingTokenizer ,程式碼為:

StringTokenizer tokener = new StringTokenizer(s, ",");

String[] result = new String[tokener.countTokens()];

Integer i = 0;

while (tokener.hasMoreTokens()) {

    result[i++] = tokener.nextToken();

}

  1. 最笨的辦法,用String.indexOf()

int index = -1;

int oldIndex = 0;

List<String> ss = new ArrayList<String>();

while ((index = s.indexOf(',', index + 1)) != -1) {

    ss.add(s.substring(oldIndex, index));

    oldIndex = index + 1;

}

if (s.charAt(s.length() - 1) == ',') {

    ss.add("");

}

String[] array = ss.toArray(new String[ss.size()]);

System.out.println(Arrays.toString(array));

30、final, finally, finalize的區別。

final 用於宣告屬性,方法和類,分別表示屬性不可變,方法不可覆蓋,類不可繼承。

內部類要訪問區域性變數,區域性變數必須定義成final型別

final int[] number = { 20 };

new Thread() {

    @Override

    public void run() {

        for (int k = 0; k < 20; k++) {

            number[0]++;

        }

    }

}.start();

Thread.sleep(10);

System.out.println(number[0]);

finally是異常處理語句結構的一部分,表示總是執行,用來釋放資源。

finalize是Object類的一個方法,在垃圾收集器執行的時候會呼叫被回收物件的此方法,可以覆蓋此方法提供垃圾收集時的其他資源回收,例如關閉檔案等。JVM不保證此方法總被呼叫

31、執行時異常(Runtime)與檢查異常(Checked)有何異同?

異常表示程式執行過程中可能出現的非正常狀態,執行時異常表示虛擬機器的通常操作中可能遇到的異常,是一種常見執行錯誤。java編譯器要求方法必須宣告丟擲可能發生的非執行時異常,但是並不要求必須宣告丟擲未被捕獲的執行時異常。

32、error和exception有什麼區別?

error 表示恢復不是不可能但很困難的情況下的一種嚴重問題。比如說記憶體溢位,不可能指望程式能處理這樣的情況。exception表示一種設計或實現問題,也就是說,它表示如果程式執行正常,從不會發生的情況。

33、Java中的異常處理機制的簡單原理和應用。

異常是指java程式執行時(非編譯)所發生的非正常情況或錯誤。

Java使用面向物件的方式來處理異常,它把程式中發生的每個異常也都分別封裝到一個物件中,該物件中包含有異常的資訊。

Java可以自定義異常類,所有異常的根類為java.lang.Throwable,Throwable下面又派生了兩個子類:Error和Exception。

  1. Error表示應用程式本身無法克服和恢復的一種嚴重問題,程式只有退的份了,例如說記憶體溢位和執行緒死鎖等系統問題。
  2. Exception表示程式還能夠克服和恢復的問題,其中又分為執行時異常和檢查異常,執行時異常是軟體本身缺陷所導致的問題,也就是軟體開發人員考慮不周所導致的問題,軟體使用者無法克服和恢復這種問題,但在這種問題下還可以讓軟體系統繼續執行或者讓軟體死掉。例如,陣列越界(ArrayIndexOutOfBoundsException),空指標異常(NullPointerException)、類轉換異常(ClassCastException);檢查異常是執行環境的變化或異常所導致的問題,是使用者能夠克服的問題,例如,網路斷線,硬碟空間不夠,發生這樣的異常後,程式不應該死掉。

Java為執行時異常和檢查異常提供了不同的解決方案,編譯器強制檢查異常必須try..catch處理或用throws宣告繼續拋給上層呼叫方法處理,所以檢查異常也稱為checked異常,而執行異常可以處理也可以不處理,所以編譯器不強制用try..catch處理或用throws宣告,所以執行異常也稱為Runtime異常。

提示答題者:就按照三個級別去思考:虛擬機器必須宕機的錯誤,程式可以死掉也可以不死掉的錯誤,程式不應該死掉的錯誤

34、請寫出你最常見到的5個RuntimeException。

NullPointerException、ArrayIndexOutOfBoundsException、ClassCastException、IllegelArgumentException、SecurityException。

35、Java語言如何進行異常處理,關鍵字:throws,throw,try,catch,finally分別代表什麼意義?在try塊中可以丟擲異常嗎?

  1. Java語言如何進行異常處理見43題
  2. throws為向上拋異常

throw程式出錯時,手工丟擲異常

try嘗試執行,裡面的語句可能出現異常,如出現異常需要處理

catch處理try中出現的異常

finally在try後執行清理操作,用於釋放資源

  1. 在try中可以丟擲異常

36Java中有幾種方法可以實現一個執行緒?用什麼關鍵字修飾同步方法? stop()和suspend()方法為何不推薦使用?

java5以前,有如下兩種:

第一種:

new Thread(){}.start();這表示呼叫Thread子類物件的run方法,new Thread(){}表示一個Thread的匿名子類的例項物件,子類加上run方法後的程式碼如下:

new Thread() {

    public void run() {

    }

}.start();

第二種:

new Thread(new Runnable(){}).start();這表示呼叫Thread物件接受的Runnable物件的run方法,new Runnable(){}表示一個Runnable的匿名子類的例項物件,runnable的子類加上run方法後的程式碼如下:

new Thread(new Runnable() {

    public void run() {

    }

}).start();

從Java5開始,還有如下一些執行緒池建立多執行緒的方式:

ExecutorService pool = Executors.newFixedThreadPool(3);

for (int i = 0; i < 10; i++) {

    pool.execute(new Runable() {

        public void run() {

        }

    });

}

Executors.newCachedThreadPool().execute(new Runable() {

    public void run() {

    }

});

Executors.newSingleThreadExecutor().execute(new Runable() {

    public void run() {

    }

});

有兩種實現方法,分別使用new Thread()和new Thread(runnable)形式,第一種直接呼叫thread的run方法,所以,我們往往使用Thread子類,即new SubThread()。第二種呼叫runnable的run方法。

  1. 有兩種實現方法,分別是繼承Thread類與實現Runnable介面。可以的話使用執行緒池
  2. 用synchronized關鍵字修飾同步方法
  3. 反對使用stop(),是因為它不安全。它會解除由執行緒獲取的所有鎖定,而且如果物件處於一種不連貫狀態,那麼其他執行緒能在那種狀態下檢查和修改它們。結果很難檢查出真正的問題所在。suspend()方法容易發生死鎖。呼叫suspend()的時候,目標執行緒會停下來,但卻仍然持有在這之前獲得的鎖定。此時,其他任何執行緒都不能訪問鎖定的資源,除非被"掛起"的執行緒恢復執行。對任何執行緒來說,如果它們想恢復目標執行緒,同時又試圖使用任何一個鎖定的資源,就會造成死鎖。所以不應該使用suspend(),而應在自己的Thread類中置入一個標誌,指出執行緒應該活動還是掛起。若標誌指出執行緒應該掛起,便用wait()命其進入等待狀態。若標誌指出執行緒應當恢復,則用一個notify()重新啟動執行緒。

38、同步和非同步有何異同,在什麼情況下分別使用他們?舉例說明。

同步是指所有操作序列化執行,順序不能改變,前一操作未完成,後個操作不執行。

非同步是指所有操作可以並行執行,順序無關。

例如寄信

同步:如果沒有寄完,不能吃飯,郵遞員10天后送到,傳送人被餓死

非同步:寄出後可以立即吃飯,郵遞員送完後,通知傳送人送信結果。

如果強調執行順序的話,用同步。如果順序無關,則可以用非同步。

非同步執行效率比同步高。

39. 下面兩個方法同步嗎?(自己發明)

class Test {

    synchronized static void sayHello3() {

    }

    synchronized void getX() {

    }

}

40、多執行緒有幾種實現方法?同步有幾種實現方法?

多執行緒有兩種實現方法,分別是繼承Thread類與實現Runnable介面

同步的實現方面有五種,分別是synchronized、wait與notify、sleep、suspend、join

synchronized: 一直持有鎖,直至執行結束

wait():使一個執行緒處於等待狀態,並且釋放所持有的物件的lock,需捕獲異常。

sleep():使一個正在執行的執行緒處於睡眠狀態,是一個靜態方法,需捕獲異常,不釋放鎖。

notify():喚醒一個處於等待狀態的執行緒,注意的是在呼叫此方法的時候,並不能確切的喚醒某一個等待狀態的執行緒,而是由JVM確定喚醒哪個執行緒,而且不是按優先順序。

notityAll():喚醒所有處入等待狀態的執行緒,注意並不是給所有喚醒執行緒一個物件的鎖,而是讓它們競爭。

41、啟動一個執行緒是用run()還是start()?

啟動一個執行緒是呼叫start()方法,使執行緒就緒狀態,以後可以被排程為執行狀態,一個執行緒必須關聯一些具體的執行程式碼,run()方法是該執行緒所關聯的執行程式碼。

42、當一個執行緒進入一個物件的一個synchronized方法後,其它執行緒是否可進入此物件的其它方法?

如果其它方法中使用當前物件作為鎖物件,則不能;

如果其它方法中沒有使用當前物件作為鎖物件,則能。

43、執行緒的基本概念、執行緒的基本狀態以及狀態之間的關係

在多工作業系統中,為了提高CPU的利用率,可以使用多程序程式設計。但對程序通訊比較困難,程序間資料不能共享,因此可以使用多執行緒程式設計。一個程序至少包含一個主入口執行緒。

單個CPU,在同一時間只能處理一個執行緒的資料,但是作業系統的任務排程非常快,人眼無法識別,感覺上是多個執行緒同時執行。有的執行緒可以已經用完CPU,正在作磁碟操作,此時並不使用CPU,可以讓出CPU資源給其它執行緒使用,提高效率。

執行緒有生命週期及相關關係和對應方法如下圖:

Iterable

    ->Collection

        ->List

            ->ArrayList

            ->LinkedList

            ->Vector

                ->Stack

        ->Set

            ->HashSet

            ->TreeSet

 Map

    ->Hashtable

->HashMap

    ->LinkedHashMap

Collections,不屬於集合,是集合類的工具類

Arrays,不屬於集合類,是資料物件的工具類

46、ArrayList和Vector的區別

1. 執行緒同步,Vector執行緒安全,ArrayList執行緒不安全

2. 效率問題,Vector效率低,ArrayList效率高

3. 增長數量,Vector以1.5倍增長,ArrayList以2倍增長

47、HashMap和Hashtable的區別

1. 執行緒同步,Hashtable執行緒安全,HashMap執行緒不安全

2. 效率問題,Hashtable效率低,HashMap效率高

3. HashMap可以使用null作為key,Hashtable不可以使用null為key

4. HashMap使用的是新實現,繼承AbstractMap,而Hashtable是繼承Dictionary類,實現比較老

5. Hash算不同,HashMap的hash演算法比Hashtable的hash演算法效率高

6. HashMap把Hashtable的contains方法去掉了,改成containsValue和containsKey。因為contains方法容易讓人引起誤解。

7. 取值不同,HashMap用的是Iterator介面,而Hashtable中還有使用Enumeration介面

48、List和 Map區別?

一個是儲存單列資料的集合,另一個是儲存鍵和值的雙列資料的集合,List中儲存的資料是有順序,並且允許重複;Map中儲存的資料是沒有順序的,其鍵是不能重複的,它的值是可以有重複的。

  1. List有重複值,Map沒有重複key,但可以有重複值
  2. List有序,Map不一定有序
  3. List只能存單列值,Map可以存雙列值

49、List, Set, Map是否繼承自Collection介面?

   List,Set是,Map不是

50、List、Map、Set三個介面,存取元素時,各有什麼特點?

List使用get(index)取值,也可以使用Iterator、toArray取值

Set只能通過Iterator、toArray取值

Map取值使用get(key)取值,也可以使用keySet取鍵值集合,也可使用values取值集合,entrySet取全部對映。

51、說出ArrayList,Vector, LinkedList的儲存效能和特性

1. ArrayList和Vector使用陣列儲存元素;LinkedList使用連結串列儲存元素

2. ArrayList和Vector插入刪除資料時,需要搬運資料,效率較差;LinkedList使用連結串列,不需要搬運資料,效率高

3. ArrayList和Vectory查詢時,按陣列下標查詢,不需要遍歷,效率高;LinkedList需要遍歷,查詢效率底

4. ArrayList和Vector的區別見59條

51、去掉一個Vector集合中重複的元素

1. 自行遍歷,用另外一個Vector來判斷是否有重複

2. 用Set(TreeSet或HashSet)來去重

3. 用Apache的CollectionUtil工具類去重

Vector newVector = new Vector();

for (int i = 0; i < vector.size(); i++) {

    Object obj = vector.get(i);

    if (!newVector.contains(obj))

        newVector.add(obj);

}

還有一種簡單的方式,HashSet set = new HashSet(vector);

53、Collection和 Collections的區別。

Collection是集合類的上級介面,繼承與他的介面主要有Set和List.

Collections是針對集合類的一個工具類,他提供一系列靜態方法實現對各種集合的搜尋、排序、執行緒安全化等操作。

54、Set裡的元素是不能重複的,那麼用什麼方法來區分重複與否呢?是用==還是equals()?它們有何區別?

Set裡的元素是不能重複的,元素重複與否視具體情況而定:

1. HashSet使用equals比較

2. TreeSet使用compareTo進行比較

最常用的集合類介面是List 和 Map。

List的具體實現包括ArrayList、Vector、LinkedList,它們是可變大小的列表,比較適合構建、儲存和操作任何型別物件的元素列表。List適用於按數值索引訪問元素的情形。

Set的具體實現包括HashSet和TreeSet,它們也是可變大小集合,但不適合用索引取值。

Map 提供了一個更通用的元素儲存方法。Map集合類用於儲存元素對(稱作"鍵"和"值"),其中每個鍵對映到一個值。

ArrayList/Vector、LinkedList

HashSet/TreeSetàSet

Properties/HashTable/TreeMap/HashMap

List的主要方法有:

add、get、remove、set、iterator、contains、addAll、removeAll、indexOf、toArray、clear、isEmpty

Set的主要方法有:

add、remove、iterator、contains、addAll、removeAll、toArray、clear、isEmpty

Map的主要方法有:

put、get、keySet、values、entrySet、clear、remove、isEmpty

56、兩個物件值相同(x.equals(y) == true),但卻可有不同的hash code,這句話對不對?

1. equals等,hashCode同,因此重寫equals方法必須重寫hashCode

2. hashCode等,equals不一定同,但hashCode最好雜湊化

3. 任何物件equals null都得false

4. 沒有繼承關係的兩個類,equals都得false

相關推薦

java試題彙總()-----java基礎

1、一個".java"原始檔中是否可以包括多個類(不是內部類)?有什麼限制? 可以有多個類,但只能有一個public的類,並且public的類名必須與檔名相一致。 一個檔案中可以只有非public類

Java試題02_15(第一階段基礎

02.15_Java語言基礎(面試題之變數相加和常量相加的區別)(掌握) 面試題:看下面的程式是否有問題,如果有問題,請指出並說明理由。 * byte b1 = 3; * byte b2 = 4; * byte b3 = b1 + b2; //有問題 * 從兩方面去回答這個題 *

java試題及答案(基礎題122道,程式碼題19道)

      JAVA相關基礎知識   1、面向物件的特徵有哪些方面    1.抽象:   抽象就是忽略一個主題中與當前目標無關的那些方面,以便更充分地注意與當前目標有關的方面。抽象並不打算了解全部問題,而只是選擇其中的一部分,暫時不用部分細節。抽象包括兩個方面,一是過程抽

Java試題

筆者在面試的過程中,遇到的一些面試題目,面試後不管結果如何,都做一下重新梳理 一、2018-11-01 給定矩陣(二維陣列),要求斜向列印 解題思路:列印的下一個元素下標的規律為:橫向座標減1,縱向座標加1,如果該元素存在,則列印輸出,否則跳過。當縱向座標大於0時,開始位

java試題彙總(二)----演算法與程式設計

1、編寫一個程式,將a.txt檔案中的單詞與b.txt檔案中的單詞交替合併到c.txt檔案中,a.txt檔案中的單詞用回車符分隔,b.txt檔案中用回車或空格進行分隔。 答: package com

java試題彙總(三)-----javaWeb

1、Tomcat的優化經驗 1. 記憶體優化-Xms 2. 增加執行緒數maxThreads="150" 3. 修正server.xml中的中文編碼 4. BIO改NIO 2、HTTP請求的GET與POST方式的區別 答: 1. URL地址長度不同, GET

java試題彙總(四)-----資料庫

1、用兩種方式根據部門號從高到低,工資從低到高列出每個員工的資訊。 employee: eid, ename, salary, dept_id select * from employee order by dept_id desc, salary; 2、ORACLE

java試題彙總(五)-----xml及流行的框架

1、xml有哪些解析技術?區別是什麼? 答:有DOM,SAX,STAX等 DOM:處理大型檔案時其效能下降的非常厲害。這個問題是由DOM的樹結構所造成的,這種結構佔用的記憶體較多,而且DOM必須在解析檔案之前把整個文件裝入記憶體,適合對XML的隨機訪問SAX:不現於D

20個高階Java試題彙總

這是一個高階Java面試系列題中的第一部分。這一部分論述了可變引數,斷言,垃圾回收,初始化器,令牌化,日期,日曆等等Java核心問題。 什麼是可變引數?斷言的用途?什麼時候使用斷言?什麼是垃圾回收?用一個例子解釋垃圾回收?什麼時候執行垃圾回收?垃圾回收的最佳做法?什麼是初始

試題收集-java試題及答案(基礎題122道,程式碼題19道)

JAVA相關基礎知識 1、面向物件的特徵有哪些方面  1.抽象: 抽象就是忽略一個主題中與當前目標無關的那些方面,以便更充分地注意與當前目標有關的方面。抽象並不打算了解全部問題,而只是選擇其中的一部分,暫時不用部分細節。抽象包括兩個方面,一是過程抽象,二是資料抽象。

2018初級JAVA試題

1.用java語言寫一個單例模式:     (單例模式:顧名思義,在程式中只能有該類的一個例項存在。) (1)單例餓漢模式(惡漢式單例類在類初始化的時候,已經自動例項化) public class Singleton1 { //私有的預設構造器 pri

一道Java試題 讀取篇英文文章,輸出其中出現單詞的次數最多的5個,寫java函式

package com.test.string; import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; import java.util.ArrayLis

java 試題)——— 集合 、執行緒

由於本人最近在換工作,所以可能在整理面試題,下面就是最近面試情況,最常會問到的面試題,有執行緒、集合、IO/NIO、異常,反射、JVM等等,所以也在網上找了大量的資料,那麼現在就先放一點找到的資料,下面就是一些集合、執行緒有關的 面試題 ,稍後也會把一些常見的、重點的面試題整

JAVA試題彙總

陸續更新… JAVA基礎 JAVA中的幾種基本資料型別是什麼,各自佔用多少位元組。 String類能被繼承嗎,為什麼。 String,Stringbuffer,StringBuilder的

Java試題整理(反射)

問題:簡述Java中的反射使用 答: 1.作用: 可以通過配置檔案來動態配置和載入類,以實現軟體工程理論裡所提及的類與類,模組與模組之間的解耦。反射最經典的應用是spring框架。 2. 定義 反射簡單來說,就是動態載入物件,並對物件進行剖析。在Java中的反射機制是指在執

各大網際網路Java試題彙總,最後我成功拿到百度的offer(文末送書)

從事Java開發也有5年經驗了,7月初來到帝都,開啟面試經歷,前後20天左右,主要面網際網路公司

2018年 Java 試題彙總(含答案)

面向物件的三個特徵 封裝,繼承,多型,這個應該是人人皆知,有時候也會加上抽象。 多型的好處 允許不同類物件對同一訊息做出響應,即同一訊息可以根據傳送物件的不同而採用多種不同的行為方式(傳送訊息就是函式呼叫)。主要有以下優點: 可替換性:多型對已存在程式碼具有可替換性

Java試題次完整的Http請求過程(非常詳細)

④ 如果在hosts檔案中也沒有找到對應的條目,瀏覽器就會發起一個DNS的系統呼叫,就會向本地配置的首選DNS伺服器(本地DNS伺服器,一般是電信運營商提供的,也可以使用像Google提供的DNS伺服器)發起域名解析請求(遞迴,通過的是UDP協議向DNS的53埠發起請求,這個請求是遞迴的請求,也就是運營商的D

阿里歷年經典Java試題彙總

點選上方“Java團長”,選擇“置頂公眾號”乾貨文章第一時間送達!Volatile的特徵:A、禁

Java試題彙總與解答

2018最新Java面試題整理(持續完善中…) 宣告:面試題(無參考答案)收集自公眾號服務端思維,本人抱著學習的態度網上找了下參考答案,有不足的地方還請指正,謝謝~ 基礎篇 基本功 面向物件特徵 封裝,繼承,多型和抽象 封裝 封裝給物件提供了隱藏內部特性