MENU

Java-04 基本数据类型及字符串类型

August 5, 2023 • Read: 79 • Java阅读设置

Java基本语法

变量

整型

  • Java的整数类型有:byteshortintlong
  • Java各整数类型有固定的表数范围和字段长度,不受具体操作系统的影响,以保证Java程序的可移植性。
    表数范围的得出:以byte为例,占用存储空间为1字节即8bit,因此可以表示$ 2^8 = 256 $个数,分成一半正(包含0)一半负,则得到其表数范围为-128~127
    由于byte的表数范围比较小,使用的时候容易超出其范围,因此需要记一下byte的表数范围,即-128~127
    可以这样记四种整数类型占用的存储空间,以字节为单位,从小到大分别为:$ 2^0、2^1、2^2、2^3$字节。
    四种整数类型的表数范围,一半正数(0作为正数),一半负数,因此就是:$ -2^{占用的存储空间字节数} \div 2 \sim 2^{占用的存储空间字节数} \div 2 - 1 $
    2023-08-05T06:32:42.png
  • 如果定义byte类型时,给其赋值超出了其范围,会编译失败。编译失败的信息是错误: 不兼容的类型: 从int转换到byte可能会有损失,这里的意思就是要注意=这个赋值号,相当于先存在128这个int型的整数,再赋值给了byte类型的变量。因此实际上超出范围错误虽然是用了超出范围的数,但由于赋值操作,系统先是存在了int类型的数(即任何存在的数实际上都有一个类型),因此实际上产生的是数据类型不兼容的问题。
    2023-08-05T06:49:55.png
  • 声明long型变量,必须以lL结尾。
    实际上,有时不带lL也不会出错。本质上还是因为赋值,相当于不带lL的在int类型表数范围内的数是int型的,赋值给了一个long型的变量,这时会自动类型转换,即int型的数自动转换为long型了。
    2023-08-05T06:57:33.png
  • 通常定义整型变量时,使用int型。

浮点型

  • Java的浮点类型有:floatdouble
  • Java的浮点类型也有固定的表数范围和字段长度,不受具体操作系统的影响。
    虽然float型和int型占用的存储空间都是4byte,但是float型表示的数带有小数点并且表数范围比int型要大,实际上比long型表数范围还大。这是因为对于整型,整个存储空间就是表示一个数,而对于浮点型,存储空间中一部分用来表示数,一部分用来表示幂数即10的几次方,因此表数范围很大。
    2023-08-05T07:05:34.png
  • 浮点型常量有两种表示形式:

    • 十进制数形式(必须有小数点):如:5.12, 512.0f, .512
    • 科学计数法形式:如:5.12e2, 521E2, 100E-2
  • float:单精度,尾数可以精确到7位有效数字。很多情况下,精度很难满足需求,后面会有Java的相关类来表示更大精度的数。
  • double:双精度,精度是float的两倍。通常采用这种类型。
  • Java的浮点型常量默认为double型,声明float型常量,必须以fF结尾。
  • 如果定义float类型时,给其赋值在其表数范围内,但是没有以fF结尾,会报错。错误类型为错误: 不兼容的类型: 从double转换到float可能会有损失。也就是说,由于系统默认带小数点的数的类型为double,由于赋值,相当于把double型赋给了float型,因此出现数据类型不兼容的错误。
    2023-08-05T07:16:00.png
  • 通常定义浮点型变量时,使用double型。

字符型

  • Java的字符类型有:char
  • 定义char型变量,通常使用一对单引号'',在单引号中写一个字符。
    定义char型变量,也存在可以不使用单引号就能定义的情况,就是直接用一个ASCII码对应的整数范围内的整数定义,此时就相当于定义了一个该整数对应的ASCII码的字符。
    2023-08-07T02:48:52.png
    注意字符类型就是表示一个字符的类型,因此没有空字符类型。也不能是多个字符,因此就是有且仅有一个字符。
    2023-08-05T07:32:31.png
  • char型数据用来表示通常意义上的字符,其字段长度即占用的存储空间为2 byte
  • Java中所有字符都使用Unicode编码,因此一个字符可以存储一个字母、一个汉字或其他书面语的一个字符。
  • 字符型变量的3种表现形式:

    • 字符常量是用单引号''括起来的单个字符。如char c1 = 'a'
    • Java中还允许使用转义字符\来将其后的字符转变为特殊字符型常量。如char c2 = '\n'
      2023-08-05T07:26:52.png
    • 可以直接使用Unicode值来表示字符型常量,\uXXXX。其中XXXX代表一个十六进制整数。如\u000a表示\n
      2023-08-05T07:38:37.png
  • char类型是可以进行运算的,因为它有对应的Unicode码。

