作业解析

  1. 描述HashMap内部实现原理

    HashMap是一种存储机制,存储的是key-value对,key用来保证元素的唯一性。通过hash算法将要存储的对象打散,分布在不同的区间中。

    • 当添加对象时,先得到该对象的hashcode,通过hashcode定位到将要存储的区间上,然后将区间中原有的元素依次与该对象进行比对,比对原则有三个:hashcode是否相同、是否是同一对象、equals方法是否返回true。如果没有元素与之相同,则添加到该区间元素的末尾
    • 通过key查询时,先得到key对应的hashcode, 然后定位到所在区间,简化了查询,最后按照上述的三个原则进行比对
  2. List Set Map区别

    • List

      ArrayList: 有序,可重复,线程不安全

      LinkedList: 手拉手,线程不安全

      Vector: 线程安全

    • Set

      HashSet: 不可重复,无序,使用键值对存储机制

      TreeSet: 通过实现Comparable接口实现排序,或者包装一个对比器Comparator

    • Map

      HashMap: 键值对,不可重复

      HashTable: 线程安全

  3. 描述HashSet和HashMap的区别

    HashSet集合内部是通过HashMap进行实现的。使用的是HashMap中key部分。对象在添加进集合中时,首选会对hashcode进行处理(hashcode右移16位和自身做异或运算)得到一个经过处理的hash值,然后该值和集合的容量进行&运算,得到介于0和集合容量值之间一个数字。该数字表示着数组的下标。也就是该元素应该存放在哪个集合中。然后按照hashcode1()==hashcode2() && (是否同一对象 || equals() )与集合中已有元素进行对比,如果没有相同的元素,则添加该元素。

  4. 编程实现文本文件的复制。合理设计程序,得到缓冲区的大小的高效区间。

    提示缓冲区设置1k开始,不超过10M。

     public static void main(String[] args) throws Exception {
    
         FileWriter fw = new FileWriter("Test.txt");
    int count=0;
    for(int i=0;i<=10000000;i++) {
    if(count<=1000) {
    count++;
    fw.write(i+",");
    }
    else {
    fw.write("\r\n");
    count=0;
    }
    }
    fw.close();
    System.out.println("over"); /*
    * 编程实现文本文件的复制。合理设计程序,得到缓冲区的大小的高效区间。
    * 提示:缓冲区设置1k开始,不超过10M。
    * */ int bufSize=1024;//缓冲区1k开始
    long spendTime = 0;//耗费的时间
    long minTime = Long.MAX_VALUE;//记录最少耗时
    for(int i=1;i<=10*1024;i++) {
    long beginTime = System.currentTimeMillis();
    copyFile("Test.txt","Test2.txt",i*bufSize);
    spendTime = System.currentTimeMillis()-beginTime;
    if(spendTime<minTime) {
    minTime = spendTime;
    System.out.println(i);
    }
    }
    System.out.println(minTime);
    System.out.println("over");
    }
    /*
    * 按给定的缓冲区大小,复制文件src到des
    */
    public static void copyFile(String src,String des,int bufSize) throws Exception {
    FileReader fr = new FileReader(src);
    FileWriter fw = new FileWriter(des);
    char[] buf = new char[bufSize];
    int len = -1;
    while((len=fr.read(buf))!=-1) {
    fw.write(new String(buf,0,len));
    }
    fw.close();
    fr.close();
    }
  5. 使用FileWriter,将1-1000000写入到文本中

     package com.kokojia.io;
    
     import java.io.FileWriter;
    import java.io.IOException; public class FileWriterDemo { public static void main(String[] args) {
    /**
    * 使用FileWriter,将1-1000000写入到文本中
    */
    FileWriter fw = null;
    try {
    fw = new FileWriter("h1.txt");
    for(int i=1;i<=1000000;i++) {
    fw.write(i+",");
    }
    } catch (IOException e) {
    e.printStackTrace();
    }
    finally {
    if(fw!=null) {
    try {
    fw.close();
    } catch (IOException e) {
    e.printStackTrace();
    }
    }
    }
    System.out.println("over!");
    }
    }
  6. 变长参数 + 增强for循环

     package com.kokojia.io;
    
     public class AvgParAndForDemo {
    
         public static void main(String[] args) {
    /**
    * 变长参数 + 增强for循环练习
    */
    OutString("a","b","123","中国"); } //变长参数只能有一个,且必须是最后一位形参
    private static void OutString(String...str) {
    for(String s: str) {
    System.out.println(s);
    }
    } }

