注:力扣選擇題練習總結
1、 以下代碼運行輸出的是
public class Person{
private String name = "Person";
int age=0;
}
public class Child extends Person{
public String grade;
public static void main(String[] args){
Person p = new Child();
System.out.println(p.name);
}
}
A.輸出:Person
B.沒有輸出
C.編譯出錯
D.運行出錯
正確答案:C
【解析】Person的name屬性爲private。
2、 以下程序的輸出結果爲
class Base{
public Base(String s){
System.out.print("B");
}
}
public class Derived extends Base{
public Derived (String s) {
System.out.print("D");
}
public static void main(String[] args){
new Derived("C");
}
}
A BD
B DB
C C
D 編譯錯誤
正確答案:D。
【解析】創建子類對象時必須在子類構造函數中先調用父類構造函數。
public Derived (String s) {
super(s);//調用父類構造函數
//如果父類是默認的無參構造函數,這裏super();就可以省略
//但實際上系統會自動爲你添加。
System.out.print("D");
}
3、 構造方法不可以重載。重載函數必須有不同的形參列表。
4、 i)SQL語言又稱爲結構化查詢語言。
ii)java中”static”關鍵字表明一個成員變量或者是成員方法可以在沒有所屬的類的實例變量的情況下被訪問。
iii)面向對象開發中,引用傳遞意味着傳遞的並不是實際的對象,而是對象的引用,因此,外部對引用對象所做的改變不會反映到所引用的對象上。
上句話是錯誤的!!!
值傳遞,傳遞的是原來值的副本。 引用傳遞,除了一些特殊的(String,包裝類屬於不可變類),一般的引用類型在進行傳遞的時候,一開始形參和實參都是指向同一個地址的,這個時候形參對對象的改變會影響到實參。
iiii) java是強類型語言,javascript是弱類型語言。
5、 程序讀入用戶輸入的一個值,要求創建一個自定義的異常,如果輸入值大於 10 ,使用 throw 語句顯式地引
發異常,異常輸出信息爲 ”something’swrong!” ,語句爲()
A if(i>10)throw new Exception(“something’swrong!”);
B if(i>10)throw Exception e(“something’swrong!”);
C if(i>10) throw new Exception e(“something’swrong!”);
D if(i>10)throw Exception( “something’swrong!”);
正確答案:A
【解析】throw是語句拋出異常,有兩種用法: 拋出異常e實例或新的Exception實例;
1.catch中的throw e;
2.方法體中的throw new Exception();
區別如下: throw e是將已經catch到的e重新拋出,而throw new Exception()是重新生成一個Exception類的對象並拋出。有兩點重要區別,第一e中記錄了原異常的信息,如除零異常的信息,而new Exception()是一個新對象,當中不包含任何有用的信息;第二e可能存在向上轉型,即e的實際類型可能是Exception的子類,而new Exception()就是Exception類的對象。
6、 public String substring(int beginIndex,int endIndex)
返回一個新字符串,它是此字符串的一個子字符串。該子字符串從指定的 beginIndex 處開始,直到索引 endIndex - 1 處的字符。因此,該子字符串的長度爲 endIndex-beginIndex。
示例:
"hamburger".substring(4, 8) returns "urge"
"smiles".substring(1, 5) returns "mile"
7、 java語言的幾種數組複製方法中,System.arraycopy效率最高。
8、 以下代碼結果是什麼?
public class foo {
public static void main(String sgf[]) {
StringBuffer a=new StringBuffer(“A”);
StringBuffer b=new StringBuffer(“B”);
operate(a,b);
System.out.println(a+”.”+b);
}
static void operate(StringBuffer x,StringBuffer y) {
x.append(y);
y=x;
}
}
A 代碼可以編譯運行,輸出“AB.AB”。
B 代碼可以編譯運行,輸出“A.A”。
C 代碼可以編譯運行,輸出“AB.B”。
D 代碼可以編譯運行,輸出“A.B”。
正確答案:C
【圖示】
9、
public static void main(String[] args){
String s;
System.out.println("s="+s);
}
由於String s沒有初始化,代碼不能編譯通過.
10、 裝箱、拆箱操作發生在: 引用類型與值類型之間。
11、 在java7中,下列哪個說法是正確的:
• ConcurrentHashMap使用synchronized關鍵字保證線程安全
• HashMap實現了Collection接口
• Arrays.asList方法返回java.util.ArrayList對象
• SimpleDateFormat對象是線程不安全的
正確答案:D
【解析】
A. hashMap在單線程中使用大大提高效率,在多線程的情況下使用hashTable來確保安全。hashTable中使用synchronized關鍵字來實現安全機制,但是synchronized是對整張hash表進行鎖定即讓線程獨享整張hash表,在安全同時造成了浪費。concurrentHashMap採用分段加鎖的機制來確保安全。
B. HashMap實現的是Map接口,Map和Collection是同一級別的。
C. Arrays.asList() 將一個數組轉化爲一個List對象,這個方法返回一個ArrayList類型的對象, 這個ArrayList類並非java.util.ArrayList類,而是Arrays類的靜態內部類!用這個對象對列表進行添加刪除更新操作,就會報UnsupportedOperationException異常。
12、下列代碼執行結果爲()
public class Main {
public static void main(String args[])throws InterruptedException{
Thread t=new Thread(new Runnable() {
public void run(){
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
System.out.print("2");
}
});
t.start();
t.join();
System.out.print("1");
}
}
A 21
B 12
C 可能爲12,也可能爲21
D 以上答案都不對
正確答案:A
【解析】thread.Join把指定的線程加入到當前線程,可以將兩個交替執行的線程合併爲順序執行的線程。比如在線程B中調用了線程A的Join()方法,直到線程A執行完畢後,纔會繼續執行線程B。本題在主線程中調用了子線程的join函數,因此主線程必須等待子線程執行完畢才結束因此輸出結果只能是21。
13、 關於sleep()和wait():
Sleep是線程類(Thread)的方法,wait是object類的方法;
Sleep不釋放對象鎖,wait放棄對象鎖;
Sleep暫停線程,但監控狀態仍然保持,結束後會自動恢復。
Java中sleep和wait的區別
① 這兩個方法來自 不同的類 分別是,sleep來自Thread類,和wait來自Object類。
sleep是Thread的靜態類方法, 誰調用的誰去睡覺,即使在a線程裏調用b的sleep方法,實際上還是a去睡覺, 要讓b線程睡覺要在b的代碼中調用sleep。
② 鎖: 最主要是sleep方法沒有釋放鎖,而wait方法釋放了鎖,使得其他線程可以使用同步控制塊或者方法。
sleep不出讓系統資源;wait是進入線程等待池等待,出讓系統資源,其他線程可以佔用CPU。一般wait不會加時間限制,因爲如果wait線程的運行資源不夠,再出來也沒用,要等待其他線程調用notify/notifyAll喚醒等待池中的所有線程,纔會進入就緒隊列等待OS分配系統資源。sleep(milliseconds)可以用時間指定使它自動喚醒過來,如果時間不到只能調用interrupt()強行打斷。
Thread.sleep(0)的作用是“觸發操作系統立刻重新進行一次CPU競爭”。
③ 使用範圍:wait,notify和notifyAll只能在同步控制方法或者同步控制塊裏面使用,而sleep可以在任何地方使用。
synchronized(x){
x.notify()
//或者wait()
}
14、以下是java concurrent包下的4個類,選出差別最大的一個
A. Semaphore
B. ReentrantLock
C. Future
D. CountDownLatch
正確答案:C
【解析】
A、Semaphore:類,控制某個資源可被同時訪問的個數;
B、ReentrantLock:類,具有與使用synchronized方法和語句所訪問的隱式監視器鎖相同的一些基本行爲和語義,但功能更強大;
C、 Future:接口,表示異步計算的結果;
D、 CountDownLatch: 類,可以用來在一個線程中等待多個線程完成任務的類。
15、如果finally塊中有return語句的話,它將覆蓋掉函數中其他return語句。
關於try catch 知識:程序運行到 try塊,b=20;並沒有發生異常,不運行catch塊,運行到return b;因爲finally塊無論如何都要運行,因此並不發生返回動作,進行運行finally塊,b=30;
進行程序返回輸出。
16、常見的哈希衝突解決方法:
1.開放地址法
2.鏈地址法(拉鍊法)
3.再散列
4.建立一個公共溢出區
解決哈希衝突常用的兩種方法是:開放定址法和鏈地址法 ;
**開放定址法:**當衝突發生時,使用某種探查(亦稱探測)技術在散列表中形成一個探查(測)序列。沿此序列逐個單元地查找,直到找到給定 的關鍵字,或者碰到一個開放的地址(即該地址單元爲空)爲止(若要插入,在探查到開放的地址,則可將待插入的新結點存人該地址單元)。查找時探查到開放的 地址則表明表中無待查的關鍵字,即查找失敗。
**鏈地址法:**將所有關鍵字爲同義詞的結點鏈接在同一個單鏈表中。若選定的散列表長度爲m,則可將散列表定義爲一個由m個頭指針組成的指針數 組T[0…m-1]。凡是散列地址爲i的結點,均插入到以T[i]爲頭指針的單鏈表中。T中各分量的初值均應爲空指針。
17、
下面哪段程序能夠正確的實現了GBK編碼字節流到UTF-8編碼字節流的轉換:
1 byte[] src,dst;
• dst=String.fromBytes(src,“GBK”).getBytes(“UTF-8”)
• dst=new String(src,“GBK”).getBytes(“UTF-8”)
• dst=new String(“GBK”,src).getBytes()
• dst=String.encode(String.decode(src,“GBK”)),“UTF-8” )
正確答案:B
【解析】操作步驟就是先解碼再編碼
用new String(src,“GBK”)解碼得到字符串
用getBytes(“UTF-8”)得到UTF8編碼字節數組
18、
i)CopyOnWrite併發容器用於讀多寫少的併發場景,Copy-On-Write簡稱COW,是一種用於程序設計中的優化策略。其基本思路是,從一開始大家都在共享同一個內容,當某個人想要修改這個內容的時候,纔會真正把內容Copy出去形成一個新的內容然後再改,這是一種延時懶惰策略。從JDK1.5開始Java併發包裏提供了兩個使用CopyOnWrite機制實現的併發容器,它們是CopyOnWriteArrayList和CopyOnWriteArraySet。
ii)在JDK1.7之前,ConcurrentHashMap是通過分段鎖機制來實現的,所以其最大併發度受Segment的個數限制。因此,在JDK1.8中,ConcurrentHashMap的實現原理摒棄了這種設計,而是選擇了與HashMap類似的數組+鏈表+紅黑樹的方式實現,而加鎖則採用CAS和synchronized實現。讀寫都加鎖 。
iii)volatile保證內存可見性和有序性(內存屏障實現),不能保證原子性。
19、在使用 interface 聲明一個接口時,只可以使用static修飾符修飾該接口。
20、hasNext爲Iterator的方法,表示迭代時是否有下一個元素