乱码情况和字符集

  • 在计算机内部,所有数据都使用二进制表示。每一个二进制位(bit)有0和1两种状态。
    也就是说计算机上所展示了各种数据在底层都是以二进制存储的,因此存在一个对应关系,将我们所看到的数据存储时对应到其对应的二进制表示,同时在我们去读一个数据时,也会将存储的二进制对应到其对应的数据,即还原成我们所看到的样子。
    将我们看的数据对应到其对应的二进制,将二进制数据还原成我们所看到的数据,中间的这个对应关系的就是字符集。

    ASCII码

  • 最简单的也是最初的一个字符集就是ASCII码。
  • ASCII码:美国制定的一套字符编码,对英文字符与二进制之间的关系做了统一规定,被称为ASCII码。ASCII码一共规定了128个字符的编码。这128个符号只占用了一个字节的后7位,最前面的1位统一规定为0.
  • 缺点:不能表示所有字符。

    Unicode编码

  • 乱码:世界上存在着多种编码方式,同一个二进制数字可以被解释为不同的符号。因此,要想打开一个文本文件,就必须知道它的编码方式,用错误的编码方式解读,就会出现乱码。
  • Unicode:一种编码,将世界上所有的符号都纳入其中。每个符号都给予了一个独一无二的编码,使用Unicode没有乱码的问题。
  • 缺点:Unicode只规定了符号的二进制代码,却没有规定这个二进制代码应该如何存储:无法区别UnicodeASCII;计算机无法区分三个字节表示一个符号还是表示三个符号。另外,英文字母只用一个字节表示就够了,如果Unicode统一规定,每个符号用三个或四个字节表示,那么每个英文字母前都必须有2到3个字节是0,这对于存储空间来说是极大的浪费。

    UTF-8

  • UTF-8是在互联网上使用最广的一种Unicode实现方式。
  • UTF-8是一种变长的编码方式。它可以使用1~6个字节表示一个符号,字节长度根据不同的符号而变化。
  • UTF-8的编码规则:

    • 对于单字节的UTF-8编码,该字节的最高位为0,其余7位用来对字符进行编码(等同于ASCII码)。
    • 对于多字节的UTF-8编码,如果编码包含n个字节,那么第一个字节的前n位为1,第一个字节的n+1位为0,该字节的剩余各位用来对字符进行编码。在第一个字节之后的所有字节,都是最高两位为10,其余6位用来对字符进行编码。

      示例

      UTF-8方式存储,但用命令行解析报错。是因为,命令行读取文件是用GBK编码方式。因此,出现乱码现象,这里是直接报错。如果不想出现乱码问题,写入与读入的编码方式应该一致。
      2023-08-05T08:06:08.png

布尔型

  • 对于布尔型就不说所谓的表数范围或字段长度了,布尔型只能取两个值:truefalse
  • Java中的布尔型与C语言中的不同,不存在0、1表示true或false。
  • 通常在条件判断或循环结构中使用。

基本数据类型转换

基本数据类型的转换是指除了boolean型的其他7种之间的转换:byte, short, int, long, float, double, char

自动类型转换

  • 自动类型转换:容量小的类型自动转换为容量大的数据类型。这里的容量指的是表数范围。数据类型按照容量大小排序为:
    2023-08-05T08:29:46.png
  • 有多种类型的数据混合运算时,系统首先自动将所有数据转换为容量最大的那种数据类型,然后再进行计算。
  • char型在与其他基本数据类型进行自动转换时,其值就是其对应的Unicode编码所对应的数,而这个数是int型。
  • 系统默认的在int类型表数范围内的数的数据类型就是int型。
  • byteshortchar之间不会相互转换,它们三者在计算时首先转化为int型。因为由于系统默认的在int类型表数范围内的数据类型为int型,char型就相当于int型。
    需要注意的是,bytebyte之间、shortshort之间、charchar之间的转换,也是转换为int型。
  • boolean类型不能与其他基本数据类型运算。
  • 所有基本数据类型都可以和String数据类型进行转换,当把任何基本数据类型的值和字符串(String)进行连接(+)运算时,基本数据类型的值将自动转化为字符串(String)型。

强制类型转换

  • 自动类型转换的逆过程,将容量大的数据类型转换为容量小的数据类型。使用时要加上强制转换符(),但可能造成精度下降或溢出(也称精度损失),需要注意。只是可能,如果强制转换前后值并没有发生变化,那就没有精度下降或溢出

    • 精度损失的特殊形式:用超过byte表数范围的数强制转换为byte类型。
      2023-08-05T08:57:57.png
  • 强制类型转换不存在四舍五入,就是截断
  • 通常,字符串不能直接转换为基本数据类型,但通过基本类型对应的包装类则可以实现把字符串转换为基本类型。
  • boolean类型不能转换为其它任何基本数据类型。

    基本数据类型变量运算规则的特殊情况

  • 在定义long型数据时,如果赋值的数是在int型表数范围内,那么不以lL结尾不会出错。而如果赋值的数超过了int型表数范围内,那么不以lL结尾会出错。
    2023-08-05T09:07:01.png
    2023-08-05T09:07:29.png
  • 在定义float型数据时,必须以fF结尾。因为对于带小数点的数,系统默认就是double型,因此,如果不以fF结尾,相当于将一个double型赋值给float型变量,会出现数据类型不兼容错误。
    2023-08-05T09:10:02.png
    2023-08-05T09:10:28.png
  • 整形常量(不超过int型的表数范围)默认类型为int型。
  • 浮点型常量默认类型为double型。

字符串类型String

  • String不是基本数据类型,属于引用数据类型
  • 声明String类型变量时,使用一对双引号("")。
  • 与字符类型不同,String数据类型存在空字符串的值。
  • String可以和所有基本数据类型做运算,即boolean数据类型也能与String数据类型进行运算,且运算只能是连接(+运算,运算结果仍然是String类型。因为,所有基本数据类型皆可字符串化。
    2023-08-05T09:22:25.png
Last Modified: October 26, 2023