Java基础查缺补漏03(附赠哈夫曼树&哈夫曼编码)

继续我的复习刷题

构造器显式调用父类构造方法的规则

题目:

以下程序的输出结果为

class Base{
    public Base(String s){
        System.out.print("B");
    }
}
public class Derived extends Base{
    public Derived (String s) {
        System.out.print("D");
    }
    public static void main(String[] args){
        new Derived("C");
    }
}

A. BD
B. DB
C. C
D. 编译错误

正确答案: D 你的答案: A (错误)


这道题其实没什么特别的,就是之前对这个规则不熟悉:

在子类的构造方法中,必须调用父类的构造方法,如果没有显示地调用,编译器会在第一行添加一个父类的无参构造方法,但是如果父类重载了构造方法导致没有无参的构造方法,子类就必须在构造方法中显示地调用父类的构造方法,否则就会报错。

IO流分为节点流和处理流

题目:

下列流当中,属于处理流的是:()

A. FileInputStream
B. InputStream
C. DataInputStream
D. BufferedInputStream

正确答案: C D 你的答案: A C (错误)


这道题选错是不知道节点流和处理流是什么。原来IO流可以这样分类:(来自牛客网用户:无情的AC机器)

按照流是否直接与特定的地方(如磁盘、内存、设备等)相连,分为节点流和处理流两类。

  • 节点流:可以从或向一个特定的地方(节点)读写数据。如FileReader.
  • 处理流:是对一个已存在的流的连接和封装,通过所封装的流的功能调用实现数据读写。如BufferedReader.处理流的构造方法总是要带一个其他的流对象做参数。一个流对象经过其他流的多次包装,称为流的链接。

JAVA常用的节点流:
+ 文 件 FileInputStreamFileOutputStreanFileReaderFileWriter。文件进行处理的节点流。
+ 字符串 StringReaderStringWriter。对字符串进行处理的节点流。
+ 数 组:ByteArrayInputStreamByteArrayOutputStreamCharArrayReaderCharArrayWriter。对数组进行处理的节点流(对应的不再是文件,而是内存中的一个数组)。
+ 管 道:PipedInputStreamPipedOutputStreamPipedReaderPipedWriter。对管道进行处理的节点流。

常用处理流(关闭处理流使用关闭里面的节点流)

  • 缓冲流:BufferedInputStreamBufferedOutputStreamBufferedReaderBufferedWriter。增加缓冲功能,避免频繁读写硬盘。
  • 转换流:InputStreamReaderOutputStreamReader。实现字节流和字符流之间的转换。
  • 数据流:DataInputStreamDataOutputStream等。提供将基础数据类型写入到文件中,或者读取出来.

如何通过反射获取和设置对象私有字段的值

这个倒不是刷题刷出来的,就是整理知识点的时候对这个API有点不太熟练,这里复习一下:

Java基础查缺补漏03(附赠哈夫曼树&哈夫曼编码)

我相信这个思维导图已经概括得很详细了(这只是我复习中整理的一小部分,等我把整个java体系复习完了把整个思维导图分享出来)

下面上代码说明:

class Security{
    private int num = 10;
    private int getNum(){
        return num;
    }
}

public class TestReflect {
    public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException, NoSuchMethodException, InvocationTargetException {
        Security security = new Security();
        // 获取字段
        Field num = security.getClass().getDeclaredField("num");
        // 设置访问权限
        num.setAccessible(true);
        // 修改值
        num.set(security, 5);

        Method getNum = security.getClass().getDeclaredMethod("getNum");
        getNum.setAccessible(true);
        Object invoke = getNum.invoke(security);
        System.out.println(invoke);
    }
}

这段代码中还有一个知识点:getNum方法返回的是基本类型int,但invoke只能返回一个Object对象,它会自动把int类型装箱,即变成Integer类型返回,因此是可以输出的。

哈夫曼树&哈夫曼编码

哈哈越扯越偏了,这里顺便放一个数据结构的知识点上来,这个不太想单独写一篇博客。

哈夫曼树,就是使带权外部路径长度最小(课本上这样说的)的一种二叉树。

至于如何计算这个带权外部路径:

  1. 所有外部节点(叶子节点)带有一个权值
  2. 每个外部节点乘以其到根节点的路径长之和,就是该树的带权外部路径长度。