行分隔符在java中可以通过方法得到

System.getProperty("line.separator"); //执行 系统属性名

系统属性名是line.separator

windows: \r\n

macOS: \n

字符缓冲区

  1. FileWriter没有缓冲区功能,本身没有新增任何功能,继承的OutputStreamWriter

    • 等级树结构:Object ---> Writer ---> OutputStreamWriter ---> FileWriter

        writer(){
      //直接写入数据到文件中
      sun.nio.cs.StreamEncoder.write();
      }
  2. FileReader

    • 继承关系树:Object ---> Reader ---> InputStreamReader ---> FileReader

    • read()

      读取一个字符

    • read(char[])

      读取多个字符

        read(){
      InputStreamReader.read(){
      sun.nio.StreamDecoder.read();
      }
      }
  3. BufferedReader

    • 等级树结构:Object ---> Reader ---> BufferedReader ---> LineNumberReader

        read(){
      char[] cbuf = ... ;
      cbuf[xxx] = c;
      return c;
      }
    • 避免对物理文件的频繁访问

        public static void main(String[] args) throws Exception {
      BufferedReader bufReader = new BufferedReader(new FileReader("d:/foo.txt"));
      String line = null;
      while((line = bufReader.readLine())!=null) {
      System.out.println(line);
      }
      System.out.println("over");
      bufReader.close(); /*
      * 使用LineNumberReader读取文件的行号
      * 打印输出行号+"."+行内容
      */
      LineNumberReader lineNumReader = new LineNumberReader(new FileReader("d:/foo.txt"));
      while((line=lineNumReader.readLine())!=null) {
      int lineNo = lineNumReader.getLineNumber();
      System.out.println(lineNo+"."+line);
      }
      lineNumReader.close();
      System.out.println("------------"); /**
      * 使用FileReader和BufferedReader读取文本文件,观察消耗时间
      */
      //非缓冲reader
      FileReader fr = new FileReader("d:\\1.txt");
      //缓冲reader
      BufferedReader br = new BufferedReader(new FileReader("d:\\1.txt")); //非缓冲循环读取
      int len = -1;
      //开始时间
      long beginTime = System.currentTimeMillis();
      while((len=fr.read())!=-1) {
      }
      //结束时间
      long endTime = System.currentTimeMillis();
      fr.close();
      System.out.println("reader over!花费了时间"+(endTime-beginTime));//42443 //缓冲循环读取
      beginTime = System.currentTimeMillis();
      while((len=br.read())!=-1) {
      }
      //结束时间
      endTime = System.currentTimeMillis();
      br.close();
      System.out.println("bufreader over!花费了时间"+(endTime-beginTime));//18654
      }
  4. BufferedWriter

    • 对Writer进行包装,里面定义缓冲区,提供写入单个字符、char[]、String方法,提高写入效率

    • 等级树结构:Object ---> Writer ---> BufferedWriter

    • flushBuffer(): 清理缓冲区,将缓冲区数据写入目的地

    • close()方法: 包含flushBuffer()动作

           static char[] buf = null;
      static {
      buf = new char[8192];
      for(int i=0;i<8192;i++) {
      buf[i]='a';
      } }
      public static void main(String[] args) throws Exception { PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter("d:/foo.txt")));
      out.println("hello word");
      out.close();
      System.out.println("over"); //非缓冲
      FileWriter fw = new FileWriter("d:/1.txt");
      //缓冲区
      BufferedWriter bw = new BufferedWriter(new FileWriter("d:/2.txt"),1024*1024); /**************非缓冲区writer操作*******/
      //最大次数
      int max = 100000;
      //开始时间
      long startTime = System.currentTimeMillis();
      for(int i=0;i<max;i++) {
      fw.write(buf);
      }
      fw.close();
      long endTime = System.currentTimeMillis();
      System.out.println("wrtier over! 花费了时间:"+(endTime-startTime)); /**************缓冲区writer操作*******/
      //开始时间
      startTime = System.currentTimeMillis();
      for(int i=0;i<max;i++) {
      bw.write(buf);
      }
      bw.close();
      endTime = System.currentTimeMillis();
      System.out.println("bufwrtier over! 花费了时间:"+(endTime-startTime));
      }

