作业解析

  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。

    1. public static void main(String[] args) throws Exception {
    2. FileWriter fw = new FileWriter("Test.txt");
    3. int count=0;
    4. for(int i=0;i<=10000000;i++) {
    5. if(count<=1000) {
    6. count++;
    7. fw.write(i+",");
    8. }
    9. else {
    10. fw.write("\r\n");
    11. count=0;
    12. }
    13. }
    14. fw.close();
    15. System.out.println("over");
    16. /*
    17. * 编程实现文本文件的复制。合理设计程序,得到缓冲区的大小的高效区间。
    18. * 提示:缓冲区设置1k开始,不超过10M。
    19. * */
    20. int bufSize=1024;//缓冲区1k开始
    21. long spendTime = 0;//耗费的时间
    22. long minTime = Long.MAX_VALUE;//记录最少耗时
    23. for(int i=1;i<=10*1024;i++) {
    24. long beginTime = System.currentTimeMillis();
    25. copyFile("Test.txt","Test2.txt",i*bufSize);
    26. spendTime = System.currentTimeMillis()-beginTime;
    27. if(spendTime<minTime) {
    28. minTime = spendTime;
    29. System.out.println(i);
    30. }
    31. }
    32. System.out.println(minTime);
    33. System.out.println("over");
    34. }
    35. /*
    36. * 按给定的缓冲区大小,复制文件src到des
    37. */
    38. public static void copyFile(String src,String des,int bufSize) throws Exception {
    39. FileReader fr = new FileReader(src);
    40. FileWriter fw = new FileWriter(des);
    41. char[] buf = new char[bufSize];
    42. int len = -1;
    43. while((len=fr.read(buf))!=-1) {
    44. fw.write(new String(buf,0,len));
    45. }
    46. fw.close();
    47. fr.close();
    48. }
  5. 使用FileWriter,将1-1000000写入到文本中

    1. package com.kokojia.io;
    2. import java.io.FileWriter;
    3. import java.io.IOException;
    4. public class FileWriterDemo {
    5. public static void main(String[] args) {
    6. /**
    7. * 使用FileWriter,将1-1000000写入到文本中
    8. */
    9. FileWriter fw = null;
    10. try {
    11. fw = new FileWriter("h1.txt");
    12. for(int i=1;i<=1000000;i++) {
    13. fw.write(i+",");
    14. }
    15. } catch (IOException e) {
    16. e.printStackTrace();
    17. }
    18. finally {
    19. if(fw!=null) {
    20. try {
    21. fw.close();
    22. } catch (IOException e) {
    23. e.printStackTrace();
    24. }
    25. }
    26. }
    27. System.out.println("over!");
    28. }
    29. }
  6. 变长参数 + 增强for循环

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

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

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

系统属性名是line.separator

windows: \r\n

macOS: \n

