zoukankan      html  css  js  c++  java
  • 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.

  • 相关阅读:
    委托、Lamda表达式
    springcloud-feign的hystrix支持
    springcloud-断路器hystrix
    Java原子性、可见性、内存模型
    volatile特性
    synchronized实现可见性
    Js四则运算精度问题处理
    docker 简单安装java web项目
    elasticsearch 分布式集群搭建
    logstash-input-jdbc同时同步多个表
  • 原文地址:https://www.cnblogs.com/GuoJiaSheng/p/3905752.html
Copyright © 2011-2022 走看看