夜光序言:
僞裝的人 都認爲每個人都在僞裝
正文:
以道御術 / 以術識道
2. Java8 方法概覽
java.time 包下的方法概覽
六、Java 的數據類型
1. Java 的基本數據類型都有哪些各佔幾個字節
如下表所示:
2. String 是基本數據類型嗎?
String 是引用類型,底層用 char 數組實現的。
3. short s1 = 1; s1 = s1 + 1; 有錯嗎?short s1 = 1; s1 += 1 有錯嗎;
前者不正確,後者正確。
對於 short s1 = 1; s1 = s1 + 1;由於 1 是 int 類型
因此 s1+1 運算結果也是 int 型,需要強制轉換類型才能賦值給 short 型。而 short s1 = 1; s1 += 1;
可以正確編譯,因爲 s1+= 1;相當於 s1 = (short)(s1 + 1);其中有隱含的強制類型轉換。
4. int 和 和 Integer 有什麼區別?
Java 是一個近乎純潔的面向對象編程語言,但是爲了編程的方便還是引入了基本數據類型,爲了能夠將這些基本數據類型當成對象操作,Java 爲每一個基本數據類型都引入了對應的包裝類型(wrapper class)
int 的包裝類就是 Integer,從 Java 5 開始引入了自動裝箱/拆箱機制,使得二者可以相互轉換。
Java 爲每個原始類型提供了包裝類型:
- 原始類型: boolean,char,byte,short,int,long,float,double
- 包裝類型:Boolean,Character,Byte,Short,Integer,Long,Float,Double
5. 下面 Integer 類型的數值比較輸出的結果爲?
如果不明就裏很容易認爲兩個輸出要麼都是 true 要麼都是 false。
首先需要注意的是 f1、f2、f3、f4 四個變量都是 Integer 對象引用,所以下面的==運算比較的不是值而是引用。
裝箱的本質是什麼呢?
當我們給一個 Integer 對象賦一個 int 值的時候,會調用 Integer 類的靜態方法 valueOf,如果看看 valueOf 的源代碼就知道發生了什麼。
源碼:
簡單的說,如果整型字面量的值在-128 到 127 之間,那麼不會 new 新的 Integer 對象,而是直接引用常量池中的 Integer 對象,
所以上面的試題中 f1==f2 的結果是 true,而 f3==f4 的結果是 false。
7. String、StringBuffer、StringBuilder 的區別?
(1)、可變不可變
String:字符串常量,在修改時不會改變自身;若修改,等於重新生成新的字符串對象。
StringBuffer:在修改時會改變對象自身,每次操作都是對 StringBuffer 對象本身進行修改,不是生成新的對象;使用場景:對字符串經常改變情況下,主要方法:append(),insert()等。
(2)、線程是否安全
String:對象定義後不可變,線程安全。
StringBuffer:是線程安全的(對調用方法加入同步鎖),執行效率較慢,適用於多線程下操作字符串緩衝區大量數據。
StringBuilder:是線程不安全的,適用於單線程下操作字符串緩衝區大量數據。
(3)、共同點
StringBuilder 與 StringBuffer 有公共父類 AbstractStringBuilder(抽象類)。
StringBuilder、StringBuffer 的方法都會調用 AbstractStringBuilder 中的公共方法,如 super.append(...)。
只是 StringBuffer 會在方法上加 synchronized 關鍵字,進行同步。
最後,如果程序不是多線程的,那麼使用 StringBuilder 效率高於 StringBuffer。
8. 數據類型之間的轉換
(1)、字符串如何轉基本數據類型?
調用基本數據類型對應的包裝類中的方法 parseXXX(String)或 valueOf(String)即可返回相應基本類型。
(2)、基本數據類型如何轉字符串?
一種方法是將基本數據類型與空字符串(“”)連接(+)即可獲得其所對應的字符串;另一種方法是調用 String 類中的 valueOf()方法返回相應字符串。
七、Java 的 IO
1. Java 中有幾種類型的流
按照流的方向:輸入流(inputStream)和輸出流(outputStream)。
按照實現功能分:節點流(可以從或向一個特定的地方(節點)讀寫數據。如 FileReader)和處理流(是對一個已存在的流的連接和封裝,通過所封裝的流的功能調用實現數據讀寫。
如 BufferedReader。處理流的構造方法總是要帶一個其他的流對象做參數。一個流對象經過其他流的多次包裝,稱爲流的鏈接。)
按照處理數據的單位:字節流和字符流。
字節流繼承於 InputStream 和 OutputStream,字符流繼承於InputStreamReader 和 OutputStreamWriter。
2. 字節流如何轉爲字符流
字節輸入流轉字符輸入流通過 InputStreamReader 實現,該類的構造函數可以傳入 InputStream 對象。
字節輸出流轉字符輸出流通過 OutputStreamWriter 實現,該類的構造函數可以傳入 OutputStream 對象。
3. 如何將一個 java 對象序列化到文件裏
在 java 中能夠被序列化的類必須先實現 Serializable 接口,該接口沒有任何抽象方法只是起到一個標記作用。
1. //對象輸出流
2. ObjectOutputStream objectOutputStream =
3. new ObjectOutputStream(new FileOutputStream(new File("D://obj")));
4. objectOutputStream.writeObject(new User("zhangsan", 100));
5. objectOutputStream.close();
6. //對象輸入流
7. ObjectInputStream objectInputStream =
8. new ObjectInputStream(new FileInputStream(new File("D://obj")));
9. User user = (User)objectInputStream.readObject();
10. System.out.println(user);
11. objectInputStream.close();