如何构造一个哈夫曼树:

  1. 将所有外部节点按权值大小从小到大排序,组成一个有序链表
  2. 取出前两个节点,将它们的值相加,得到一个新的权值,用它构造一个新的节点,同时是这两个节点的父节点,然后把这个新的节点按值的大小插入链表中
  3. 重复第二步,直到组成一棵树

我不太想画图,累了0v0(复习哪有时间认真写博客)

注意哈夫曼树是一种满二叉树(满二叉树这个定义有争议,我这里的定义就是除了叶子节点所有的节点的度都为2),即不包含度为1的节点。

然后哈夫曼树有一个应用就是哈夫曼编码,左边的出度取0,右边的出度取1。从根节点到叶子节点路径上的0、1值组成的就是哈夫曼编码。

原创文章,作者:彭晨涛,如若转载,请注明出处:https://www.codetool.top/article/java%e5%9f%ba%e7%a1%80%e6%9f%a5%e7%bc%ba%e8%a1%a5%e6%bc%8f03%ef%bc%88%e9%99%84%e8%b5%a0%e5%93%88%e5%a4%ab%e6%9b%bc%e6%a0%91%e5%93%88%e5%a4%ab%e6%9b%bc%e7%bc%96%e7%a0%81%ef%bc%89/

(0)
彭晨涛彭晨涛管理者
上一篇 2020年5月27日
下一篇 2020年5月28日

相关推荐

  • 深入理解java虚拟机第三版读书笔记10

    以下是第十章 前端编译与优化的内容 Java中的编译可能是指: 前端编译:把*.java文件转变成*.class文件的过程 即时编译(JIT):运行期把字节码转变成…

    Java 2020年1月25日
    0110
  • Java8避免空指针异常Optional类的使用

    最近都是一天写一篇算法题解,好久没有写过博客了,不知道写啥了而且快到期末考试了。。 今天介绍一个Java8的特性:Optional类,这个类我平时也不咋用,今天来研究一下。 Opt…

    Java 2020年6月3日
    0650
  • leetcode225--用队列实现栈

    原题 使用队列实现栈的下列操作: push(x) – 元素 x 入栈 pop() – 移除栈顶元素 top() – 获取栈顶元素 empty() – 返回栈是否为空 注意: 你只能…

    算法 2019年12月13日
    0100
  • CountDownLatch及CyclicBarrier源码分析

    之前写的一篇博客JUC包下的线程协作计数CountDownLatch及CyclicBarrier只是介绍了一下这两个工具类的用法,并没有深入探究源码,然而实现方法也比较简单,所以合…

    Java 2020年5月22日
    0140
  • JUC包下的信号量Semaphore

    概述 信号量,用来限制能同时访问共享资源的线程上限。 public static void main(String[] args) { // 1. 创建 semaphore 对象 …

    Java 2020年2月6日
    0180
  • Java多线程基础

    多线程应用 异步调用 以调用方角度来讲,如果+ 需要等待结果返回,才能继续运行就是同步+ 不需要等待结果返回,就能继续运行就是异步 同步在多线程中还有另外一个意思,是让多个线程步调…

    2020年1月31日
    0330
  • leetcode385-迷你语法分析器

    原题 给定一个用字符串表示的整数的嵌套列表,实现一个解析它的语法分析器。 列表中的每个元素只可能是整数或整数嵌套列表 提示: 你可以假定这些字符串都是格式良好的: 字符串非空 字符…

    算法 2020年1月28日
    02240
  • 网络编程之AIO

    AIO介绍 AIO是JDK1.7引入的,也称为NIO 2.0 NIO的同步非阻塞类似于轮询,让Selector去询问各个通道的状态。 而AIO则是通过Future实现真正的异步,让…

    Java 2020年2月8日
    0280
  • 深入理解java虚拟机第三版读书笔记06

    附: Java虚拟机规范-Class文件格式:JDK8 Java虚拟机规范-Class文件格式:JDK13 以下是第六章 类文件结构的内容 Class类文件的结构 Class文件是…

    Java 2020年1月18日
    0160
  • 基于BIO模型实现多人聊天室

    第一版 服务端实现: public class ChatServer { private int DEFAULT_PORT = 8888; private final String…

    Java 2020年2月6日
    0380

发表回复

登录后才能评论