5种运算符:
1.赋值运算符,2.算术运算符,3.比较运算符,4.逻辑运算符,5.三元运算符
2.算术运算符(自增和自减)
自增:
自减:
在企业中禁止使用自增和自减,并不能够保证原子性,要么这三步全走了,要么这三步全都不走,再多线程高并发的时候,自增和自减很容易出现问题。
特例
自增之后依旧是100,即使程序顺序运行到输出num++之后的值,也依旧是100,原因是存在变量缓存机制,即使循环100次自增,结果输出num还是原来的值100
+拼接字符串
只要出现字符串,那么之后的所有数字都将看做是字符拼接在一起,如果需要运算几个数字可以用括号括起来,括号的优先级比较高
3.比较运算符(比较运算符的结果是Boolean类型,只有true/false两种结果)
==是比较两个变量的地址值是否相等
!=是比较两个变量的地址值是否不等
不管是基本数据类型还是引用数据类型,比较的都是地址值
下图代码很重要
package com.javasm.deom;
/**
* @author: JAVASM
* @classNAME: YunSuanFu1
* @description:
* @date: 2021/3/26 10:31
* @version:0.1
* @since:1.8
*/
public class YunSuanFu1 {
public static void main(String[] args) {
//比较运算符
int a=10;
int b=10;
//==比较的是地址值,a与b保存的数据都是10,因此在栈内存中的地址都是一样的, 都是储存10这个数据的内存单元的地址
System.out.println(a==b);//true
String str1="hello";
String str2="hello";
String str3=new String("hello");//用new开辟出来的字符串是一个对象,其存储在堆中,变量名依旧存储在栈中
System.out.println(str1==str2);//true
System.out.println(str1==str3);//false
// Str3存储在堆中,str1存储在栈中,虽然两者存储的内容相同,但两者存储的位置不同,而变量名储存的就是地址值,因此两者不相等
//很多时候我们要比较的并不是地址值,而是变量所存储的地址,该地址单元内存储的值或者说数据。String类为我们提供了equals功能,可以直接比较两个字符串内容
// 比较数据equals();-------> 字符串1.equals(字符串2)
System.out.println(str1.equals(str3));//进行内容比较,结果为true
System.out.println(str1 != str3);//比较两个字符串地址值不同,结果为true
}
}
内存示意图如下:
1.有时候可以直接把基本数据类型的比较看做是数据的比较,因为它们都存在于栈内存中,如果存储地址一样那么一定数据相等。
2.比较运算符的结果一定是Boolean类型,结果一定是true或者false。
4.逻辑运算符(短路与&&,逻辑与&,短路或||,逻辑或|)
代码演示如下:
位运算符&
位运算符|
位运算符^
5.三元(目)运算符(能使用三元运算符就用三元运算符,尽量不要使用if…else来写)
- 三元运算符的运算结果有多种,可能是整型,小数,布尔,字符,字符串,对象都是可以的。
- 必须用相同类型的变量来承接三元运算符得出的结果,或者使用比表达式类型高的数据类型来
承接结果,因为低转高是数据类型自动转换。 - 语法组成:
数据类型 变量 = (表达式boolean)?表达式1:表达式2;
变量的类型肯定与表达式1/表达式2相似(比运算结果高的数据类型来承接结果)或者一致的类型。
三元运算符代码演示:
能使用三元运算符就用三元运算符,尽量不要使用if…else来写。