目录
Java是一门强类型语言,定义一个变量时,必须要明确该变量的类型。
所有数据类型都有默认值(类中属性才具备默认值),方法中的局部变量不存在默认值。
一、八大基本数据类型
1、数值型(有符号)
最高位不存储具体数据(01),0表示正数,1表示负数。
(1)整型,默认值均为0
数据类型 | 关键字 | 内存占用 |
字节型 | byte | 1字节 |
短整型 | short | 2字节 |
整型 | int | 4字节 |
长整型 | long | 8字节 |
(2)浮点型,默认值均为0.0
数据类型 | 关键字 | 内存占用 |
单精度浮点数 | float | 4字节 |
双精度浮点数 | double | 8字节 |
2、字符型,默认值为“\u0000”
数据类型 | 关键字 | 内存占用 |
字符型 | char | 2字节 |
3、布尔型,默认值为false
数据类型 | 关键字 | 内存占用 |
布尔类型 | boolean | 没有明确规范,1字节 |
二、引用数据类型:
数组、类、接口,默认值为null。
字符串String也是类。
三、计算机存储数据的基本单位
1、两种基本单位
bit:二进制位
byte:字节(计算机保存单位,以字节为基本单位)
2、单位换算
1 byte = 8 bit
1 GB = 8G byte
1KB = 1024 byte
1MB = 1024 KB
1 GB = 1024 MB
1 TB = 1024 GB
1 PB = 1024 TB
3、举例
int类型为4字节,则有32比特位,但是第一位是符号所以数量级是2^31。
四、数据类型的应用
1、变量的初始值
在main方法中定义的局部变量a没有复制的情况下,是没有默认值的,可以这样定义但是在使用的时候会出现错误(使用的情况比如输出a的值),所以使用的时候一定要定义值。
如果是在类中定义的变量a是成员变量,他有默认值(就是该数据类型的默认值),可以在main方法中不用赋值就使用。
2、变量溢出问题
int类型的数据范围在[-2147483648,2147483647]。
如果超出范围的赋值,int只能表示32bit,无法再给上进位,只能进位到符号位。
所以这个时候就需要长整型long,long是8字节,就可以存储2147483648。
当一个数比长整型的最大值还大,可以用BigInterger类来存储,也可以用字符串String来存储。
3、 定义变量
long和float定义变量时,赋的值后需要加L、l和F、f,但是long不是必须的,float是必须的,不加会编译错误。而布尔类型只可以定义false和true。
而char类型定义时需要加单引号,因为java语言字符采用Unicode编码,16位编码(2字节),所以支持地球上所有的语言,都可以定义为char类型。
4、包装类
在java中一切皆对象,认为一切失误都可以用类来进行描述,但是8大基本类型不属于类。
所以在java中将8大基本类型都有对应的类进行包装,这种类称之为包装类。
数据类型 | 对应的包装类 |
byte | Byte |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
char | Character |
boolean | Boolean |
5、字面量
直接写出来的数值就称之为字面量,字面量也存在数据类型。
10->整型字面量,默认为int类型
10.1->浮点数字面量,默认为double类型
'a'->字符字面量,默认为char类型
false->布尔值字面量,默认为boolean类型
"abc"->字符串字面量,默认为String类型
6、其他的整型变量
0b10 为二进制表示十进制2
010 为八进制表示十进制8
0x10 为十六进制表示十进制16
五、类型转换与类型提升
小类型转换为大类型是自动转换。
大类型转换为小类型需要强制类型转换,有精度丢失问题。
1、关于int,byte,char之间的转换问题
计算机存储数据时默认采用4字节存储,所有小于4字节的数据类型,隐式提升为int之后进行存储,boolean除外。
(1)byte和int转换
byte是1字节,所以范围是[-128,127],所以在这个范围内的数可以直接转换,但是当赋的值不在这个范围内就会出现错误,所以需要在值前面加上(byte),但是输出结果仍然不是正确的,如下图,赋值130,强制类型转换后变成了-126。
如下图,在编译时,a和b直接算做了int类型,并且是变量不知道值具体是多少不知道是否在范围内,所以需要强制类型转换。
char和int的转换与byte和int转换是类似的。
2、类型提升
当不同数据类型进行运算时,会将小的类型自动提升为大的类型参与运算。
如下图,进行了两次自动类型提升,b赋值为2是int类型,自动提升味double。输出结果时,a参与运算又自动提升为double类型,结果则为0.5。
六、 字符串类型
1、int转换为String
在java中字符串和任何其他类型“+”,都会将其他类型转换为字符串类型拼接。
调用String的valueof函数也可以输出为字符串类型。
2、String转换为int
调用整形包装类Interger的parseInt方法,前提字符串必须是纯数字字符串。
如果字符串是纯数字但是超过了整型的存储范围,会报错。
一、算术运算符
计算结果要么是小数要么是整数。
1、基本的数学四则运算+ - * / 取模%
2、增量运算符 += -= *= /=
3、自增/自减运算符++ --
当+号在前面,先运算再取值。
+号在后面,先取值在运算。
二、关系运算符
计算结果为布尔值,要么是false,要么是true
== != > < >= <=
关系运算符不能连着写。
三、逻辑运算符
计算结果也是布尔值。
1、逻辑与&&
语法规则:表达式1&&表达式2,其中两个表达式都是布尔表达式,得到的结果也是布尔值。
当且仅当表达式1和2都是true,表达时才会返回true。
2、逻辑或 ||
语法规则:表达式1 || 表达式2,其中两个表达式都是布尔表达式,得到的结果也是布尔值。
当且仅当表达式1和2都是false,表达时才会返回false。
3、逻辑去反!
!表达式1 表达式1是布尔表达式。进行取反操作。
4、关于逻辑运算符的短路求值问题
表达式1&&表达式2,当表达式1为false,不管表达式2直接返回false(第二个表达式根本不执行)
表达式1 || 表达式2,当表达式1为true,不管表达式2直接返回true。
四、位运算符
直接在二进制位上操作的运算符& | ^ ~
1、按位与&
如果两个二进制位都为1,则返回1,否则返回0。
2、按位或|
如果两个二进制位都为0,则返回0,否则返回1。
3、按位异或^
两个二进制位相同返回0,不相同返回1。
4、按位取反~
符号位也会发生变化,正数变为负数,负数变为正数。
正数变为负数,则加符号减一。
负数变为正数,则绝对值减一。
五、移位运算符
直接在二进制位上进行操作的运算符
1、左移位<<
最左侧不要,最右侧补0。
当一个数x<<1,结果左移乘二
2、右移位>>
最右侧不要,最左侧补0。
当一个数x>>1,结果左移除二。
3、无符号右移>>>
六、条件运算符
三目运算符
语法规则:条件表达式1?表达式2:表达式3
根据布尔表达式1的返回值,返回true则取布尔表达式2的值,返回false则取表达式3的值。
表达式2和表达式3必须是同类型的,否则会发生隐式转换。
三目运算符不能单独存在,必须有一个相对应的变量接收它的返回值。
七、运算符优先级
* / 优先级高于+ -
需要优先运算的加上括号。
加法优先级高于移位运算。