面試題

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

基本數據類型參數傳遞時,傳遞的是值的副本,改變值的副本,不會影響原來的變量
引用數據類型參數傳遞時,傳遞的是地址的副本,副本也是指向同一個變量,會影響原來的變量
String類型屬於特殊的引用數據類型,做爲參數傳遞,原來的值不會改變java

2.== 與 equals的區別

== 比較基本數據類型比較的是值,比較引用數據類型,比較的是地址
equals 只能比較引用數據類型,比較的是地址數組

擴展

2.1String類型

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
}

2.3重寫equals方法

String類對equals方法進行了重寫,改成比較內容,咱們也能夠對equals方法進行重寫,改成比較兩個對象的內容是否相同ide

public boolean equals(Object obj) {
	// 第一步 先比較地址 若是地址相同 則直接return true  不須要繼續比較 了
	if(this == obj) {
		return true;
	}
	// 代碼執行到這裏 表示 地址不一樣 那麼咱們應該比較內容 名字和身份證號
	// 由於obj是父類對象 而父類對象不能直接獲取name屬性的值 因此須要強制向下轉換,才能使用getIdCare()方法和getName()方法
	Person p1 = (Person) obj;
	if(this.getName().equals(p1.getName()) && this.getIdCard().equals(p1.getIdCard())) {
		return true;
	}
	// 若是代碼可以執行到這裏 表示 上述條件不成立
	return false;
}
冒泡排序

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

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));
}
4. String、StringBuffer、StringBulider三者的區別

String類是一個不可變對象 由於String類底層維護的是一個final修飾的char數組,任何對原字符串進行的增刪改操做 都將產生一個新的字符串
StringBuffer和StringBuilder是可變對象
StringBuffer是線程安全的 JDK1.0
StringBuilder線程不安全 JDK1.5this

5.try...catch...finally

try-catch塊中存在return語句,是否還執行finally塊?若是執行,以下代碼,說出執行順序線程

public static void main(String[] args) {
	System.out.println(m1());  //11  
}
public static int m1() {
	int num = 10;
	try {
		num ++;
		return num;
	} catch (Exception e) {
		e.printStackTrace();
	}finally {
		num ++;
	}
	return num;
}
相關文章
相關標籤/搜索