文章目录
前言
Java 是一种强类型语言,每个变量都必须声明其数据类型。
Java 的数据类型可分为两大类:基本数据类型(primitive data type)和引用数据类型(reference data type)。
计算机的最基本用途之一就是执行数学运算,作为一门计算机语言,Java 也提供了一套丰富的运算符来操作变量。
本节将介绍java的数据类型以及一些常用运算符。
一、基本数据类型
Java 中定义了 3 类 8 种基本数据类型
数值型- byte、 short、int、 long、float、 double
字符型- char
布尔型-boolean
1.整型
整型用于表示没有小数部分的数值,它允许是负数。整型的范围与运行 Java 代码的机 器无关,这正是 Java 程序具有很强移植能力的原因之一。与此相反,C 和 C++程序需要针 对不同的处理器选择最有效的整型。
类型 | 占用存储空间 | 表数范围 |
---|---|---|
byte | 1 字节 | -2^7 ~ 2^7-1(-128~127) |
short | 2 字节 | -2^15 ~ 2^15-1 (-32768~32767) |
int | 4 字节 | -2^31 ~ 2^31-1 (-2147483648~2147483647) 约 21 亿 |
long | 8字节 | -2^63 ~ 2^63-1 |
Java 语言整型常量的四种表示形式 :
十进制整数,如:99, -500, 0
八进制整数,要求以 0 开头,如:015
十六进制数,要求 0x 或 0X 开头,如:0x15
二进制数,要求 0b 或 0B 开头,如:0b01110011
提示:Java 语言的整型常数默认为 int 型,声明 long 型常量可以后加‘ l ’或‘ L ’
代码如下(示例1):long 类型常数的写法及变量的声明
long a = 55555555; //编译成功,在 int 表示的范围内(21 亿内)。
long b = 55555555555;//不加 L 编译错误,已经超过 int 表示的范围。
//报错:The literal 55555555555 of type int is out of range,所以我们需要修改代码 为:
long b = 55555555555L;
2.浮点型
带小数的数据在 Java 中称为浮点型。浮点型可分为 float 类型和 double 类型。
类型 | 占用存储空间 | 表数范围 |
---|---|---|
float | 4字节 | -3.403E38~3.403E38 |
double | 8字节 | -1.798E308~1.798E308 |
float 类型又被称作单精度类型,尾数可以精确到 7 位有效数字,在很多情况下,float 类型的精度很难满足需求。而 double 表示这种类型的数值精度约是 float 类型的两倍,又 被称作双精度类型,绝大部分应用程序都采用 double 类型。
Java 浮点类型常量有两种表示形式
十进制数形式,例如:3.14 314.0 0.314
科学记数法形式,如 3.14e0 3.14E2 3.14E-1
代码如下(示例2):使用科学记数法给浮点型变量赋值
double f = 314e2; //314*10^2-->31400.0
double f2 = 314e-2; //314*10^(-2)-->3.14
float类型的数值有一个后缀F或者f ,没有后缀F/f的浮点数值默认为double类型。也可以在浮点数值后添加后缀D或者d, 以明确其为double类型。
代码如下(示例3):float 类型常量的写法及变量的声明
float f = 3.14F;//float 类型赋值时需要添加后缀 F/f
double d1= 3.14;
double d2 = 3.14D;
代码如下(示例4):浮点型数据的比较一
float f = 0.1f;
double d = 1.0/10;
System.out.println(f==d);//结果为 false
代码如下(示例5):浮点型数据的比较二
float d1 = 423432423f;
float d2 = d1+1;
if(d1==d2){
System.out.println("d1==d2");//输出结果为 d1==d2
}else{
System.out.println("d1!=d2");
}
运行以上两个示例,发现示例2-13的结果是“false”,而示例2-14的输出结果是“d1==d2”。 这是因为由于字长有限,浮点数能够精确表示的数是有限的,因而也是离散的。浮点数一般都存在舍入误差,很多数字无法精确表示(例如0.1),其结果只能是接近,但不等于。二 进制浮点数不能精确的表示0.1、0.01、0.001这样10的负次幂。并不是所有的小数都能可 以精确的用二进制浮点数表示。
java.math 包下面的两个有用的类:BigInteger 和 BigDecimal,这两个类可以处理任意长度的数值。BigInteger 实现了任意精度的整数运算。BigDecimal 实现了任意精度的浮点运算。
代码如下(示例6):使用 BigDecimal 进行浮点型数据的比较
import java.math.BigDecimal;
public class Main {
public static void main(String[ ] args) {
BigDecimal bd = BigDecimal.valueOf(1.0);
bd = bd.subtract(BigDecimal.valueOf(0.1));
bd = bd.subtract(BigDecimal.valueOf(0.1));
bd = bd.subtract(BigDecimal.valueOf(0.1));
bd = bd.subtract(BigDecimal.valueOf(0.1));
bd = bd.subtract(BigDecimal.valueOf(0.1));
System.out.println(bd);//0.5
System.out.println(1.0 - 0.1 - 0.1 - 0.1 - 0.1 - 0.1);//0.5000000000000001
}
}
浮点数使用总结
1.默认是 double 类型
2.浮点数存在舍入误差,数字不能精确表示。如果需要进行不产生舍入误差的精确数字计算,需要使用 BigDecimal 类。
3.避免比较中使用浮点数,需要比较请使用 BigDecimal 类
3.字符型
字符型在内存中占 2 个字节,在 Java 中使用单引号来表示字符常量。例如’A’是一个字符,它与”A”是不同的,”A”表示含有一个字符的字符串。
char 类型用来表示在 Unicode 编码表中的字符。Unicode 编码被设计用来处理各种 语言的文字,它占 2 个字节,可允许有 65536 个字符。
Unicode 具有从 0 到 65535 之间的编码,他们通常用从’\u0000’到’\uFFFF’之间的十六进制值来表示(前缀为 u 表示 Unicode)
Java 语言中还允许使用转义字符 ‘\’ 来将其后的字符转变为其它的含义。常用的转义字符及其含义和 Unicode 值如表 1-3 所示。
转义符 | 含义 | Unicode值 |
---|---|---|
\b | 退格(backspace) | \u0008 |
\n | 换行 | \u000a |
\r | 回车 | \u000d |
\t | 制表符(tab) | \u0009 |
\“ | 双引号 | \u0022 |
\’ | 单引号 | \u0027 |
\\ | 反斜杠 | \u005c |
代码如下(示例7):字符型演示
char eChar = 'a';
char cChar ='中';
char c = '\u0061';//字符型的十六进制值表示方法
char c2 = '\n'; //代表换行符
4.boolean 型
boolean 类型有两个常量值,true 和 false,在内存中占一个字节或 4 个字节,不可以 使用 0 或非 0 的整数替代 true 和 false ,这点和 C 语言不同。boolean 类型用来判断 逻辑条件,一般用于程序流程控制。
代码如下(示例7):boolean 类型演示
boolean flag ;
flag = true; //或者 flag=false;
if(flag) {
// true 分支
} else {
// false 分支
}
二、运算符(operator)
计算机的最基本用途之一就是执行数学运算,作为一门计算机语言,Java 也提供了一套 丰富的运算符来操作变量。
算术运算符 | 二元运算符 | +,-,*,/,% |
一元运算符 | ++,-- | |
赋值运算符 | = | |
扩展运算符 | +=,-=,*=,/= | |
关系运算符 | >,<,>=,<=,==,!= instanceof | |
逻辑运算符 | &&,||,!,^ | |
位运算符 | &,|,^,~ , >>,<<,>>> | |
条件运算符 | ? : | |
字符串连接符 | + |
2.算术运算符
算术运算符中+,-,*,/,%属于二元运算符,二元运算符指的是需要两个操作数才能 完成运算的运算符。其中的%是取模运算符,就是我们常说的求余数操作。 二元运算符的运算规则:
整数运算:
1.如果两个操作数有一个为 long, 则结果也为 long。
2.没有 long 时,结果为 int。即使操作数全为 short,byte,结果也是 int。
浮点运算:
1.如果两个操作数有一个为 double,则结果为 double。
2.只有两个操作数都是 float,则结果才为 float。
取模运算:
其操作数可以为浮点数,一般使用整数,结果是“余数”,“余数”符号和左 边操作数相同,如:7%3=1,-7%3=-1,7%-3=1。
算术运算符中++(自增),–(自减)属于一元运算符,该类运算符只需要一个操作数。
代码如下(示例7):一元运算符++与- -
/**
* 测试算数运算符的用法
* @Author smallwhite
* @createDate: 2022/5/18
*/
public class TestOperator01 {
public static void main(String[] args){
//自增、自减
int j = 10;
int k = j++;//先赋值,后自增
j = 10;
int m = ++j;//先自增,后赋值
//j--同理
System.out.println (k);//因为是先赋值,后自增,所以k的值为10
System.out.println (m);//因为是先自增,后赋值,所以m的值为11
}
}
运行该程序,执行结果如图2所示。
3.赋值及其扩展赋值运算符
运算符 | 用法举例 | 等效表达式 |
---|---|---|
+= | a += b | a = a+b |
-= | a -= b | a = a-b |
*= | a *= b | a = a*b |
/= | a /= b | a = a/b |
%= | a %= b | a = a%b |
代码如下(示例8):扩展运算符
/**
* 测试算数运算符的用法
* @Author smallwhite
* @createDate: 2022/5/18
*/
public class TestOperator01 {
public static void main(String[] args){
int a=3;
int b=4;
a+=b;//相当于a=a+b;
System.out.println("a="+a+"\nb="+b);
a=3;
a*=b+3;//相当于a=a*(b+3)
System.out.println("a="+a+"\nb="+b);
}
}
运行该程序,执行结果如图3所示。
4关系运算符
关系运算符用来进行比较运算,如表1-6所示。关系运算的结果是布尔值:true/false;
运算符 | 含义 | 示例 |
---|---|---|
== | 等于 | a == b |
!= | 不等于 | a != b |
< | 小于 | a < b |
> | 大于 | a > b |
<= | 小于或等于 | a <= b |
>= | 大于或等于 | a >= b |
注意事项
1. =是赋值运算符,而真正的判断两个操作数是否相等的运算符是==。
2. ==、!= 是所有(基本和引用)数据类型都可以使用。
3. > 、>=、<、<= 仅针对数值类型(byte/short/int/long,float/double 以及 char)。
代码如下(示例9):关系运算符
/**
* 测试关系运算符的用法
* @Author smallwhite
* @createDate: 2022/5/18
*/
public class TestOperator03 {
public static void main(String[] args){
int a = 3;
int b = 4;
boolean c = a >= b;
System.out.println(c);
char d = 'j';//char的值在0-65536之间可以通过int强制转换成数字
System.out.println( (int)d );
boolean e = d>=100;
System.out.println(e);
}
}
运行该程序,执行结果如图4所示。
5.逻辑运算符
Java 中的逻辑运算符如表 1-7 所示。逻辑运算的操作数和运算结果都是 boolean 值
运算符 | 说明 | |
---|---|---|
逻辑与 | &(与) | 两个操作数为 true,结果才是 true,否则是 false |
逻辑或 | |(或) | 两个操作数有一个是 true,结果就是 true |
短路与 | &&(与) | 只要有一个为 false,则直接返回 false |
短路或 | ||(或) | 只要有一个为 true, 则直接返回 true |
逻辑非 | !(非) | 取反:!false 为 true,!true 为 false |
逻辑异或 | ^(异或) | 相同为 false,不同为 true |
短路与和短路或采用短路的方式。从左到右计算,如果只通过运算符左边的操作数就能 够确定该逻辑表达式的值,则不会继续计算运算符右边的操作数,提高效率。
代码如下(示例10):短路与和逻辑与
/**
* 测试逻辑运算符的用法
* @Author smallwhite
* @createDate: 2022/5/18
*/
public class TestOperator04 {
public static void main(String[] args){
boolean b1 = true;
boolean b2 = false;
System.out.println(b1&b2);//与:有一个false,结果就是false
System.out.println(b1|b2);//或:有一个true,结果就是true
System.out.println(!b2);//非:取反
System.out.println(b1^b2);//异或:相同true,不同false
//短路与、短路或
//int b3 = 3/0;//会报不能除以0的异常
boolean b3 = 1>2&&(4<3/0);
System.out.println (b3);
boolean b4 = 2>1||(4<3/0);
System.out.println (b4);
}
}
运行该程序,执行结果如图5所示。
6.位运算符
位运算指的是进行二进制位的运算,常用的位运算符如表1-8 所示。
位运算符 | 说明 |
---|---|
~ | 取反 |
& | 按位与 |
| | 按位或 |
^ | 按位异或 |
<< | 左移运算符,左移 1 位相当于乘 2 |
>>/td> | 右移运算符,右移 1 位相当于除 2 取商 |
代码如下(示例11):左移运算和右移运算
int a = 3*2*2;
int b = 3<<2; //相当于:3*2*2;
int c = 12/2/2;
int d = 12>>2; //相当于 12/2/2;
新手雷区
1.&和|既是逻辑运算符,也是位运算符。如果两侧操作数都是 boolean 类型,
就作为逻辑运算符。如果两侧的操作数是整数类型,就是位运算符。
2.不要把“^”当做数学运算“乘方”,是“位的异或”操作。
7.字符串连接符
“+”运算符两侧的操作数中只要有一个是字符串(String)类型,系统会自动将另一个 操作数转换为字符串然后再进行连接。
代码如下(示例11):连接符“+”
int a=12;
System.out.println("a="+a);//输出结果: a=12
8.条件运算符
语法格式: x ? y : z
其中 x 为 boolean 类型表达式,先计算 x 的值,若为 true,则整个运算的结果为 表达式 y 的值,否则整个运算结果为表达式 z 的值。
代码如下(示例12):条件运算符
/**
* 测试条件运算符*
* @Author smallwhite
* @createDate: 2022/5/18
*/
public class TestOperator06 {
public static void main(String[] args){
int score = 90;
String a = score<60?"不及格":"及格";
System.out.println(a);
/*if(score<60){
a = "不及格";
9 }else{
a = "及格";
}*/
//作用与(score<60?"不及格":"及格")一样
int x = -100;
int flag = x > 0 ? 1 : (x == 0 ? 0:-1);
System.out.println (flag);//结果:-1
}
}
运行该程序,执行结果如图所示。
总结
以上就是今天要讲的内容,本文简单介绍了java的八种基本数据类型的使用和运算符的基本用法,希望对大家的java学习有所帮助。