1、数学函数
在java中有一个Math类,其中包含了各种各样的数学函数,查看jdk1.8可知,Math类提供了两个常量。
Math.PI:圆周率(π)的近似值;
Math.E:自然对数的基(e)
下面列举Math类提供的常用方法:
Math.pow(x,a):返回x的a次幂。参数都为double类型,返回值为double类型
double a = Math.pow(3,2);
System.out.println(a); //输出结果为 9.0
Math.sqrt(x):返回x的平方根,x为double类型,返回值为double类型
double b = Math.sqrt(4);
System.out.println(b); //输出结果为 2.0
Math.round(x):根据参数x的类型(float、double)返回最接近参数的整数值(int、long)
long c = Math.round(3.4);
System.out.println(c); //四舍五入操作 当参数为double类型时,返回值为long类型 输出结果为 3
int d = Math.round(5.6F);
System.out.println(d); //四舍五入操作 当参数为float类型时,返回值为int类型 输出结果为 6
Math.abs(x):返回参数x的绝对值。x为int、long、float、double类型
int e = Math.abs(-1);
System.out.println(e); //输出结果为 1
double f = Math.abs(-4.3);
System.out.println(f); //输出结果为 4.3
Math.cbrt(x):返回x的立方根 x为double类型 返回值为double类型
double g = Math.cbrt(8);
System.out.println(g); //输出结果为 2.0
Math.random():随机返回一个大于等于0且小于1的double类型数据
double h = Math.random();
System.out.println(h); //生成随机数 随机返回一个大于等于0且小于1的double类型数值
2、赋值运算符
在java中,赋值运算符使用 “ = ” 表示。比如:
int a = 12;
此处是指将12这个值赋给变量a,而不是说a等于12。在java中,用 “==” 表示相等。值得一提的是,此处拓展出一个比较经典的题目。如:
byte a = 12;
a += 3; //编译通过
a = a+3; //编译报错
a = (byte)(a+3); //编译通过
我们之前学习java基本数据类的时候说过,整数类型的数据如果不特别强调,默认为int类型,这样我们就不难理解 : a =a+3 会报错了,因为系统会把3看成是一个int类型数据,当int类型数据与byte类型数据一起运算时,结果会自动提升为int类型,而此处定义的a为byte类型,且没有进行强制转换,所以编译报错。而 a = (byte)(a+3)可以正确表示,但是显得比较复杂。相比之下,a += 3;这种写法的优势就体现出来了,+= 运算符可以简化运算,也不会改变等号右边运算的数据类型。
3、一元运算符(自增、自减)
一元运算符指只有一个参数参与运算。本次讨论:a++、++a、a--、--a
public class Operator {
public static void main(String[] args) {
int a = 12;
int b =3;
int m = 2*(a++);
System.out.println(m); //输出结果 m等于24
int n = 2*(++b);
System.out.println(n); //输出结果 n等于8
}
}
首先来讨论m值是如何得来的,a++表示当a参与运算之后加1,所以 2*(a++)在此次运算中,a还是12,当执行“2*(a++)”之后a的值才加1。所以此处2*(a++)的值为24,即2*12 = 24, 然后赋值给m,输出m为24;
n的值的生成道理正好相反,++b表示当b参与运算之前加1,所以 2*(++b)在此次运算中,b的值加1之后再参与运算,相当于2*(b+1)操作,即2*(3+1)= 8,然后赋值给n,输出n为8;
总结一下,当++或者--符号在变量之前(如++b),表示先执行加1操作再参与运算,当++或者--符号在变量之后(如a++),表示先执行运算,然后此次运算结束后变量的值加1。
4、关系运算符
运算符 | 含义 |
== | 等于 |
< | 小于 |
> | 大于 |
<= | 小于等于 |
>= | 大于等于 |
只有数字才能比较大小,比较结果为:true或false
5、逻辑运算符
运算符 | 含义 |
&& | 与 |
|| | 或 |
^ | 异或 |
| | 简化或 |
& | 简化与 |
! | 简化非 |
看下面例子:
public class Operator {
public static void main(String[] args) {
int a = 0;
int b = 4;
if(a != 0 & 4/a>1){
System.out.println("1");
}else{
System.out.println("2");
}
}
}
从逻辑上来看,当 a != 0 并且 4/a>1 输出1,否则输出2,没错。但是当程序执行时就会报错,因为在进行条件判断时,系统会把&前后两个语句都进行判断,而当a == 0时,4/a>1中检测到分母为0,所以程序报错。
public class Operator {
public static void main(String[] args) {
int a = 0;
int b = 4;
if(a != 0 && 4/a>1){
System.out.println("1");
}else{
System.out.println("2");
}
}
}
再来看这段程序,跟上一个程序相比只是把&运算符换成了&&,发现程序可以正常运行,并输出 2 。这就是“短路”与 的好处,如果&&之前的语句就可以判断出整个表达式的值,&&后面的操作数就不用再计算了。就像例子中的 a!=0 为 false,在 与 运算中,一假则假,所以表达式(a!=0 && 4/a>1)就会直接返回false,4/a>1也被直接跳过,所以程序不会报错。
同理可知,||和|也差不多,如果||前面的操作数为true,那么整个表达式都为true,后面的操作数也不会再去计算。因此,很多时候大家都喜欢使用&&和||来进行逻辑运算,避免程序出错。
6、三元运算符
语法:
(表达式1)?(值1):(值2)
意思是当表达式1为true时,返回值1,否则返回值2。三元运算符与if(){}else{}相比更加简洁。
7、位运算符
运算符 | 名称 | 含义 |
& | 按位与 | 当两“位”同时为1时,才返回1 |
| | 按位或 | 只要有一“位”为1时,就返回1 |
~ | 按位非 | 将操作数的每个位(包括符号位)全部取反 |
^ | 按位异或 | 当两“位”相同时,返回0,当两“位”不同时,返回1 |
<< | 左移运算符 | 每左移一位,乘以一个2 |
>> | 右移运算符 | 每右移一位,除以一个2 |
一说到位运算符就涉及到一些操作系统知识,像原码、补码和反码等,我们留到下一篇文章来详细解释。
8、算术运算符
运算符 | 含义 |
+ | 加 |
- | 减 |
* | 乘 |
/ | 除 |
% | 求余 |
算术运算符在生活中也用的比较多,比较简单,注意计算机中整数的除法结果仍为整数。
public class Operator {
public static void main(String[] args) {
int a = -5;
int b = 7;
System.out.println(a%b);//输出结果为 -5
System.out.println(a/b); //输出结果为 0
}
}