1. 程式人生 > 其它 >Java面試題(持續更新)

Java面試題(持續更新)

1.值傳遞和引用傳遞的區別

基本資料型別引數傳遞時,傳遞的是值的副本,改變值的副本,不會影響原來的變數
引用資料型別引數傳遞時,傳遞的是地址的副本,副本也是指向同一個變數,會影響原來的變數
String型別屬於特殊的引用資料型別,作為引數傳遞,原來的值不會改變

2.== 與 equals的區別

== 比較基本資料型別比較的是值,比較引用資料型別,比較的是地址
equals 只能比較引用資料型別,比較的是地址

擴充套件

2.1 String型別

String類如果直接使用 = 號賦值,將先從常量池中查詢有沒有同內容的變數
如果有,則直接使用已存在的內容的地址
如果沒有,將此內容存在常量池中,完成賦值

這樣做是為了節省記憶體空間

public static void main(String[] args) {
		String str1 = "abc";
		String str2 = "abc";
		String str3 = new String("abc");
		System.out.println(str1.equals(str2));  // true
    	System.out.println(str1.equals(str3));  // true
		System.out.println(str1 == str2);		// true
		System.out.println(str1 == str3);		// false
}

2.2 整形包裝類

整形包裝類和char包裝類直接使用 = 號賦值,如果數值相同
取值範圍在byte取值範圍以內,使用 == 比較結果為 true
超過byte取值範圍,使用 == 比較結果為 flase

因為JDK的開發人員為了節省記憶體空間,將byte取值範圍內的數值存放在一個快取陣列中
如果在byte取值範圍,那麼將從陣列中取出對應的值
如果不在byte取值範圍內,直接new一個新的物件

public static void main(String[] args) {
		Integer i1 = 25;
		Integer i2 = 25;
		System.out.println(i1 == i2);	// true
		Integer i3 = 200;
		Integer i4 = 200;
		System.out.println(i3 == i4);	// false

		Integer i5 = 127;
		Integer i6 = 127;
		System.out.println(i5 == i6);	// true
		Integer i7 = 128;
		Integer i8 = 128;
		System.out.println(i7 == i8);	// false

		Byte b1 = 20;
		Byte b2 = 20;
		System.out.println(b1 == b2);	// true

		Short s1 = 120;
		Short s2 = 120;
		System.out.println(s1 == s2);	// true
		Short s3 = 200;
		Short s4 = 200;
		System.out.println(s3 == s4);	// false

		Long l1 = 20L;
		Long l2 = 20L;
		System.out.println(l1 == l2);	// true
		Long l3 = 300L;
		Long l4 = 300L;
		System.out.println(l3 == l4);	// false
		
		Character ch1 = 20;
		Character ch2 = 20;
		System.out.println(ch1 == ch2);	//true
		Character ch3 = 200;
		Character ch4 = 200;
		System.out.println(ch3 == ch4);	//false
}

3.氣泡排序

陣列中,兩兩相鄰比較,遇到條件成立的就交換位置
經分析:
比較的輪數是陣列長度 -1 ,外層迴圈控制比較的輪數
每一輪比較的次數:最多的一次是陣列長度 -1 ,依次遞減,內層迴圈控制比較的次數

外層迴圈次數:N - 1
內層迴圈次數:N - 1 - i

public static void main(String[] args) {
        int [] nums = {20,1,55,784,10,233,65};
	for(int i = 0;i < nums.length - 1;i++) {
		for(int j = 0;j < nums.length - 1 - i;j++) {
			if(nums[j] < nums[j + 1]) {
				int temp = nums[j];
				nums[j] = nums[j + 1];
				nums[j + 1] = temp;
			}
		}
	}
	System.out.println(Arrays.toString(nums));
}