内存回收机制

堆中的对象只有在没有引用时才会释放

byte[] bytes = new byte[1023][1024][1024];

byte[] b2 = bytes ;

.

.

.

.

bytes = null ;

几个重要的函数

  1. flush() //清理

  2. refresh() //刷新

  3. clear() //清空

字节流

  1. OutputStream

    • 输出流
    • FileOutputStream
    • 等级树: Object ---> OutputStream --->FileOutputStream
  2. InputStream
    • 输入流
    • FileInputStream
    • 等级树:Object ---> InputStream --->FileInputStream

装饰模式:decorator

实现方式: Buffered 类继承Writer类,在类中添加Writer类型的成员变量,对象应方法进行重写时,调用成员变量的方法进行完成。

 class BufferedWriter extends Writer{
Writer out;
char[] cb = new char[8192];
public void writer(String str){
//1.先将数据写入缓冲区
cb.xxx
//2.如果cb已满,再写入到out中
} public void close(){
//1.清理cb
//2.关闭out
}
}

时间单位换算:

1s=1000ms

1ms=1000us

1us=1000ns

juint

  1. 单元测试框架
  2. 方便进行测试时使用
  3. 方法签名
import org.juint.Text
@Test
public void xxx(){
}

作业

  1. 阐述BufferedReader和BufferedWriter的工作原理,

    是否缓冲区读写器的性能恒大于非缓冲区读写器的性能,为什么,请举例说明?

  2. 写入数据1~1000000数字到文件中,分别使用FileWriter和BufferedWriter实现,考察其效率的不同

  3. 文件切割:

    把较大的文件切割成20k一个的小文件

  4. 文件合成:

    把小文件合并成大文件

  5. 文件归档解档:

    0=txt,1=jpg,2=avi,3=gif

  6. Charset类操作: isSupport()

    • 通过该类验证平台是否支持一下字符集:

      gb2312

      GB2312

      gbk

      GBK

      utf-8

      utf8

      iso8859-1

      iso-8859-1

    • 取出平台默认的字符集

  7. FileReader.getEncoding();

    new String(,,,,,charset);

  8. 使用FileInputStream + FileOutputStream / BufferedInputStream + BufferedOuputStream

    实现大文件复制,比较复制效率。

  9. 阐述对象回收的前提条件。

Java基础13-字符串缓冲流;字节流的更多相关文章

  1. Java基础13:反射与注解详解

    Java基础13:反射与注解详解 什么是反射? 反射(Reflection)是Java 程序开发语言的特征之一,它允许运行中的 Java 程序获取自身的信息,并且可以操作类或对象的内部属性. Orac ...

  2. java基础10(IO流)-字节流

    IO流 输入与输出[参照物是程序] 如果从键盘.文件.网络甚至是另一个进程(程序或系统)将数据读入到程序或系统中,称为输入 如果是将程序或系统中的数据写到屏幕.硬件上的文件.网络上的另一端或者是一个进 ...

  3. Java基础系列8——IO流超详细总结

    该系列博文会告诉你如何从入门到进阶,一步步地学习Java基础知识,并上手进行实战,接着了解每个Java知识点背后的实现原理,更完整地了解整个Java技术体系,形成自己的知识框架. 在初学Java时,I ...

  4. Java基础之详谈IO流

    Java基础知识.IO流详细讲解.你所要的IO这里都有

  5. java基础11(IO流)-字符流

    转换流 由于字节流操作中文不是特别方便,所以java中提供了转换流 编码表:由现实世界的字符和对应的数值组成的一张表 编码:把看得懂的变成看不懂的(String-------byte[]) 解码:把看 ...

  6. Java基础之I/O流

    一.数据流的基本概念 数据流是一串连续不断的数据的集合,就象水管里的水流,在水管的一端一点一点地供水,而在水管的另一端看到的是一股连续不断的水流.数据写入程序可以是一段.一段地向数据流管道中写入数据, ...

  7. Java基础之(IO流)

    简介: 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输特性将流抽象为各种类,方便更直观的进行数据操作. 一.File ...

  8. java 21 - 6 字符缓冲流的特殊方法以及该方法高效复制文件

    字符缓冲流的特殊方法: A.BufferedWriter: public void newLine():根据系统来决定换行符 private static void write() throws IO ...

  9. 6.3(java学习笔记)缓冲流

    一.缓冲流 使用缓冲流后的输入输出流会先存储到缓冲区,等缓冲区满后一次性将缓冲区中的数据写入或取出. 避免程序频繁的和文件直接操作,这样操作有利于提高读写效率. 缓冲流是构建在输入输出流之上的,可以理 ...

  10. Java基础12一IO流

    1.IO流的原理 利用数据通道实现程序和数据源之间数据的的读写操作.  2.IO流分类 输入流.输出流.字节流.字符流.节点流.过滤流  3.InputStream 字节输入流 实现类FileInpu ...

