网站首页 > java教程 正文
3.7 运算符
运算符是一种特殊的符号,用以表示数据的运算、赋值和比较等。Java语言使用运算符将一个或多个操作数据连接成执行性语句,用以实现特定功能。
算术运算符
赋值运算符
比较运算符
逻辑运算符
位运算符
类型相关运算符
3.7.1 算术运算符
加法运算(+)、减法运算(-)、乘法运算(*)、除法运算(/)、取余(取模)运算(%)、自加运算(++)、自减运算(--)、(+)还可以做为字符串的连接符。
举例1:
int a = 12;
int b = 24;
System.out.println("加法运算:"+(a+b));
System.out.println("减法运算:"+(a-b));
System.out.println("乘法运算:"+a*b);
System.out.println("除法运算:"+a/b);
System.out.println("取模运算:"+a%b);
int c = --a; //先自己做了一次自减运算,再将a的值给了c
System.out.println(c);
System.out.println(a);
c = b--; //先将b的值给了c,然后再自己做了一次自减运算
System.out.println(c);
System.out.println(b);
int x = 4;
int y = (x++)+(++x)+(x*10);
System.out.println(“x:”+x);
System.out.println(“y:”+y);
System.out.println("hello"+'a'+1);
System.out.println('a'+1+"hello");
System.out.println("5+5="+5+5);
System.out.println(5+5+"=5+5");
//字符串数据和其他数据做+,结果是字符串类型。
//这里的+不是加法运算,而是字符串连接符。
3.7.2 赋值运算符
Java使用“=”作为赋值运算符,为变量指定变量值。举例:
int a = 5; String b = “abc”;
3.7.3 位运算符
Java支持的运算符有7个:按位与(&)、按位或(|)、按位非(~)、按位异或(^)、左移运算符(<<)、右移运算符(>>)、无符号右移运算符(>>>)。使用位运算符,我们必须先把数据换算成二进制,然后再参加运算。
基本运算法则
第一个运算数 | 第二个运算数 | 按位与(&) | 按位或(|) | 按位异或(^) |
0 | 0 | 0 | 0 | 0 |
0 | 1 | 0 | 1 | 1 |
1 | 0 | 0 | 1 | 1 |
1 | 1 | 1 | 1 | 0 |
按位非运算,举例:
int a = 19; System.out.println(~a); //输出结果为-20
运算原理:19的二进制表示方式为:0001 0011按位非运算为:1110 1100 按位计算后的值为补码,(计算机都是按照补码进行表示的),根据补码获取它的反码,前面为1表示为负数,负数的反码是:补码减1,因此其反码为1110 1011,其原码为1001 0100,转换成十进制为-20。
按位异或运算有一个特点:一个数据对另一个数据异或两次,该数本身不变。
int a = 5;
int b = 6;
System.out.println(a^b^b);
System.out.println(a^b^a);
位移运算符:转换为32位后再参加运算。
左移运算:把第一个操作数的二进制码向左移动指定位数,右边空出来的位数以0填充。正数直接换算成二进制就可以了。
右移运算:Java的右移运算符有两个>>和>>>,对于>>运算符,把第一个操作数的二进制码向右移动指定位数后,左边空出来的位数以原来的的符号位填充,如果是正数用0填充,如果是负数用1填充,>>>运算符移动后,只用0填充。
举例:
-5>>2
-5的原码是 1000 0101,
它的反码为:1111 1010,
它的补码为:1111 1011,
右移两位为: 1111 10,
前面用符号位填充为:1111 1110(补码)。
将补码转换成十进制数:
先变成反码:1111 1101,
其原码为:1000 0010,
表示十进制数为:-2。
-32<<3 这个问题。 -256
注意了:
正数的的位移可以这么做。
<< 就是把<<左边的数据乘2的移动次幂。例如:3<<2 3*2^2 = 12;
>> >>>就是把>>左边的数据除2的移动次幂。例如:24>>2 24/2*2 = 6;
面试题:
一、实现两个整数变量的交换。
int a = 4; int b = 5;
1. 借助第三个变量。
2. 使用位异或运算符实现
左边:a,b,a
右边:a^b
a = a^b;
b = a^b;
a = a^b;
3. 用变量相加的做法
a = a+b;
b = a-b;
a = a-b;
再看看这个的值传递?
4. 一个组合语句
b = (a+b) – (a=b);
还是一个值的相互变换~
二、请用最有效率的方式写出计算2乘以8的结果?
2<<3 2*2^3
因为将一个数左移n位,就相当于乘以了2的n次方,那么,一个数乘以8只要将其左移3位即可,而位运算cpu直接支持的,效率最高,所以,2乘以8等於几的最效率的方法是2 << 3。
3.7.4 扩展后的赋值运算符
赋值运算符可以与算术运算符、位移运算符结合,扩展成为功能更加强大的运算符。
+=:对于x += y,表示 x = x + y;
-=:对于 x-= y,表示 x = x-y;
*=: x*= y,表示 x = x * y;
/= ; %=; &=; |=; ^=; <<= ; >>=; >>>=;
1.short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?
对于short s1 = 1; s1 = s1 + 1;由于s1+1运算时会自动提升表达式的类型,所以结果是int型,再赋值给short类型s1时,编译器将报告需要强制转换类型的错误。
对于short s1 = 1; s1 += 1;由于 +=是java语言规定的运算符,java编译器会对它进行特殊处理,隐藏着一个强制类型转换,因此可以正确编译。For:S1 = (short)(s1+1);
3.7.5 比较运算符
比较运算符用于判断两个变量或者常量的大小,比较运算的结果是一个boolean值(true或者false)
>:大于,只支持左右两边操作数是数值类型。
>=:同上
<:同上
<=:同上
==:同上,即使他们数据类型不相同,只要它们的值相同,也返回true,例如:97==’a’,返回true
? !=:不等于,如果进行比较的两个操作数都是数值类型,只要值不同就返回true,如果比较的是引用类型,只有当两个引用变量相同类型的实例时才可以比较,只要两个引用指向不是同一个对象就返回true,
举例1:
Car car1 = new Car();
TestCar car2 = new TestCar();
boolean result = (car1 ==car2); //两个类型不同不能进行比较
举例2:
Car car1 = new Car();
Car car2 = new Car();
boolean result1 = car1 !=car2;
boolean result2 = car1 ==car2;
System.out.println(result1); //输出结果为true
System.out.println(result2); //输出结果为false
举例3:
Car car1 = new Car();
Car car2 = car1;
boolean result = car1 ==car2;
System.out.println(result); //输出结果为true
3.7.6 逻辑运算符
逻辑运算符用于操作两个布尔型的变量或常量,逻辑返回的值为boolean类型,主要有6个,
&&:前后两个操作数都为true时,返回true,否则返回false,例如:32>24 &&“abc”==”abc”,返回true。在Java中,3<X<6这样写是错误的,要写成x>3&&x<6。
||:前后两个操作数,有个为true就返回true,举例:32>24 || “abc”!=”abc”,返回true
&(不短路与),|(不短路或),!(非),^(异或)
l “&”和“&&”的区别:
? 单&时,左边无论真假,右边都进行运算;
? 双&时,如果左边为真,右边参与运算,如果左边为假,那么右边不参与运算。
“|”和“||”的区别同理,双或时,左边为真,右边不参与运算。那你们说我们开发时用哪个?
l 异或( ^ )与或( | )的不同之处是:当左右都为true时,结果为false。
3.7.7 三目运算符
格式:
(关系表达式)?表达式1:表达式2;
如果条件为true,运算后的结果是表达式1;
如果条件为false,运算后的结果是表达式2;
举例:
int a= 5>3 ? 6 : 7;
int a = 3; int b = 4; int c = 5; 用三目运算符求出最大值。
(1) 可以用两个中间值作为接收结果来比较。
(2) 直接一步搞定。(a>b)?((a>c)?a:c):((b>c)?b:c);
3.7.8 运算符的优先级
运算符说明 | Java运算符 |
分隔符 | . [] () , ; |
单目运算符 | ++ -- ~ ! |
强制类型转换 | (type) |
乘除取模运算符 | * / % |
加减运算符 | + - |
位移运算符 | <<>>>>> |
关系运算符 | <<= >>= |
等价运算符 | == != |
按位与运算 | & |
按位异或运算 | ^ |
按位或运算 | | |
条件与运算 | && |
条件或运算 | || |
三目运算符 | ? : |
赋值运算符 | = += -= *= /= &= |= ^= %= <<= >>= >>>= |
猜你喜欢
- 2024-10-13 深度分析ClassLoader机制,不可错过这一篇
- 2024-10-13 RxJava2.X 源码解析(一):探索RxJava2分发订阅流程
- 2024-10-13 与其他语言相比,Java有多安全?(java语言有哪些缺点)
- 2024-10-13 JVM 配置参数 -D,-X,-XX 的区别
- 2024-10-13 mysql-connector-java与MySQL 8.X版本建立连接
- 2024-10-13 浙江大学终于把java整理成漫画书了,动画教学更生动,允许白嫖
- 2024-10-13 java 核心技术-12版 卷Ⅰ- 4.1 面向对象程序设计概述
- 2024-10-13 SpringBoot2.x配置多数据源(springboot如何配置多数据源)
- 2024-10-13 JAVA 中获取比X大1位数中最小的数
- 2024-10-13 玩大了!Log4j 2.x 再爆雷(log4j最新版本)
你 发表评论:
欢迎- 最近发表
-
- Java常量定义防暴指南:从"杀马特"到"高富帅"的华丽转身
- Java接口设计原则与实践:优雅编程的艺术
- java 包管理、访问修饰符、static/final关键字
- Java工程师的代码规范与最佳实践:优雅代码的艺术
- 编写一个java程序(编写一个Java程序计算并输出1到n的阶乘)
- Mycat的搭建以及配置与启动(mycat部署)
- Weblogic 安装 -“不是有效的 JDK Java 主目录”解决办法
- SpringBoot打包部署解析:jar包的生成和结构
- 《Servlet》第05节:创建第一个Servlet程序(HelloSevlet)
- 你认为最简单的单例模式,东西还挺多
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)