我需要把星期天看的一些東西記錄下來,要不然會忘記。
hashCode、equals:
1)每個java對象都有hashCode和equals方法。
java的終極類是object類,那麼object類是如何來標注自己呢,就是object這個類是如何來區分對方。就是使用它們的hashcode和equals來推斷。
(hashcode是通過hash算法實現的)
2)JVM每new一個object,都會講Object丟到一個Hash(哈希表)裡去,這樣下次比較或者獲取這個對象的時候就可以根據對象的hashcode去這個表來取,可以提高效率。
我們必須知道java是有內存限制的,所以理論上是不可以無限次new的。
先比較hashcode,如果這個鏈表上還有其他數據就用equals。
我們可能會問,那直接使用equals不就得,當然,這是可以的。但是我們要看到hashcode的效率問題,hashcode主要的用途就是減少每次調用equals。
3)關於重寫Hashcode和equals的問題:
一般情況下,我們是不需要重寫這兩個函數的。想Integer Double這類的對象,java已經為我們重寫了這兩個函數,這也是為什麼只要兩個字符串內容一樣他們的equals就是一樣的,按道理不應該,因為equals比較的是對象的引用。
需要重寫的情況:就是當我們使用map裡面的hashmap這類東西的時候,如果我們用自定義類作為鍵值就必須重寫,否則會找不到類。因為類是繼承object的,會使用object的hashcode
所以兩個值一樣的數據,在這裡面就會變成兩個數。
就是使用自定義的key,才需要重寫。
I/O:
File類:可以是文件,也可以是文件目錄。通過File類我們可以獲取文件的一定屬性。
流:這個反正就是一系列數據,我也說不清。
java的輸入輸出:(1)字符輸出、輸入流(Writer、Reader)(2)字節輸出、輸入流。 (InputStream、OutPutStream)
(好像還有stdIO)
區別
(1)讀寫單位不同
字節流以字節(8bit)為單位,字符流以字符為單位,每次讀取的字節就要看采用的字符映射了。
(2)處理對象不同
字節流可以處理所有類型對象(圖片,視頻,文本。。。)
字符流只能是字符類型
注意:字節流是無法直接轉換為字符輸出的,因為讀取的單位不同,可以將數組字節轉換為string了在輸出。
package com.hxw.io;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
public class FileCount {
/**
* 我們寫一個檢測文件長度的小程序,別看這個程序挺長的,你忽略try catch塊後發現也就那麼幾行而已。
*/
publicstatic void main(String[] args) {
//TODO 自動生成的方法存根
int count=0; //統計文件字節長度
InputStreamstreamReader = null; //文件輸入流
try{
streamReader=newFileInputStream(new File("D:/David/Java/java 高級進階/files/tiger.jpg"));
/*1.new File()裡面的文件地址也可以寫成D:\\David\\Java\\java 高級進階\\files\\tiger.jpg,前一個\是用來對後一個
* 進行轉換的,FileInputStream是有緩沖區的,所以用完之後必須關閉,否則可能導致內存占滿,數據丟失。
*/
while(streamReader.read()!=-1) { //讀取文件字節,並遞增指針到下一個字節
count++;
}
System.out.println("---長度是: "+count+" 字節");
}catch (final IOException e) {
//TODO 自動生成的 catch 塊
e.printStackTrace();
}finally{
try{
streamReader.close();
}catch (IOException e) {
//TODO 自動生成的 catch 塊
e.printStackTrace();
}
}
}
}
上面程序每讀取一個自己我都要去用到FileInputStream,我輸出的結果是“---長度是: 64982 字節”,那麼進行了64982次操作!可能想象如果文件十分龐大,這樣的操作肯定會出大問題,所以引出了緩沖區的概念。可以將 streamReader.read()改成streamReader.read(byte[]b)此方法讀取的字節數目等於字節數組的長度,讀取的數據 被存儲在字節數組中,返回讀取的字節數 。 Java I/O默認是不緩沖流的,所謂“緩沖”就是先把從流中得到的一塊字節序列暫存在一個被稱為buffer的內部字節數組裡,然後你可以一下子取到這一整塊的 字節數據,沒有緩沖的流只能一個字節一個字節讀,效率孰高孰低一目了然。有兩個特殊的輸入流實現了緩沖功能,一個是我們常用的 BufferedInputStream.
作者:博客園 郭佳盛哈哈