牛客网Java错题总结(8)

目录

一、byte数据存储

二、yield()方法

三、三元操作运算符

四、处理流


一、byte数据存储

解析:

本题考查的是数据类型的转换:

129用int类型表示为4个字节,其二进制为: 00000000 00000000 00000000 10000001

在计算机系统中,数值一律用补码来表示(存储),正数的补码和原码相同

  1. int 转换为 byte(1个字节),截取: 10000001
  2. 补码转反码,补码-1为反码: 10000000
  3. 反码变原码,符号位不变,其他位取反:11111111
  4. 11111111的原码对应的十进制数即为-127

二、yield()方法

解析:

Thread.yield()方法作用是:暂停当前正在执行的线程对象,并执行其他线程。

yield()应该做的是让当前运行线程回到可运行状态,以允许具有相同优先级的其他线程获得运行机会。

因此,使用yield()的目的是让相同优先级的线程之间能适当的轮转执行。但是,实际中无法保证yield()达到让步目的,因为让步的线程还有可能被线程调度程序再次选中。

结论:yield()从未导致线程转到等待/睡眠/阻塞状态。在大多数情况下,yield()将导致线程从运行状态转到可运行状态,但有可能没有效果。

因为没有其他线程,所以yield之后就接着执行后面的语句了

三、三元操作运算符

解析:

三元运算符会对两个结果的数据类型,进行自动的类型提升。

因此,可以把

Object o1 = true ? new Integer(1) : new Double(2.0);

看作

Object o1 = true ? new Double(1.0) : new Double(2.0);

三元操作符类型的转换规则如下:

  1. 若两个操作数不可转换,则不做转换,返回值为Object类型。
  2. 若两个操作数是明确类型的表达式(比如变量),则按照正常的二进制数字来转换,int类型转换为long类型,long类型转换为float类型等。
  3. 若两个操作数中有一个是数字S,另外一个是表达式,且其类型标示为T,那么,若数字S在T的范围内,则转换为T类型;若S超出了T类型的范围,则T转换为S类型。
  4. 若两个操作数都是直接量数字(Literal),则返回值类型为范围较大者。

四、处理流

解析:

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

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

JAVA常用的节点流:

  • 文件:FileInputStream、FileOutputStream、FileReader、FileWriter,对文件进行处理的节点流。
  • 字符串:StringReader、StringWriter,对字符串进行处理的节点流。
  • 数组:ByteArrayInputStream、ByteArrayOutputStream、CharArrayReader、CharArrayWriter,对数组进行处理的节点流(对应的不再是文件,而是内存中的一个数组)。
  • 管道:PipedInputStream、PipedOutputStream、PipedReaderPipedWriter,对管道进行处理的节点流。

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

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

流的关闭顺序

  1. 一般情况下是:先打开的后关闭,后打开的先关闭
  2. 另一种情况:看依赖关系,如果流a依赖流b,应该先关闭流a,再关闭流b。例如,处理流a依赖节点流b,应该先关闭处理流a,再关闭节点流b
  3. 可以只关闭处理流,不用关闭节点流。处理流关闭的时候,会调用其处理的节点流的关闭方法。

猜你喜欢

转载自blog.csdn.net/weixin_39478524/article/details/115103782