java 小结3:hashcode和equals I/o问题
我需要把礼拜天看的一些对象记录下来,要否则会健忘。
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.
作者:博客园 郭佳盛哈哈