20200109一家面試題

選擇題

1.關於java類中static成員和對象成員說法正確的是(C)
A.static成員變量在對象構造時生成
B.static成員函數在對象成員函數中無法使用
C.虛成員函數不可能是static成員函數
D.static成員函數不能訪問static成員變量

答案:c 解釋,(1)類的static成員變量屬於該抽象類,需要在類定義時初始化,不可以在對象的構造函數中初始化。(2) static成員函數在對象成員函數中可以調用,同屬於一個類作用域 (3)正確,static成員函數不可以聲明爲const和virtual,詳見C++ primer (4)static成員函數只能夠訪問static 成員變量。

2.關於hashmap和hashtable,錯誤的是(B)
A.兩者都是key-value方式獲取數據
B.hashtable允許null作爲key和value,而hashmap不可
C.hashmap不是同步的,而hashtable是同步的
D.迭代hashmap採用快速失敗機制,而hashtable不是

答案:B,很明顯,說反了,只有hashmap纔可以允許key和value爲空的

3.java中,StringBuilder和StringBuffer的區別,錯誤的是(C)
A.stringbuffer是線程安全的
B.stringbuilder是非現成安全的
C.stringbuffer對string類型進行改變的時候其實等同於生成一個新的string對象,然後將指針指向新的string對象
D.效率比較string<stringbuffer<stringbuilder,但是在string s1="this is only a " + “simple”+"test"時 ,string 效率最高

說明:1.String含義爲引用數據類型,是字符串常量.是不可變的對象,(顯然線程安全)在每次對string類型進行改變的時候其實都等同與生成了一個新的String對象.然後指針指向新的String對象,所以經常改變內容的字符串最好不使用String,因爲每次生成對象都會對系統性能產生影響,特別當內存中無引用對象多了之後.JVM的垃圾回收(GC)就會開始工作,對系統的性能會產生影響
2.StringBuffer 線程安全的可變字符序列:對StringBuffer對象本身進行操作,而不是生成新的對象.所所以在改變對象引用條件下,一般推薦使用StringBuffer.同時主要是使用append和insert方法,
3.StringBuilder 線程不安全的可變字符序列.提供一個與StringBuffer兼容的API,但不同步.設計作爲StringBuffer的一個簡易替換,用在字符緩衝區被單個線程使用的時候.效率比StringBuffer更快

4.以下代碼輸出結果爲(A)

public class test extends Thread{
@Override
public void run() {
	try {
		Thread.sleep(1000);
	} catch (InterruptedException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
	System.out.println("run");
}

public static void main(String[] args) {
	test a=new test();
	a.run();
	System.out.println("main");
}

}

A.run main
B.main run
C.main
D.run

解釋:線程小坑題 就是 不用start 直接調方法

簡答題

1.Iterator和ListIterator的區別是什麼?

(1). ListIterator有add()方法,可以向List中添加對象,而Iterator不能
(2). ListIterator和Iterator都有hasNext()和next()方法,可以實現順序向後遍歷,但是ListIterator有hasPrevious()和previous()方法,可以實現逆向(順序向前)遍歷。Iterator就不可以。
(3). ListIterator可以定位當前的索引位置,nextIndex()和previousIndex()可以實現。Iterator沒有此功能。
(4). 都可實現刪除對象,但是ListIterator可以實現對象的修改,set()方法可以實現。Iierator僅能遍歷,不能修改。
因爲ListIterator的這些功能,可以實現對LinkedList等List數據結構的操作。其實,數組對象也可以用迭代器來實現。
2.comparable和comparator接口是幹什麼的?列出他們的區別
Comparable和Comparator接口是用來對自定義的class比較大小的。
Comparator和 Comparable的區別:Comparator定義在Person的外部而Comparable定義在Person的內部。
public class Persion implements Comparable {…比較Person的大小…},因爲已經實現了比較器,那麼Person現在是一個可以比較大小的對象了,它的比較功能和String完全一樣,可以隨時隨地的拿來比較大小,因爲Person現在自身就是有大小之分的。Collections.sort(personList)可以得到正確的結果。
Comparator是定義在Person的外部的,
public class Person{ String name; int age },然後另外定義一個比較器:
public PersonComparator implements Comparator() {…比較Person的大小…},在PersonComparator裏面實現了怎麼比較兩個Person的大小. 所以用這種方法,要對一個 personList進行排序的時候除了要傳遞personList過去,還需要把PersonComparator傳遞過去,因爲怎麼比較Person的大小是在PersonComparator裏面實現的,如Collections.sort( personList , new PersonComparator() )。

3.同步方法和 同步代碼塊區別?

說明:
同步方法:
即有synchronized 修飾符修飾的方法。
同步代碼塊
即有synchronized修飾符修飾的語句塊,被該關鍵詞修飾的語句塊,將加上內置鎖。實現同步。例:synchronized(Object o ){}
區別:
同步方法默認用this或者當前類class對象作爲鎖;
同步代碼塊可以選擇以什麼來加鎖,比同步方法要更細顆粒度,我們可以選擇只同步會發生同步問題的部分代碼而不是整個方法;
同步方法使用關鍵字 synchronized修飾方法,而同步代碼塊主要是修飾需要進行同步的代碼,用 synchronized(object){代碼內容}進行修飾;

4.一個ArrayList對象的aList中存有若干個字符,刪除’abc’的元素。
可以使用 Iterator 中的remove()方法

Iterator<String> iterator=list.iterator();
while(iterator.hasNext()) {
	if(iterator.next().equals("abc")) {
		iterator.remove();
	}
}

可以使用 for循環 刪除 list.get(i)==bbb 進行remove ;後面要i–;
爲了使i成爲刪除之前的索引位置,因爲刪除了就少了一個,否則會跳過刪除元素後面的元素。

5.編寫方法對List集合進行排序,然後遍歷輸出。

public static void sort(int [] a){
    int i, j;
    for(i=0; i<a.length; i++){
        for(j=1; j<a.length-i; j++){
            if(a[j-1] > a[j]){
                int temp;
                temp = a[j-1];
                a[j-1] = a[j];
                a[j]=temp;
            }
        }
    }
    
    System.out.println("$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$");
    for (int k = 0; k < a.length; k++) {
        System.out.print(a[k]+"&&");
    }
    System.out.println();
    System.out.println("$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$");
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章