程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> java 小結3:hashcode和equals I/o問題

java 小結3:hashcode和equals I/o問題

編輯:關於JAVA

我需要把星期天看的一些東西記錄下來,要不然會忘記。

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.

作者:博客園 郭佳盛哈哈

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved