BigInteger和BigDecimal

  • 大整数类和大浮点数类

|类型|存储需求|bit数|取值范围|备注|
|-|-|-|-|
|int|4字节|48|-2147483648~2147483647|
|short|2字节|2
8|-32768~32767|
|long|8字节|88|-9223372036854774808~9223372036854774807|
|byte|1字节|1
8|-128~127
|float|4字节|48|float类型的数值有一个后缀F(例如:3.14F)
|double|8字节|8
8|没有后缀F的浮点数值(如3.14)默认为double类型
|char|2字节|28|-|
|boolean|1字节|1
8|false、true|

原码、反码、补码

d3617d2ceb02f6129c9b41361804cbe2_hd-1

  • 原码
    • 用最高位表示符号位,‘1’表示负号,‘0’表示正号
    • byte
      • 0000 0000 表示0
      • 1111 1111 表示-127
      • 1000 0000 表示-128
  • 反码
    • 正数:正数的反码与原码相同。
    • 负数:负数的反码,符号位为“1”,数值部分按位取反
      • [+7]反= 0000 0111
      • [-7]反= 1111 1000
  • 补码
    • 正数:正数的补码和原码相同。
    • 负数:负数的补码则是符号位为“1”。数值部分按位取反后再在末位(最低位)加1
      • [+7]补= 0000 0111
      • [-7]补= 1111 1001
    • 补码的补码就是原码

Byte

  • 1B(byte,字节)= 8 bit

java中为什么十六进制

  • 位操作更直观
    • 0x02 << 4
  • 更节省内存,更好地控制数据长度
  • 二进位制和八进位制、二进位制和十六进位制之间的换算简便。

编码

  • ASCII码
    • 128个字符的编码
  • Unicode
    • 编码方式
    • 容易出现空间浪费
  • UTF-16
    • Java系统默认
    • 全世界每个不同语言的不同字符都统一编码,全球通行
  • UTF-8
    • UTF-8是互联网上使用最广的一种Unicode实现方式,
    • UTF-8编码是变长编码,通常汉字占三个字节,扩展B区以后的汉字占四个字节
    • 文件存储使用UTF-8;内存中使用utf-16;UTF-8 更适合网络传输,对 ASCII 字符采用单字节存储,另外单个字符损坏也不会影响后面其它字符
    • 用几位冗余信息告诉系统,当前字符有没有结束,是不是还需要继续往下读下一个字节
    • 解决原英文字符占用两个字节问题
    • UTF-8对ASCII极佳的兼容性
    • 节约内存的向后兼容ASCII;
    • 单字节上错误兼容更好
  • GBK
    • 编码,一个汉字占两个字节

byte与字符串转换

  • 字符串按照字符分割,每个字符以指定的编码格式转成对应格式的长度数组,utf-8可能是3个字节长度的数组。

字节流与字符流

  • 一个字符=两个字节
  • 在程序中所有的数据都是以流的方式进行传输或保存的,程序需要数据的时候要使用输入流读取数据,而当程序需要将一些数据保存起来的时候,就要使用输出流完成。
  • 程序中的输入输出都是以流的形式保存的,流中保存的实际上全都是字节文件。
  • 字符流处理的单元为2个字节的Unicode字符,分别操作字符、字符数组或字符串,而字节流处理单元为1个字节,操作字节和字节数组。所以字符流是由Java虚拟机将字节转化为2个字节的Unicode字符为单位的字符而成的,所以它对多国语言支持性比较好!如果是音频文件、图片、歌曲,就用字节流好点,如果是关系到中文(文本)的,用字符流好点
  • 字节流可用于任何类型的对象,包括二进制对象,而字符流只能处理字符或者字符串
  • 字节流提供了处理任何类型的IO操作的功能,但它不能直接处理Unicode字符,而字符流就可以