目录
一、数据类型与变量
1.字面常量的分类
①字符串常量:由“”括起来的的,比如:“12345”、“CSDN”;
②整形常量:程序中直接写的数字(无小数点),例如:50、100;
③浮点数常量:程序中直接写的小数,比如:3.14、0.49;
④字符常量:由单引号括起来的单个字符,比如:‘A’、‘1’;
⑤布尔常量:只有两种:true和false;
⑥空常量null
例如:
public class TestDome {
public static void main(String[] args) {
System.out.println("12345");
System.out.println("CSDN");
System.out.println(100);
System.out.println(50);
System.out.println(3.14);
System.out.println(0.49);
System.out.println('A');
System.out.println('1');
System.out.println(true);
System.out.println(false);
}
2.数据类型
在Java中基本数据类型分为四类八种:
①四类:整形、浮点型、字符型、布尔型
②八种:
数据类型 | 关键字 | 内存占用 | 范围 |
字节型 | byte | 1字节 | -128~127 |
短整型 | short | 2字节 | -32768~32767 |
整形 | int | 4字节 | -2^31~2^31-1 |
长整型 | long | 8字节 | -2^63~2^63-1 |
单精度浮点数 | float | 4字节 | 有范围,一般不关注 |
双精度浮点数 | double | 8字节 | 有范围,一般不关注 |
字符型 | char | 2字节 | 0~65535 |
布尔型 | boolean | 没有明确规定 | true和false |
注意:
①不论在16位系统或32位系统,int类型都是占用4个字节,double占8个字节
②整型和浮点型都是带符号的
③整形默认为int型,浮点型默认为double型
④字符串属于引用类型
3.变量
整型变量
//定义方式一:
int a = 10;
//定义方式二:
int b;
b = 10;
注意事项:
①int不论在何种系统下都是4个字节;
②推荐使用方式一定义,如果没有合适的初始值,可以设置为0;
③在给变量设置初始值时,值不能超过int类型的取值范围,否则会导致溢出;
④变量在使用前必须要赋初值,否则会编译报错;
⑤int的包装类型为Integer
长整型变量
定义方式:
//为了区分int和long类型,建议在定义long类型变量时在初始值后加l或L
long c = 100L;
注意事项:
①长整型变量初始值后加L或l;
②长整型不论在哪个系统下都占8个字节;
③长整型的表示范围2^31~2^31-1;
④long类型的包装类为Long
短整型变量
定义方式:
short a = 10;
注意事项:
①短整型不论在哪个操作系统都占2个字节;
②short的取值范围在-32768~32767之间
③short的包装类型为Short
字节型变量
定义方式:
byte a = 10;
注意事项:
①byte在任何系统下都占1个字节;
②byte的取值范围是-128~127之间;
③字节的包装类型是Byte
双精度浮点型
定义方式:
double a = 3.14;
注意事项:
①double在任何系统下都占8个字节;
②浮点数与整数在内存中的存储方式不同,不能单纯使用2^n的形式来计算;
③double的包装类型是Double;
④double类型的内存布局遵守IEEE 754标准(和C语言一致)
单精度浮点型
定义方式:
float num = 1.0f(1.0F也可以)
float类型在任何系统下都占用4个字节,内存布局与double类型一致,一般建议使用double来定义浮点型数据;float的包装类型是Float
字符型变量
定义方式:
char c1 = 'A';
char c2 = 'a';
char c3 = '美';
注意事项:
①Java中使用 单引号+单个字母的形式表示字符字面值;
②计算机中的字符本质上是一个整数,在Java中使用Unicode表示字符,Java中字符类型占据2个字节,因此可以表示的字符种类更多;
③char的包装类型是Character
布尔类型变量
定义方式:
boolean a = true;
boolean b = false;
注意事项:
①boolean类型变量只有两个取值:true和false;
②Java中不存在boolean类型和int类型相互转换,不能像c语言那样,非0表示true,0表示false;
③Java虚拟机规范中未规定boolean类型占用几个字节,也没有专门用来处理boolean的字节码指令,在Oracle公司的虚拟机机实现中,boolean类型占用1个字节;
④boolean类型的包装类为Boolean
4.类型转换
在Java中,当参与运算的数据类型不一致时,就会进行类型转换。Java中类型转换主要分为两类:自动类型转换(隐式)和强制类型转换(显式)。
自动类型转换(隐式)
自动类型转换即当数据参与运算时,数据范围小的类型自动转换成数据范围大的类型。
例如:
如图所示,a和b都是整形数据,a的数据范围小于b的数据范围,当将a赋值给b时,a的数据类型会自动转换为long型,然后再赋值给b;但是不能将b赋值给a,因为自动类型转换是将数据范围小的类型自动转换成数据范围大的类型,并不能将数据范围大的类型转换成数据范围小的类型。
强制类型转换(显式)
当进行操作时,不能依靠自动类型转换完成转换时,需要手动完成数据类型的转换,这种转换即为强制类型转换。
特点:将数据范围大的类型转换成数据范围小的类型。
例如:
int a = 10;
long b = 20l
b = a;
a = (int)b;//b的数据类型大于a,先将b强制转换成int类型,之后再对a赋值
注意事项:
①在不同数据类型的变量之间赋值时,表示范围更小的是数据类型能自动转换成表示范围更大的类型;
②如果需要把数据范围大的类型转换成数据范围小的类型,需要进行强制类型转换,其间可能会造成数据精度的丢失;
③将一个字面值常量进行赋值时,Java会自动针对数据范围进行检查;
④不相干的数据类型之间不能进行转换。
二、运算符
1.算术运算符
基本四则运算
加减乘除取余(+ - * / %)
注意事项:
①都是二元操作符,使用时左右都需有操作数;
②int类型 / int类型得到的还是int类型,且会向下取整,如果需要得到实际的运算结果,需要进行强制类型转换;
例如:
int a = 10;
int b = 4;
System.out.println(a/(float)b);
System.out.println((float)a/b);
③做除法和取余时,右操作数不能为0;
④%既可以对int类型取余,也可以对double类型取余;
⑤运算符两侧操作数类型不一致时,自动向数据类型范围大的类型转换。
增量运算符
+= 、*=、/=、-=、%=
int a = 2;
a += 2;//相当于a = a + 2;
a -= 1;//相当于a = a - 1;
a /= 2;//相当于a = a / 2;
a %= 2;//相当于a = a % 2;
a *= 2;//相当于a = a * 2;
注意:只有变量才能使用增量运算符,常量不能使用。
自增/自减运算符
++/--
注意事项:
①如果单独使用,前++和后++无任何区别;
例如:
int a = 1;
a++;//或者使用++a
System.out.println(a);
当以这种方式使用自增/自减运算符时,无任何区别。
②当混合使用时,需要搞清楚前置和后置的区别;
例如:
int a = 5;
System.out.println(a);
System.out.println(a++);
System.out.println(a);
如上述代码所示,第一个输出语句输出5,第二个输出语句输出5,第三个输出语句输出6,因为“a++”的结果还是5,但是该语句运行完之后a+1,变成6;
int a = 5;
System.out.println(a);
System.out.println(++a);
System.out.println(a);
如上述代码所示,第一个输出语句输出5,第二个输出语句输出6,第三个输出语句输出6,因为“++a”的结果是6.
自减运算符与上述自增运算符类似。
③只有变量才能使用自增/自减运算符。
2.关系运算符、逻辑运算符
关系运算符主要有六个:== != < > <= >=,其计算结果表示为true或者false。
逻辑运算符主要有三个:逻辑与&&、逻辑或 || 、逻辑非 ! ,其运算结果都是boolean类型。
逻辑与&&:
语法规则:表达式1 && 表达式2,左右表达式必须都是boolean类型的结果。
表达式1 | 表达式2 | 结果 |
真 | 真 | 真 |
真 | 假 | 假 |
假 | 真 | 假 |
假 | 假 | 假 |
逻辑或 || :
语法规则:表达式1 || 表达式2,左右表达式必须都是boolean类型的结果。
表达式1 | 表达式2 | 结果 |
真 | 真 | 真 |
真 | 假 | 真 |
假 | 真 | 真 |
假 | 假 | 假 |
逻辑非 !:
语法规则:! 表达式
表达式 | 结果 |
真 | 假 |
假 | 真 |
①对于&&,如果左侧表达式的值为false,则表达式的结果一定是false,无需计算右侧表达式;
②对于 || ,如果左侧表达式的值为true,则表达式的结果一定是true,无需计算右侧表达式;
③&和 | 如果表达式的结果为boolean时,也表示逻辑运算,但与&&和 || 相比,它们不支持短路求值。
3.位运算符
Java中数据存储的最小单位是字节,而数据操作的最小单位是比特位。字节是最小的存储单位,每个字节有8个二进制比特位组成的,多个字节组合在一起可以表示各种不同的数据。
位运算符主要有四个:& | ~ ^,除~是一元运算符外,其余都是二元运算符。
位操作表示按二进制位运算,计算机中都是使用二进制来表示数据局的,按位运算就是在按照二进制位的每一位依次进行运算。
按位与运算'&':如果两个二进制为都是1,则结果为1,否则结果为0.
例如:
int a = 20;
int b = 40;
System.out.println(a&b);
20的二进制 | 0 | 1 | 0 | 1 | 0 | 0 |
40的二进制 | 1 | 0 | 1 | 0 | 0 | 0 |
a & b = 0 | 0 | 0 | 0 | 0 | 0 | 0 |
最终得到a & b的结果为0。
按位或运算‘|’: 如果两个二进制位都是0,则结果为0,否则为1.
例如:
int a = 20;
int b = 40;
System.out.println(a | b);
20的二进制 | 0 | 1 | 0 | 1 | 0 | 0 |
40的二进制 | 1 | 0 | 1 | 0 | 0 | 0 |
a | b = 60 | 1 | 1 | 1 | 1 | 0 | 0 |
最终得到 a | b的结果为60.
按位取反‘~’:如果该位为0则转为1,如果该位为1则转为0.
例如:
int a = 20;
System.out.print("%x\n",a);
System.out.print("%x\n",~a);
a 0000 0000 0000 0000 0000 0000 0001 0100
%x 0 0 0 0 0 0 1 4
~a 1111 1111 1111 1111 1111 1111 1110 1010
%x f f f f f f e b
按位异或'^':如果两个数的二进制位相同则结果为0,相异则结果为1.
例如:
int a = 20;
int b = 10;
System.out.println(a ^ b);
20的二进制 | 0 | 1 | 0 | 1 | 0 | 0 |
10的二进制 | 0 | 0 | 1 | 0 | 1 | 0 |
a ^ b = 30 | 0 | 1 | 1 | 1 | 1 | 0 |
最终得到a ^ b的结果为30.
4.移位运算
移位运算符有三个:>> << >>>,都是二元运算符,且都是按照二进制比特位来运算的。
左移'<<':舍去最左侧位,最右侧补0;
右移'>>':舍去最右侧位,最左侧符号位(整数补0,负数补1);
无符号右移‘>>>’:舍去最右侧位,最左侧补0.
注意:
①左移一位,相当于原数字*2,左移N位,相当于原数字*2的N次方;
②右移一位,相当于原数字/2,右移N位,相当于原数字/2的N次方;
③由于计算机计算移位效率高于计算乘除的效率,因此在适当的时侯可以选择用移位运算代替乘除运算;
④移动负数位或者移位位数过大都没有意义。
在Java中的位操作符操作与C语言中的基本一致,详细操作讲解可以浏览我之前的一篇文章位操作符详解