2.== 與 equals的區別基本數據類型參數傳遞時,傳遞的是值的副本,改變值的副本,不會影響原來的變量
引用數據類型參數傳遞時,傳遞的是地址的副本,副本也是指向同一個變量,會影響原來的變量
String類型屬於特殊的引用數據類型,做爲參數傳遞,原來的值不會改變java
== 比較基本數據類型比較的是值,比較引用數據類型,比較的是地址
equals 只能比較引用數據類型,比較的是地址數組
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 }
整形包裝類和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 }
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三者的區別
5.try...catch...finallyString類是一個不可變對象 由於String類底層維護的是一個final修飾的char數組,任何對原字符串進行的增刪改操做 都將產生一個新的字符串
StringBuffer和StringBuilder是可變對象
StringBuffer是線程安全的 JDK1.0
StringBuilder線程不安全 JDK1.5this
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; }