字符缓冲区

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

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

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

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

    • read()

      读取一个字符

    • read(char[])

      读取多个字符

      1. read(){
      2. InputStreamReader.read(){
      3. sun.nio.StreamDecoder.read();
      4. }
      5. }
  3. BufferedReader

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

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

      1. public static void main(String[] args) throws Exception {
      2. BufferedReader bufReader = new BufferedReader(new FileReader("d:/foo.txt"));
      3. String line = null;
      4. while((line = bufReader.readLine())!=null) {
      5. System.out.println(line);
      6. }
      7. System.out.println("over");
      8. bufReader.close();
      9. /*
      10. * 使用LineNumberReader读取文件的行号
      11. * 打印输出行号+"."+行内容
      12. */
      13. LineNumberReader lineNumReader = new LineNumberReader(new FileReader("d:/foo.txt"));
      14. while((line=lineNumReader.readLine())!=null) {
      15. int lineNo = lineNumReader.getLineNumber();
      16. System.out.println(lineNo+"."+line);
      17. }
      18. lineNumReader.close();
      19. System.out.println("------------");
      20. /**
      21. * 使用FileReader和BufferedReader读取文本文件,观察消耗时间
      22. */
      23. //非缓冲reader
      24. FileReader fr = new FileReader("d:\\1.txt");
      25. //缓冲reader
      26. BufferedReader br = new BufferedReader(new FileReader("d:\\1.txt"));
      27. //非缓冲循环读取
      28. int len = -1;
      29. //开始时间
      30. long beginTime = System.currentTimeMillis();
      31. while((len=fr.read())!=-1) {
      32. }
      33. //结束时间
      34. long endTime = System.currentTimeMillis();
      35. fr.close();
      36. System.out.println("reader over!花费了时间"+(endTime-beginTime));//42443
      37. //缓冲循环读取
      38. beginTime = System.currentTimeMillis();
      39. while((len=br.read())!=-1) {
      40. }
      41. //结束时间
      42. endTime = System.currentTimeMillis();
      43. br.close();
      44. System.out.println("bufreader over!花费了时间"+(endTime-beginTime));//18654
      45. }
  4. BufferedWriter

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

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

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

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

      1. static char[] buf = null;
      2. static {
      3. buf = new char[8192];
      4. for(int i=0;i<8192;i++) {
      5. buf[i]='a';
      6. }
      7. }
      8. public static void main(String[] args) throws Exception {
      9. PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter("d:/foo.txt")));
      10. out.println("hello word");
      11. out.close();
      12. System.out.println("over");
      13. //非缓冲
      14. FileWriter fw = new FileWriter("d:/1.txt");
      15. //缓冲区
      16. BufferedWriter bw = new BufferedWriter(new FileWriter("d:/2.txt"),1024*1024);
      17. /**************非缓冲区writer操作*******/
      18. //最大次数
      19. int max = 100000;
      20. //开始时间
      21. long startTime = System.currentTimeMillis();
      22. for(int i=0;i<max;i++) {
      23. fw.write(buf);
      24. }
      25. fw.close();
      26. long endTime = System.currentTimeMillis();
      27. System.out.println("wrtier over! 花费了时间:"+(endTime-startTime));
      28. /**************缓冲区writer操作*******/
      29. //开始时间
      30. startTime = System.currentTimeMillis();
      31. for(int i=0;i<max;i++) {
      32. bw.write(buf);
      33. }
      34. bw.close();
      35. endTime = System.currentTimeMillis();
      36. System.out.println("bufwrtier over! 花费了时间:"+(endTime-startTime));
      37. }

内存回收机制

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

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类型的成员变量,对象应方法进行重写时,调用成员变量的方法进行完成。

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

时间单位换算:

1s=1000ms

1ms=1000us

1us=1000ns

juint

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

作业

  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. 制作自己cocoapods库

    https://www.cnblogs.com/czc-wjm/p/5958103.html 今天来讲一下cocoapods制作,网上教程很多,就不再讲理论,直接操作: 1.创建仓库: 2.将仓库克隆 ...

  2. mysql时间比较

    ' and ZXBZ ='Y' AND SQRQ >= '2017-04-28 00:00:00' AND SQRQ <= '2017-04-28 23:59:59'; ;

  3. SpringMVC的各种注解

    @RequestMapping 这个注解标注在方法名上,如 /** * 拦截所有请求: * @RequestMapping(value="/*", method = {Reques ...

  4. 怎么写自己的CMakeLists.txt

    一. 为什么要使用cmake 理论上说,任意一个C++程序都可以用g++来编译.但当程序规模越来越大时,一个工程可能有许多个文件夹和源文件,这时输入的编译命令将越来越长.通常一个小型C++项目可能含有 ...

  5. Win10开机“提示语音”以及”随机播放音乐”

    1.在桌面建立一个.txt文件 2.把一下代码拷贝进去: RandomizeCreateObject("SAPI.SpVoice").Speak"先生,为你播放一首mus ...

  6. (简单)华为Nova青春 WAS-AL00的USB调试模式在哪里开启的流程

    就在我们使用Pc接通安卓手机的时候,如果手机没有开启usb开发者调试模式,Pc则无办法成功检测到我们的手机,在一些情况下,我们使用的一些功能较强的app好比之前我们使用的一个app引号精灵,老版本就需 ...

  7. layui table默认选中指定行

    表格默认选中行,在回调里写入 done: function (res, curr, count) { tableData = res.data; $("[data-field='id']&q ...

  8. Day 1 下午

    POINT 1 贪心 每一步都取当前的最优解的思想:一般来说符合直观思路,需要严格的证明:OI中使用多个错误的贪心策略进行加成有时会有良好的效果 例一给定N个农民,第i个农民有Ai单位的牛奶,单价Pi ...

  9. Django 对接 支付宝支付, 回调

    平台 点击这里进入 蚂蚁金服开放平台 沙箱 点击这里进入 沙箱环境 初始界面 设置公钥 下载创建秘钥工具 1.  进入文档中心 这里 2. 选中 电脑网站支付 3. 进入后选中 API 列表 中的 统 ...

  10. .Net Core实践4 web 反向代理

    目标 将控制台程序改成web程序,通过IIS反向代理,处理请求 环境 win10 / .net core 2.1 / centos7 变成web程序 1.在新建的asp.net core控制台程序中添 ...