从新开始学JAVA - 数据类型6

数据类型

Java的数据类型有两大类

  • 基本类型(primitive type)
    • 基本类型都属于关键字
    • 基本类型的默认值为:
      • 整数:0
      • 浮点数:0.0
      • 布尔值:false
  • 引用类型(reference type)
    • 接口
    • 数组
    • 非基本类型的默认值全部是null

具体分类

基本类型又可以细分为以下类型

  • 数值类型
    • 整数类型
      • byte
        • 占1个字节
        • 范围:-128127(2(-7)~27-1)
      • short
        • 占2个字节
        • 范围:-3276832767(2(-15)~215-1)
      • int
        • 占4个字节
        • 范围:-21474836482147483647(2(-8)~28-1)
      • long
        • 占8个字节
        • 范围:-92233720368547758089223372036854775807(2(-63)~263-1)
        • 因为这个类型数值太大,所以一般如果使用了long,则会在数值最后加一个L或者l,例如long number = 30L(或者30l);
    • 浮点类型
      • float
        • 占4个字节
        • 一般如果使用了float,则会在数值最后加一个F或者f,例如float number = 50.1F(或者50.1f);
      • double
        • 占8个字节
    • 字符类型
      • char
        • 占2个字节
        • 注意这里是字符,不是字符串,所以只能一个字符,例如char name = 'a';,如果是char name = 'ab';那么就会报错。中文则是一个字就可以,两个或者以上的字就不行。符号则是一个符号就可以,两个或者以上就报错,例如char name = '+';就可以
        • 字符串(String)是一个类,不是基本类型,也不是关键字,属于引用类型
        • char使用单引号'String使用双引号"
  • 布尔类型(boolean)
    • 占1位(1 bit),因为其数值只有truefalse

补充

  • 所有的基本类型名字都是小写字母,所有的其他类型名字都是首字母大写,例如charString
  • 有一些基本类型会有对应的封装类,例如Boolean就是基本类型boolean的封装类,具有属性和方法,是基本类型的实例化对象
    • 基本类型都不可以用new来声明或者初始化,但其他类型的类可以,例如Boolean flag = new Boolean("true");,但不能boolean flag = new boolean("true");
  • 位(bit):是计算机内部数据储存中最小单位,1位就能存储计算机语言中的一个0或者1。例如11001100是一个八位二进制数。一般用b表示
  • 字节(byte):1个byte(字节)即为8个bit(位),是计算机中处理数据的基本单位,一般用B表示。1B = 8b
  • 电脑参数中经常提到的32位系统、64位系统,指的就是计算机的CPU单次可以处理数据的量,64位电脑表示该电脑单次可以处理8B(8byte,即64bit)的数据。高位电脑可以向下兼容(安装32位的软件、系统),但低位电脑不能向上兼容。主要区别如下
    • 寻址能力不同:寻址能力简单点说就是支持的内存大小能力,64位系统最多可以支达128 GB的内存,而32位系统最多只可以支持4G内存
    • 运算速度不同: 32位处理器一次只能处理4个字节的量,而64位一次可以提取64位数据,也就是8个字节的量,比32位提高了1倍
    • 兼容性不同:32位操作系统只可以安装使用32位架构设计的软件,而64位的CPU既可以安装使用32位软件也可以安装使用64位软件
  • 上面的整数类型中,byte占用1个字节,即8bit,所以系统会分配8个位置来储存这个数(例如00000001、01010010)。而计算机中,我们规定首位为符号位,即1代表负数,0代表正数,所以实际上只有7个位置来表达这个数的大小,所以范围是-128~127(2(-7)~27-1)。同理,short占2个字节,所以系统分配了16个位置来储存,而首位是符号位,所以数的大小的范围是-32768~32767(2(-15)~215-1)
  • 因为0这个数在二进制中是0000,但因为计算机规定了首位是符号位,所以就算我们人为定义0既不是正数,也不是负数,但在计算机中,0000的首位是0,其实是占用了正数的一个位置的,所以计算范围时,正数要比负数少1。例如,-2~2,中间其实有5个数,-2,-1,0,1,2。而因为是二进制,所以范围大小都是2的倍数,所以只能取-2,-1,0,1
  • 进制
    • 二进制
      • 0b开头,例如0b11代表0000 0011,即3
    • 十进制
    • 八进制
      • 0开头
      • int number = 010;,输出结果为8
      • 注意,因为是八进制,所以数字89是不可使用的,会报错Integer number too large。也就是说在八进制中,数值07的表示是0007,而8则直接变成010,同理,数值915的表示是011017,而16则直接变成020
    • 十六进制
      • 0x开头
      • af来表示1015,例如int number = 0xa,输出结果为10
      • 计算方法:例如int number = 0xa30f,则10(即a) * 16^3 + 3 * 16^2 + 0 * 16^1 + 15(即f) * 16^0 = 41743
  • 浮点数
    • 采用IEEE 754标准
    • 详细解释
    • 浮点数占4个字节,即32位,IEEE 754标准规定:
      • 首位为符号位,0表示正数,1表示负数
      • 第2-9位表示指数
      • 最后23位表示小数
    • 浮点数的数值有舍入误差,所以千万不要用浮点数进行比较
    • 可以使用BigDecimal(一个数学工具类)来进行比较(应用于银行业务)
  • 字符
    • 字符的本质还是数字,所有的字符都可以被强制转换成数字
    • Java的默认编码是Unicode,可以表达从0到65536(216)的数字,每个数字被规定好,表示不同的字符
      • Unicode采用十六进制,范围从U0000UFFFF
      • 十六进制中,F或者f代表15,所以UFFFF即为15 * 16^3 + 15 * 16^2 + 15 * 16^1 + 15 * 16^0 = 65536
    • 其他的编码还有ASCII,以及Unicode拓展出来的UTF-8UTF-16
    • 详细解释
  • 转义字符(Escape Character)
    • \u代表使用Unicode,例如System.out.println('\u0061')会输出Unicode表格中数字97代表的字符(因为是十六进制,计算方法如上),即a
    • \t代表Tab
    • \n代表换行
  • 基本类型的大小
    byte(1字节)< short(2字节)= char(2字节)< int(4字节)< long(8字节)< float(4字节)< double(8字节)
    • 浮点数的范围大于整数,因为浮点数采用指数存放,具体可以看上方的链接
    • 在基本类型的相互转换中,从大转换为小是自动转换,从小转换为大是强制转换,并且容易出现内存溢出

引用

  1. https://blog.csdn.net/qq_54781283/article/details/125326589
  2. https://www.cnblogs.com/damoblog/p/15898905.html
posted @ 2022-10-29 20:29  重生之开局就学写代码  阅读(25)  评论(0编辑  收藏  举报