Java学习笔记(二)——数据类型及相关细节
(一)Java数据类型
这里需要注意:String在Java里面是属于一个类而不是数据类型。
1、整数类型细节
- Java的整型常量默认为int型,声明long型常量必须在后面加’l’或者‘L’。
1 | long a=1L |
2、浮点数细节
- Java的浮点型常量默认为double类型,声明float型常量,通常在后面加’f’或‘F’
- 通常情况下,应该使用double型,因为比float型更精确。
- 浮点数使用陷阱:2.7和8.1/3比较,结果不同。(具体可在计算机组成原理里面了解)
- 如果涉及浮点数计算,例如除法得到的变量:a = 8.1 / 3。一般用其进行条件判断时,不使用”=”来作条件(2.7和8.1/3比较例子),而是让条件判断为一个范围,例如:
1 | a = 2.7; |
3、字符类型细节
- 字符常量使用单引号(’ ‘)括起来的单个字符,而不能使用双引号(会报错?)。例如:
1 | char c1 = 'a'; char c2 = '中'; char c3 = "9" |
- Java中允许使用转义字符来将其后的字符转变为特殊字符型常量。
- Java中,char的本质是一个整数,在输出时,是unicode码对应的字符。所以直接给char赋值一个整数的话,输出时会按照对应的unicode字符输出。
- char类型是可以进行运算的,因为其都对应有Unicode码
字符类型本质:
- 存储:‘a’ => 码值97 => 二进制(~)=> 存储
- 读取:二进制(~)=> 97 => ‘a’ => 显示
(二)字符编码表
- ASCII(一个字节表示,一共128个字符。实际上一个字节可以表示256个字符,但只用128个)
- Unicode(使用两个字节表示字符,字母和汉字统一都是两个字节 => 空间浪费 )
- utf-8(大小可变,字母使用1个字节,汉字使用3个字节)
- gbk(可以表示汉字,范围光,字母使用1个字节,汉字2个字节)
- gb2312(可以表示汉字,gb2312 < gbk(国标扩))
- big5(繁体中文)
(三)基本数据类型转换
1、自动类型转换
当java程序在进行赋值或运算时,精度小的类型自动转换为精度大的数据类型。
数据类型按精度(容量)大小排序为:
1 | char => int => long => float =>double |
2、自动类型转换注意和细节
多种类型的数据混合运算时,系统首先自动将所有数据转换为容量最大(也就是精度最高)的那种数据类型,再进行计算。例如:
1
2
3
4int num2 = 10;
//float num3 = num2 + 1.2 错误的,因为num2 + 1.2默认结果是double类型
//float num3 = num2 + 1.2f 正确的
double num3 = num2 + 1.2(byte、short)和char之间不能进行自动转换
byte、short、char三者可以计算,在计算时首先转换为int类型
boolean不参与转换
自动提升原则:表达式结果的类型自动提升为操作数中最大的类型
3、强制类型转换
介绍:强制类型转换是自动类型转换的逆过程,就是将容量大的数据类型转换为小的。使用时要加上强制转换符(),但可能造成精度降低或者溢出,应该注意。例如:
1 | int i = (int)1.9 |
4、强制类型转换细节
强制符号只针对于最近的操作数有效,往往会使用小括号提升优先级。
char类型可以保存int的常量值,但不能保存int的变量值,需要强转。
1
2
3
4char c1 = 100;//ok
int m = 100;//ok
char c2 = m;//错误,不能存int的变量,因为自动转换无法满足从精度高到精度小
char c3 = (char)m;//okbyte和short类型在进行运算时,当作int类型处理。
5、基本数据类型和String类型的转换
- 基本类型转String类型:将基本类型的值直接加 + “”
1 | int n1 = 100; |
- String类型转基本数据类型:通过基本类型的包装类调用parseXX方法即可
1 | String n1 = "123"; |
- String类型转换成字符char:不能用上述用法
1 | //怎么把字符串转成字符char -> 含义是指把字符串的第一个字符得到: |
6、基本数据类型和String类型转换的细节
- 在将String类型转换成基本数据类型时,要确保String类型能能够转换成有效的数据,例如可以把”123”转换成一个整数,但是不能把”hello“转成一个整数。
- 如果格式不正确,就会抛出异常,程序就会终止(详细见异常处理章节)