随机推荐

  1. 折半、快排、插入排序的Java实现

    插入排序 import java.util.Arrays; public class InsertionSort { /** * 对数组里面进行插入排序 * 参数1 数组 * 参数2 数组大小 */ ...

  2. ora-14400:插入的分区关键字未映射到任何分区

    参考:https://blog.csdn.net/rubychen410/article/details/5317553 出现该问题是由于: 1.为表设置了根据时间进行分区(PARTITION),而每 ...

  3. 关于 Be 主

    大三在校生 每天不定刷 Leetcode POJ HDU 以及其他算法专题 自己很菜 还没有能力可以帮助别的旁友解决问题 :-( 毕竟有个人每天看着你写代码还是很幸福的事情呢 还是要骄傲夸一下 FH ...

  4. laravel 开启定时任务需要操作

    1.在xshell 中 crontab -e //编辑任务crontab -l //查看执行中的任务列表 2.在打开的任务中: /home/wwwroot/default 换为自己项目的根路径 vag ...

  5. [转]html5监听任何App自带返回键javascript事件

    1.前言 如今h5新特性.新标签.新规范等有很多,而且正在不断完善中,各大浏览器商对它们的支持,也是相当给力.作为前端程序员,我觉得我们还是有必要积极关注并勇敢地加以实践.接下来我将和各位分享一个特别 ...

  6. icpc 南昌邀请赛网络赛 Max answer

    就是求区间和与区间最小值的积的最大值 但是a[i]可能是负的 这就很坑 赛后看了好多dalao的博客 终于a了 这个问题我感觉可以分为两个步骤 第一步是对于每个元素 以它为最小值的最大区间是什么 第二 ...

  7. Docker常用镜像

    Docker,具有快捷方便的特性,机器上不需要安装软件和进行各种配置,拉取镜像,一行命令即可启动服务,不使用时,一行命令关闭容器即可,快捷方便,干净.利索.建议将本地的redis.mysql.kafk ...

  8. python并发编程之多进程基础知识点

    1.操作系统 位于硬件与应用软件之间,本质也是一种软件,由系统内核和系统接口组成 和进程之间的关系是: 进程只能由操作系统创建 和普通软件区别: 操作系统是真正的控制硬件 应用程序实际在调用操作系统提 ...

  9. [十二省联考2019]异或粽子(堆+可持久化Trie)

    前置芝士:可持久化Trie & 堆 类似于超级钢琴,我们用堆维护一个四元组\((st, l, r, pos)\)表示以\(st\)为起点,终点在\([l, r]\)内,里面的最大值的位置为\( ...

  10. jmeter笔记(8)--关联

    关联是jmeter中比较重要的一个点,在测试过程中有些数据是经常发生变化的,要获取这些数据,就需要使用关联,Jmeter可以通过“后置处理器”中的“正则表达式提取器”来处理关联.. 正则表达式提取器 ...