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