Java数据类型和运算符
一、变量和类型
变量指的是程序运行时可变的量,类型则是对变量的种类进行了划分,不同的类型的变量具有不同的特性。
JAVA中存在8种基本数据类型:
数据类型 | 大小(字节) | 包装类 | 范围 |
---|---|---|---|
byte | 1字节 | Byte | -128 - +127 |
short | 2字节 | Short | -2^15 - 2^15-1 |
int | 4字节 | Integer | -2^31 - 2^31-1 |
long | 8字节 | Long | -2^63 - 2^63-1 |
float | 4字节 | Float | * |
double | 8字节 | Double | * |
char | 2字节 | Character | * |
boolean | 无明确规定 | Boolean | true/false |
1、字节类型变量(byte)
字节类型变量的范围如图:
System.out.println(Byte.MAX_VALUE+1); //-128
System.out.println(Byte.MIN_VALUE-1); //127
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZtDf5r89-1602321743747)(C:\Users\lenovo\Desktop\int.png)]
2、整型变量(Int)
用代码查看Java中整型数据范围
System.out.println(Integer.MAX_VALUE); //int的最大值
System.out.println(Integer.MIN_VALUE); //int的最小值
如果运算的结果超出了int的最大范围,就会出现溢出的情况
int maxValue = Integer.MAX_VALUE;
System.out.println(maxValue+1);
int minValue = Integer.MIN_VALUE;
System.out.println(minValue-1);
3、长整型变量(long)
长整型的定义:
long num = 10L; //定义一个长整型变量
System.out.println(num);
注意事项:
初始化设定的值为10L
,表示一个长整型的数字.10l
也可以. 但是为了明显区分1
和l
使用L
更好
同样可以使用如下代码查看Java中的长整型数据范围:
System.out.println(Long.MAX_VALUE);
System.out.println(Long.MIN_VALUE);
4、单精度浮点型(float)
示例:
float num = 1.0f; //写作1.0F也可以
System.out.println(num);
5、双精度浮点型(double)
double num = 1.1;
System.out.println(num*num);
//1.2100000000000002
Java中的double虽然也是8字节,但是浮点数的内部布局和整数差别很大,不能单纯的用2^n的形式表示范围。
6、字符类型(char)
char ch = 'A';
char chinese = '哈';
System.out.println(ch); //A
System.out.println(chinese); //哈
注意事项
计算机中的字符本质上是一个整数,在c语言中使用ASCII表示字符,而Java使用Unicode表示字符,因此一个字符占用两个字节,表示的字符种类更多,包括中文。
7、布尔类型变量(boolean)
boolean value = true;
System.out.println(value);
boolean类型的变量只有两种取值,即true
表示真,false
表示假。Java的boolean类型和int不能互相转换,不存在1表示true,0表示false的用法。另外boolean类型有些在JVM中实现是占一个字节,有些是占一个比特位,并没有明确规定。
字符串类型变量(String)
String name = "zhangsan";
System.out.println(name);
Java使用双引号+若干字符
的方式表示字符串字面值。String不是基本类型,而是引用类型。
常见转义字符:
转义字符 | 解释 |
---|---|
\n | 换行 |
\t | 水平制表符 |
’ | 单引号 |
" | 双引号 |
\ | 反斜杠 |
字符串可以使用+
操作,表示字符串拼接
String a = "hello ";
String b = "world";
String c = a+b;
System.outprintln(c); //hello world
//字符串和整数拼接
int i = 10;
int j = 20;
String res=a+i+j;
System.out.println(res); //hello 1020
数据类型转换
int a = 10;
long b = 20;
a=b; //编译出错
b=a; //编译通过
double c = 1.0;
a=c; //编译出错,可能会损失精度
c=a; //编译通过
long 表示的范围更大, 可以将 int 赋值给 long, 但是不能将 long 赋值给 int.
double 表示的范围更大, 可以将 int 赋值给 double, 但是不能将 double 赋值给 int.
结论:不同数字类型的变量之间赋值,范围小的类型能够隐式转换成范围较大的类型,反之不行。
强制类型转换
int a = 0;
double b = 10.5;
a = (int)b; //10
int c = 10;
boolean bool = false;
b = (boolean)c; //编译出错,不兼容的类型
结论:强制类型转换可以将double类型转换成int类型,但是会导致精度丢失;互不兼容的类型之间无法强制转换。
数值提升
数字类型变量之间的混合运算:
int a = 10;
long b = 20;
int c = a + b; //编译出错,long转成int会丢失精度
long d = a + b; //编译通过
//int表示范围更小,而long表示范围更大,在混合计算时会将int提升为long
int和String之间的转换
int转成String
int sum = 10;
//方法1
String str1 = num +"";
//方法2
String str2 = String.valueOf(num);
String转成int
String str = "100";
int num = String.valueOf(str);
//int num = Integer.parseInt(str);
二、运算符
1、算数运算符
- 基本四则运算符
+ - * / %
除法规则:
int a = 1;
int b = 2;
System.out.println(a/b);
//结果为0,int类型除法的结果还是为int
//除法的除数不能为0,否则会报错java.lang.ArithmeticException
%表示取余:
System.out.println(10%3); //1
System.out.println(11.5%2.0); //1.5
- 增量赋值运算符
+= -= *= /= %=
int a = 10;
a += 1; //a=a+1;
System.out.println(a); //11
- 自增/自减运算符
++ --
int a = 10;
int b = ++a;
System.out.println(b); //11
int c = a++;
System.out.println(c); //10
2、关系运算符
六个关系运算符:
== != > < >= <=
int a = 10;
int b = 22;
System.out.println(a == b); //false
System.out.println(a != b); //true
System.out.println(a > b); //false
System.out.println(a < b); //true
System.out.println(a >= b); //false
System.out.println(a <= b); //true
3、逻辑运算符
三个逻辑运算符:
&& || !
逻辑与&&:
int a = 10;
int b = 20;
int c = 30;
System.out.println(a < b && b < c); //true
逻辑或||:
int a = 10;
int b = 20;
int c = 30;
System.out.println(a < b || b < c); //true
逻辑非!:
int a = 10;
int b = 20;
System.out.println(!a<b); //false
短路求值
&&和||遵守短路求值的规则.
System.out.println(10 > 20 && 10 /0 == 0); //false
System.out.println(10 > 20 || 10 /0 == 0); //true
结论:
-
对于 && , 如果左侧表达式值为 false, 则表达式的整体的值一定是 false, 无需计算右侧表达式.
-
对于 ||, 如果左侧表达式值为 true, 则表达式的整体的值一定是 true, 无需计算右侧表达式.
位运算符
四个位运算符:
& | ^ ~
**按位与&:**如果两个二进制位都是,则结果为1,否则为0.
int a = 10;
int b = 20;
System.out.println(a & b);
**按位或|:**如果两个二进制位都是0,则结果为0,否则为1.
int a = 10;
int b = 20;
System.out.println(a | b);
注意: 当 & 和 | 的操作数为整数(int, short, long, byte) 的时候, 表示按位运算, 当操作数为 boolean 的时候, 表示逻辑运算.
**按位取反~:**如果该位为0则转为1,如果该位为1则转为0
**按位异或^:**如果两个数字的二进制位数相同,则结果为0,相异则为1
条件运算符
表达式1 ? 表达式2:表达式3
当表达式1
的值为true时,整个表达式的值为表达式2
的值;当表达式1
的值为false时,整个表达式的值为表达式3
的值.
//求两个数的最大值
int a = 10;
int b = 20;
int max = a > b ? a : b; //b
注意: 当 & 和 | 的操作数为整数(int, short, long, byte) 的时候, 表示按位运算, 当操作数为 boolean 的时候, 表示逻辑运算.
**按位取反~:**如果该位为0则转为1,如果该位为1则转为0
**按位异或^:**如果两个数字的二进制位数相同,则结果为0,相异则为1
条件运算符
表达式1 ? 表达式2:表达式3
当表达式1
的值为true时,整个表达式的值为表达式2
的值;当表达式1
的值为false时,整个表达式的值为表达式3
的值.
//求两个数的最大值
int a = 10;
int b = 20;
int max = a > b ? a : b; //b