1、下面程序的運行結(jié)果是
public static void main(String[] args) {
String str1 = "hello";
String str2 = "he" + new String("llo");
String str3 = "he" + "llo";
System.err.println(str1 == str2);
System.err.println(str1 == str3);
}
運行結(jié)果:
false
true
往集合在添加元素時,調(diào)用 add(Object)方法的時候,首先會調(diào)用Object的 hashCode()方法判斷hashCode 是否已經(jīng)存在,如不存在則直接插入元素;如果已存在則調(diào)用Object對象的 equals()方法判斷是否返回 true,如果為true則說明元素已經(jīng)存在,如為false則插入元素。
● List、Set 是繼承 Collection 接口; Map不是。
● List:元素有放入順序,元素可重復(fù),通過下標來存取。
● Map:元素按鍵值對存取,無放入順序。
● Set:元素?zé)o存取順序,元素不可重復(fù)(注意:元素雖然無放入順序,但是元素在 set 中的位置是有該元素的 hashCode 決定的,其位置其實是固定的)。
按值傳遞是指的是在方法調(diào)用時,傳遞的參數(shù)是按值的拷貝傳遞。按值傳遞重要特點:傳遞的是值的拷貝,也就是說傳遞后就互不相關(guān)了示例如下:
class TempTest {
private void test1(int a) {
a = 5;
System.out.println("test1 方法中的 a=" + a);
}
public static void main(String[] args) {
TempTest t = new TempTest();
int a = 3;
//傳遞后,test1 方法對變量值的改變不影響這里的 a
t.test1(a);
System.out.println("main 方法中的 a =" + a);
}
}
運行結(jié)果是:
test1 方法中的 a=5
main 方法中的 a =3
按引用傳遞是指的是在方法調(diào)用時,傳遞的參數(shù)是按引用進行傳遞,其實傳遞的是引用的地址,也就是變量所對應(yīng)的內(nèi)存空間的地址。傳遞的是值的引用,也就是說傳遞前和傳遞后都指向同一個引用(也就是同一個內(nèi)存空間)。示例如下:
class TempTest {
private void test1(A a) {
a.age = 20;
System.out.println("test1 方法中的 age=" + a.age);
}
public static void main(String[] args) {
TempTest t = new TempTest();
A a = new A();
a.age = 10;
t.test1(a);
System.out.println("main 方法中的 age =" + a.age);
}
}
class A {
public int age = 0;
}
運行結(jié)果:
test1 方法中的 age=20
main 方法中的 age =20
NullPointerException - 空指針引用異常
ClassCastException - 類型強制轉(zhuǎn)換異常。
IndexOutOfBoundsException - 下標越界異常
NumberFormatException - 數(shù)字格式異常
所謂事務(wù)是用戶定義的一個數(shù)據(jù)庫操作序列,這些操作要么全做要么全不做,是一個不可分割的工作單位。
例如在關(guān)系數(shù)據(jù)庫中,一個事務(wù)可以是一條 SQL 語句、一組 SQL 語句或整個程序。簡單舉個例子就是你要同時修改數(shù)據(jù)庫中兩個不同表的時候,如果它們不是一個事務(wù)的話,當?shù)谝粋€表修改完,可是第二表改修出現(xiàn)了異常而沒能修改的情況下,就只有第二個表回到未修改之前的狀態(tài),而第一個表已經(jīng)被修改完畢。而當你把它們設(shè)定為一個事務(wù)的時候,當?shù)谝粋€表修改完,可是第二表改修出現(xiàn)了異常而沒能修改的情況下,第一個表和第二個表都要回到未修改的狀態(tài)!這就是所謂的事務(wù)回滾。
例如,在將資金從一個帳戶轉(zhuǎn)移到另一個帳戶的銀行應(yīng)用中,一個帳戶將一定的金額貸記到一個數(shù)據(jù)庫表中,同時另一個帳戶將相同的金額借記到另一個數(shù)據(jù)庫表中。由于計算機可能會因停電、網(wǎng)絡(luò)中斷等而出現(xiàn)故障,因此有可能更新了一個表中的行,但沒有更新另一個表中的行。如果數(shù)據(jù)庫支持事務(wù),則可以將數(shù)據(jù)庫操作組成一個事務(wù),以防止因這些事件而使數(shù)據(jù)庫出現(xiàn)不一致。如果事務(wù)中的某個點發(fā)生故障,則所有更新都可以回滾到事務(wù)開始之前的狀態(tài)。如果沒有發(fā)生故障,則通過以完成狀態(tài)提交事務(wù)來完成更新。
A.CFHGEBDA
B.CDFEGHBA
C.FGHCDEBA
D. CFHGEDBA
原因:對于二叉樹的遍歷方式一般分為三種先序、中序、后序三種方式:
先序遍歷(根左右)若二叉樹為空,則不進行任何操作,否則
● 訪問根結(jié)點。
● 先序方式遍歷左子樹。
● 先序遍歷右子樹。
中序遍歷 (左根右)若二叉樹為空,則不進行任何操作,否則
● 中序遍歷左子樹。
● 訪問根結(jié)點。
● 中序遍歷右子樹。
后序遍歷 (左右根)若二叉樹為空,則不進行任何操作,否則
● 后序遍歷左子樹。
● 后序遍歷右子樹。
● 訪問根結(jié)點。
因此,根據(jù)題目給出的先序遍歷和中序遍歷,可以畫出二叉樹:
A.有序數(shù)組
B.有序鏈表
C.AVL 樹
D.Hash 表
看下圖:
平衡二叉樹的查找,插入和刪除性能都是 O(logN) ,其中查找和刪除性能較好;哈希表的查找、插入和刪除性能都是 O(1) ,都是最好的。所以最后的結(jié)果選擇:CD。
A.快速排序
B.堆排序
C.歸并排序
D.冒泡排序
看下圖:
根據(jù)上圖,觀察平均情況,最好最差情況的時間復(fù)雜度基本可以知道答案了,最后結(jié)果選擇: BC。
A. 8 3 2 5 1 6 4 7
B. 3 2 8 5 1 4 6 7
C. 3 8 2 5 1 6 7 4
D. 8 2 3 5 1 4 7 6
初始化序列:1 8 6 2 5 4 7 3,小根堆就是要求結(jié)點的值小于其左右孩子結(jié)點的值,左右孩子的大小沒有關(guān)系,那么小根堆排序之后為:1 2 4 3 5 6 7 8;中序遍歷:左根右,故遍歷結(jié)果為:8 3 2 5 1 6 4 7,故最后選擇的結(jié)果:A
int foo(int n) {
if (n < 2) return n;
return foo(n - 1) + foo(n - 2);
}
A.5
B.7
C.8
D.1
A.37.5%
B.32.5%
C.28.6%
D.26.1%
做這道題首先得了解犯罪率是什么?犯罪率就是犯罪人數(shù)與總?cè)丝跀?shù)的比。因此可以直接得出公式:( 3 0.01% ) / ( 30.01% + 5 * 0.015% ) = 28.6%,當然如果不好理解的話,我們可以實例化,比如B區(qū)假設(shè) 5000 人,A區(qū) 3000 人,A 區(qū)的犯罪率為 0.01%,那么 A 區(qū)犯罪人數(shù)為 30 人,B 區(qū)的犯罪率為 0.015% ,那么 B 區(qū)的犯罪人數(shù)為 75 人 ,求發(fā)生在 A 區(qū)的可能性,就是說 A 區(qū)的犯罪人數(shù)在總犯罪人數(shù)的多少,也就是 30/(30+75)=0.2857,當然,也可以回歸到我們高中遺忘的知識:
假設(shè) C 表示犯案屬性
在 A 區(qū)犯案概率:P(C|A)=0.01%
在 B 區(qū)犯案概率:P(C|B)=0.015%
在 A 區(qū)概率:P(A)=3/8
在 B 區(qū)概率:P(B)=5/8
犯案概率:P(C)=(3/80.01%+5/80.015%)
根據(jù)貝葉斯公式:P(A|C) = P(A,C) / P(C) = [P(C|A) P(A)] / [ P(C|A) P(A)+ P(C|B) P(B) ] 也可以算出答案來,最后結(jié)果選擇為: C
A.Socket
B.共享內(nèi)存
C.消息隊列
D.信號量
管道(Pipe)及有名管道(named pipe):管道可用于具有親緣關(guān)系進程間的通信,有名管道克服了管道沒有名字的限制,因此,除具有管道所具有的功能外,它還允許無親緣關(guān)系進程間的通信;
信號(Signal):信號是比較復(fù)雜的通信方式,用于通知接受進程有某種事件發(fā)生,除了用于進程間通信外,進程還可以發(fā)送信號給進程本身;linux 除了支持 Unix 早期信號語義函數(shù) sigal 外,還支持語義符合 Posix.1 標準的信號函數(shù) sigaction(實際上,該函數(shù)是基于 BSD 的,BSD 為了實現(xiàn)可靠信號機制,又能夠統(tǒng)一對外接口,用 sigaction 函數(shù)重新實現(xiàn)了 signal 函數(shù));
報文(Message)隊列(消息隊列):消息隊列是消息的鏈接表,包括 Posix 消息隊列 system V 消息隊列。有足夠權(quán)限的進程可以向隊列中添加消息,被賦予讀權(quán)限的進程則可以讀走隊列中的消息。消息隊列克服了信號承載信息量少,管道只能承載無格式字節(jié)流以及緩沖區(qū)大小受限等缺點。
共享內(nèi)存:使得多個進程可以訪問同一塊內(nèi)存空間,是最快的可用 IPC 形式。是針對其他通信機制運行效率較低而設(shè)計的。往往與其它通信機制,如信號量結(jié)合使用,來達到進程間的同步及互斥。
信號量(semaphore):主要作為進程間以及同一進程不同線程之間的同步手段。
套接口(Socket):更為一般的進程間通信機制,可用于不同機器之間的進程間通信。起初是由 Unix 系統(tǒng)的 BSD分支開發(fā)出來的,但現(xiàn)在一般可以移植到其它類 Unix 系統(tǒng)上:Linux 和 System V 的變種都支持套接字。
故最后選擇的結(jié)果為: ABCD
A.棧區(qū)
B.堆區(qū)
C.全局區(qū)
D.代碼區(qū)
原因:靜態(tài)變量的修飾關(guān)鍵字:static,又稱靜態(tài)全局變量。故最后選擇的結(jié)果為: C
A.在 Name 字段上添加主鍵
B.在 Name 字段上添加索引
D.在 Age 字段上添加索引
A.找不到該頁面
B.禁止訪問
C.內(nèi)部服務(wù)器訪問
D.服務(wù)器繁忙
A.Application layer
B.Presentation layer
C.Transport layer
D.Network layer
19、一個棧的入棧序列是 A,B,C,D,E,則棧的不可能的輸出序列是?(C)
A.EDCBA
B.DECBA
C.DCEAB
D.ABCDE
堆棧分別是先進后出,后進先出,選項 a 是 abcde 先入棧,然后依次出棧,正好是 edcba。選項 b 是 abcd 先依次入棧,然后d出棧, e再入棧, e出棧選項c是錯誤的,不可能a先出棧。選項 d 是 a 入棧,然后 a 出棧;b 再入棧, b 出棧。依此類推。最后的結(jié)果選擇 C。
A.stack
B.data section
C.register set
D.file fd
● 線程共享的內(nèi)容包括:
進程代碼段
進程的公有數(shù)據(jù)(利用這些共享的數(shù)據(jù),線程很容易的實現(xiàn)相互之間的通訊)
進程打開的文件描述符
信號的處理器
進程的當前目錄和進程用戶 ID 與進程組 ID
● 線程獨有的內(nèi)容包括:
線程 ID
寄存器組的值
線程的堆棧
錯誤返回碼
線程的信號屏蔽碼
所以選擇為 BD。
A.使用了局部變量
B.有一個分支不調(diào)用自身
C.使用了全局變量或者使用了一個或多個參數(shù)
D.沒有循環(huán)調(diào)用
A.分析單詞是怎樣構(gòu)成的
B.分析單詞串是如何構(gòu)成語言和說明的
C.分析語句和說明是如何構(gòu)成程序的
D.分析程序的結(jié)構(gòu)
● 詞法分析(lexical analysis)詞法分析是編譯過程的第一個階段。這個階段的任務(wù)是從左到右的讀取每個字符,然后根據(jù)構(gòu)詞規(guī)則識別單詞。詞法分析可以用 lex 等工具自動生成。
● 語法分析(syntax analysis)語法分析是編譯過程的一個邏輯階段。語法分析在詞法分析的基礎(chǔ)上,將單詞序列組合成各類語法短語,如“程序”,“語句”,“表達式”等等。語法分析程序判斷程序在結(jié)構(gòu)上是否正確。
● 語義分析(semantic analysis)屬于邏輯階段。對源程序進行上下文有關(guān)性質(zhì)的審查,類型檢查。如賦值語句左右端類型匹配問題。
所以 BCD 都屬于詞法分析,選擇結(jié)果為 BCD。
A.空閑讓進
B.忙則等待
C.有限等待
D.讓權(quán)等待
A.CPU 調(diào)度給優(yōu)先級更高的線程
B.阻塞的線程獲得資源或者信號
C.在時間片輪轉(zhuǎn)的情況下,如果時間片到了
D.獲得 spinlock 未果
A.狀態(tài)模式
B.裝飾模式
C.代理模式
D.觀察者模式
public class Test {
public static void main(String[] args) {
List<String> a = null;
test(a);
System.out.println(a.size());
}
public static void test(List<String> a) {
a = new ArrayList<String>();
a.add("abc");
}
}
A.0
B.1
C.java.lang.NullPointerException
D.以上都不正確
A.ps
B.cat
C.more
D.sep
A.程序計數(shù)器
B.堆
C.方法區(qū)
D.本地方法棧
A.阻塞隊列是線程安全的
B.阻塞隊列的主要應(yīng)用場景是“生產(chǎn)者-消費者”模型
C.阻塞隊列里的元素不能為 null
D.阻塞隊列的實現(xiàn)必須顯示地設(shè)置容量
A.CountDownLatch
B.CyclicBarrier
C.Semaphore
D.FutureTask
引用類型和原始類型的行為完全不同,并且它們具有不同的語義。引用類型和原始類型具有不同的特征和用法,它們包括:大小和速度問題,這種類型以哪種類型的數(shù)據(jù)結(jié)構(gòu)存儲,當引用類型和原始類型用作某個類的實例數(shù)據(jù)時所指定的缺省值。對象引用實例變量的缺省值為 null,而原始類型實例變量的缺省值與它們的類型有關(guān)。
class StringUtil {
int compare(char[] v1, char[] v2) {
String str1 = new String(v1);
String str2 = new String(v2);
int result = str1.compareTo(str2);
return result == 0 ? 0 : (result > 0 ? 1 : -1);
}
}
33、Java 出現(xiàn) OutOfMemoryError(OOM)的原因有那些?出現(xiàn) OOM 錯誤后,怎么解決?
觸發(fā) java.lang.OutOfMemoryError:最常見的原因就是應(yīng)用程序需要的堆空間是大的,但是 JVM 提供的卻小。這個的解決方法就是提供大的堆空間即可。
除此之外還有復(fù)雜的原因:內(nèi)存泄露:特定的編程錯誤會導(dǎo)致你的應(yīng)用程序不停的消耗更多的內(nèi)存,每次使用有內(nèi)存泄漏風(fēng)險的功能就會留下一些不能被回收的對象到堆空間中,隨著時間的推移,泄漏的對象會消耗所有的堆空間,最終觸發(fā)java.lang.OutOfMemoryError: Java heap space 錯誤。
解決方案:你應(yīng)該確保有足夠的堆空間來正常運行你的應(yīng)用程序,在 JVM 的啟動配置中增加如下配置:-Xmx1024m,流量/數(shù)據(jù)量峰值:應(yīng)用程序在設(shè)計之初均有用戶量和數(shù)據(jù)量的限制,某一時刻,當用戶數(shù)量或數(shù)據(jù)量突然達到一個 峰 值 , 并 且 這 個 峰 值 已 經(jīng) 超 過 了 設(shè) 計 之 初 預(yù) 期 的 閾 值 , 那 么 以 前 正 常 的 功 能 將 會 停 止 , 并 觸 發(fā)java.lang.OutOfMemoryError: Java heap space 異常解決方案,如果你的應(yīng)用程序確實內(nèi)存不足,增加堆內(nèi)存會解決 GC overhead limit 問題,就如下面這樣,給你的應(yīng)用程序 1G 的堆內(nèi)存:java -Xmx1024m com.yourcompany.YourClass。
A.棧是先進后出的線性表
B.棧只能順序存儲
C.棧具有記憶功能
D.對棧的插入和刪除操作中,不需要改變棧底指針
A.冒泡排序為 n/2
B.冒泡排序為 n
C.快速排序為 n
D.快速排序為 n(n-1)/2
class Person {
int arr[] = new int[10];
public static void main(String args[]) {
System.out.println(arr[1]);
}
}
A.編譯時將產(chǎn)生錯誤
B.編譯時正確,運行時將產(chǎn)生錯誤
C.輸出空
D .輸 出 0
public class Test {
public static void main(String[] args) {
StringBuffer a = new StringBuffer("A");
StringBuffer b = new StringBuffer("B");
operator(a, b);
System.out.println(a + "," + b);
}
public static void operator(StringBuffer x, StringBuffer y) {
x.append(y);
y = x;
}
}
A.A,A
B.A,B
C.B,B
D.AB,B
A.把對象轉(zhuǎn)換成為字符串的形式通過網(wǎng)絡(luò)傳輸,在另一端接收到字符串把對象還原出來
B.把程序數(shù)據(jù)從數(shù)據(jù)庫中讀出來
C.從 XML 配置文件中讀取程序的配置信息
D.把程序數(shù)據(jù)保存為文件
int x = 0;
int y = 10;
do {
y--;
++x;
} while (x < 6);
System.out.println(x + "," + y);
A. 5,6
B. 5,5
C. 6,4
D. 6,6
public static void complicatedexpression_f() {
int x = 20, y = 30;
boolean j;
j = x > 50 && y > 60 || x > 50 && y < -60 || x < -50 && y > 60 || x < -50 && y < -60;
System.out.println(j);
}
A.true
B.false
C.1
D.001
A. 2 3 1
B. 3 2 1
C. 3 1 2
D. 1 2 3?????????????????????