Java基礎(二) | 零碎知識小貼士
特意將零碎的知識點都整理出來,方便快速查閱。
一、過載與重寫
- 重寫:發生在子類中;與父類函式名相同,引數列表相同;返回值小於等於父類;訪問許可權大於等於父類;丟擲異常小於等於父類;
- 過載:在用一個類中,方法名相同,引數列表不同,包括引數個數、型別和順序;返回值和訪問權性可以相同,也可以不同;(注意子類繼承父類中的過載與重寫的區分)
二、類中成員的初始化順序
- 原則:
父類中靜態成員和靜態程式碼塊,按照程式碼順序依次載入;
子類中靜態成員和靜態程式碼塊,按照程式碼順序依次載入;
父類中例項成員和例項程式碼塊,按照程式碼順序依次載入;
父類中的構造方法開始初始化;
子類中例項成員和例項程式碼塊,按照程式碼順序依次載入;
子類中的構造方法開始初始化;
三、序列化與反序列化
- 序列化是將Java物件轉化為位元組序列,反序列化是將位元組序列轉化為Java物件;
- 序列化一方面實現資料的持久化,另一方面實現Java程式間物件通訊
//Student類實現Serializable介面,transient關鍵字修飾屬性不能序列化
public static void main(String[] args) {
Student s = new Student("lvziwei",22,"Xidian");
File file = new File("D://s.txt");
try {
file.createNewFile();
} catch (Exception e) {
e.printStackTrace();
}
try{
//序列化物件,輸入輸出流的判別標準為從記憶體中讀為輸出流,向記憶體中寫為輸入流
FileOutputStream fos = new FileOutputStream(file);
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(s);
oos.flush();
oos.close();
fos.close();
//反序列化物件
FileInputStream fis = new FileInputStream(file);
ObjectInputStream ois = new ObjectInputStream(fis);
Student ss = (Student) ois.readObject();
fis.close();
ois.close();
System.out.println(ss.getSchool() + "->" + ss.getAge() + "->" + ss.getName());
}catch(Exception e){
e.printStackTrace();
}
}
四、自動裝箱與拆箱
- 裝箱,將基本型別用它們對應的引用型別包裝起來;拆箱,將包裝型別轉換為對應的基本型別;
- 編譯器在編譯期間,根據語法決定是否進行自動拆箱和裝箱操作,減少常用數值的記憶體開銷和建立物件開銷;
// 下面以int為例解釋
Integer i = 10; //自動裝箱 Integer i = Integer.valueOf(10);
int i2 = i; //自動拆箱 int i2 = Integer.intValue(i);
Integer a = 10;
Integer b = 10;
System.out.println("i == b : " + (a == b)); //true
Integer a1 = 200;
Integer b1 = 200;
System.out.println("i1 == b1 : " + (a1 == b1)); //false
//原因解釋 IntegerCache.low = -128 IntegerCache.high = 127
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
//自動裝箱時,如果整數值在-128~127之間,則自動返回快取值;
//不在此範圍內,則自動新建物件;
// 下面以String為例解釋
String str1 ="abc";
String str2 ="abc";
System.out.println(str2==str1); //輸出為 true
System.out.println(str2.equals(str1)); //輸出為 true
String str3 =new String("abc");
String str4 =new String("abc");
System.out.println(str3==str4); //輸出為 false
System.out.println(str3.equals(str4)); //輸出為 true
// 原因解釋 "==" : 引用是否相同 "equals()" : 比較物件內容是否相同
// 字串物件為不可改變物件,返回自身引用
五、Collection與Collections的區別
- java.util.Collection 是集合類的頂級介面,為集合物件的操作提供通用介面;Java類中有大量的具體實現;
- java.util.Collections 是一種包裝類,包含有對集合操作的多種靜態多型的方法;
六、序列號serialVersionUID
- 作用
確保版本間的相容性,版本指的是Java類的版本; - 生成方式
預設生成方式,serialVersionUID = 1L;
由類名、介面名、成員方法和屬性生成雜湊值; - 作用原理
如果沒有顯示宣告,則會自動生成,序列化操作後儲存在檔案中;反序列化時,JVM從檔案中讀取該值,與該類自動生成的值進行比較,相同則可以進行序列化;如果在序列化之後,反序列化之前,對類進行修改,則會重新生成新的值,此時不能進行反序列化;建議使用顯示宣告預設的序列化值;
七、Iterable和Iterator的區別
- 兩者區別
Iterable是java.lang包中的介面,呼叫iterator()方法,返回Iterator物件;
Iterator是java.util包中的介面,具有hasnext()和next()方法;
Collection介面繼承於Iterable介面; - 設計兩者同時存在的原因
使用foreach(for增強)的類,均需要實現Iterable介面;
Collection的子類集合均是資料結構,而Iterator為迭代物件,設計者希望一種資料結構有多種迭代物件;
每次呼叫Iterable的iterator()方法,均會返回一個Iterator物件;
八、Map.Entry
- 概念
Map是Java的介面,Map.Entry是Map中宣告的內部介面,儲存Map的一個實體,其包含一個鍵值對;Map的entrySet返回一個型別為Map.Entry的集合;
九、Collection中的toArray()方法
public static void main(String[] args) {
List<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(3);
Object[] i = list.toArray();
Integer[] i = list.toArray();// 錯誤,只能轉換為Object型別
Integer[] ii = list.toArray(new Integer[0]);// 新建的陣列長度隨意,僅提供陣列型別即可
}
十、Java的跨平臺性
- Java由與平臺無關的編譯器生成位元組碼檔案(.class檔案),由與平臺相關的解析器(不同平臺的JVM)解析執行,來實現跨平臺;
十一、switch支援的資料型別
- switch支援byte、short、int和char四種基本型別,列舉和String型別;
同時因為自動拆箱機制,支援四種基本資料型別的包裝類;
public class TypeTest {
public static void main(String[] args) {
switch (new Integer(1)) {
case 0:
System.out.println("The num is : 0");
break;
case 1:
System.out.println("The num is : 1");
break;
default:
System.out.println("The num is null");
break;
}
}
}
The num is : 1
// 基於Jclasslib檢視位元組碼檔案
0 new #16 <java/lang/Integer>
3 dup
4 iconst_1
5 invokespecial #18 <java/lang/Integer.<init>>
8 invokevirtual #21 <java/lang/Integer.intValue> //此處實現自動拆箱,呼叫intValue方法
11 tableswitch 0 to 1 0: 32 (+21)
1: 43 (+32)
default: 54 (+43)
32 getstatic #25 <java/lang/System.out>
35 ldc #31 <The num is : 0>
37 invokevirtual #33 <java/io/PrintStream.println>
40 goto 62 (+22)
43 getstatic #25 <java/lang/System.out>
46 ldc #39 <The num is : 1>
48 invokevirtual #33 <java/io/PrintStream.println>
51 goto 62 (+11)
54 getstatic #25 <java/lang/System.out>
57 ldc #41 <The num is null>
59 invokevirtual #33 <java/io/PrintStream.println>
62 return
十二、JUC原子類
在原子類的原始碼中,涉及到unsafe類的諸多操作;
十三、小數計算精度
不同數值型別間的計算,存在著型別轉換和資訊丟失的問題;
Java不同數值間型別轉換及資訊丟失問題float和double型別的小數計算,會出現精度丟失問題,原因在於十進位制小數在轉換為二進位制小數時的精度問題;
Java中小數計算精度問題
Java中解決精度丟失的常用問題
Java集合系列
相關文章
- Java基礎知識(二)Java
- java基礎語法知識小結(1)Java
- java基礎知識Java
- 初識Java Java基礎知識Java
- tomcat基礎小知識Tomcat
- camera基礎知識二
- 【二】、UML基礎知識
- Java併發程式設計——基礎知識(二)Java程式設計
- Java基礎概念知識Java
- java基礎知識點Java
- Android小知識-Java多執行緒的基礎知識瞭解下AndroidJava執行緒
- Python基礎知識之二Python
- HBase基礎知識分享(二)
- hadoop基礎知識分享(二)Hadoop
- MySQL基礎知識分享(二)MySql
- JavaSE基礎知識分享(二)Java
- Java基礎知識總結Java
- Java基礎知識點梳理Java
- Java併發--基礎知識Java
- Java基礎知識——異常Java
- JAVA基礎知識補漏Java
- MySQL基礎知識小結(一)MySql
- 介面測試--基礎小知識
- salesforce零基礎學習(一百零三)專案中的零碎知識點小總結(五)Salesforce
- Python基礎知識入門(二)Python
- Python入門基礎知識(二)Python
- 《java程式設計基礎》java的基礎知識(三)Java程式設計
- 【Java基礎知識】Java流程控制Java
- java基礎知識-序列化/反序列化-gson基礎知識Java
- salesforce零基礎學習(九十六)專案中的零碎知識點小總結(四)Salesforce
- Java基礎知識點總結Java
- Java基礎知識整理之this用法Java
- Java 基礎面試知識點Java面試
- Java基礎知識篇05——方法Java
- Java入門基礎知識點Java
- Java基礎知識_記憶體Java記憶體
- Java基礎知識面試題Java面試題
- Java代審:Maven基礎知識JavaMaven
- 整理Java基礎知識--Calendar 類Java