1、算数运算符
1.1 问题
1 什么叫做运算符
2 什么叫做表达式
3 算术运算符有哪些
1.2 答案
1.2.1 运算符的概念
对常量或者变量进行操作的符号
1.2.2 表达式
用运算符把常量或者变量连接起来符合java语法的式子就可以称为表达式。
不同运算符连接的表达式体现的是不同类型的表达式。
举例说明:
int a = 10;
int b = 20;
int c = a + b;
+:是运算符,并且是算术运算符。
a + b:是表达式,由于+是算术运算符,所以这个表达式叫算术表达式。
1.2.3 算术运算符的分类
注意:
- /和%的区别:两个数据做除法,/取结果的商,%取结果的余数。
- 整数操作只能得到整数,要想得到小数,必须有浮点数参与运算。
public class Demo1Operator {
public static voidmain(String[] args) {
System.out.println(5 / 2);
System.out.println(5 / 2.0);
System.out.println(5.0 / 2);
System.out.println(5.0 /2.0);
System.out.println("---------------------");
System.out.println(5 % 2);
System.out.println(4 % 2);
}
}
2、字符的+操作
2.1 问题
1 字符的+操作运算过程
2 什么是ASCII码表
3 为什么要有这样的码表
2.2 答案
2.2.1 字符的+操作运算过程
当(byte short char int)在一起运算的时候,都会提升为int之后,再进行运算;char提升为int的过程,就是查找码表中,字符所对应的数值表示形式
2.2.2 ASCII码表
ASCII (American Standard Code for Information Interchange):美国信息交换标准代码,是计算机中字节到字符的一套对应关系。通俗讲就是每个字符都有一个对应的数字
常见的char类型数据代表的int值
'a'----97 'A'----65 '0'----48
举例:
int a = 'A' + 1;
//1.根据'A'查找码表找到对应的数值 65
//2.需要提升为int类型
//3.进行算数运算 得到结果66 int类型
//4.将结果赋值给变量a
举例: 大写转小写
char c='A';
char c1=(char)(c+32);
2.2.3 为什么要有这样的码表
计算机中数据的存储,都是以字节的形式在进行存储,我们不会直接操作繁琐的、不便于记忆的字节
2.3 补充
进制相关
在计算机内部所有的数据都使用二进制表示,每一个二进制位(bit)有0和1两种
因此8个二进制位就可以组合出256种状态,,这被称为一个字节(byte)
一个字节一共可以用来表示256种不同的状态。每一种状态都有一个符号,就是256个符号。
从00000000到11111111
ASCII码:上世纪60年代美国制定了一套字符编码。对英语字符与二进制位之间的关系,做了统一的规定。这被称为ASCII码, ASCII码一共规定了128个字符的编码,比如空"space"是32 (二进制是00100000) 大写字母A是65(二进制01000001).这128个符号。包括32个不能打印出来的控制符号。只占用一个字节后面的7位。
最前面的一位统一规定为0。
缺点:
1 不能表示所有字符
2 相同的编码表示的字符不一样, 假设120在法语编码表中代表(你) 可能在希伯语编码中代表另一个意思 所以各个国家都有了自己的字符集 比如中国的就是GBK GB2312 中国台湾的big5(繁体编码)
乱码: 世界上存在着多种编码方式。从一个二进制数字可以被解释成不同的符号,
因此想要打开一个文本文件就必须知道它的编码方式,否则用错误的编码方式解读就会出现乱码.
Unicode:一种编码将世界上所有的符号都纳入其中。每一个符号都赋予一个独一无二的编码,
使用Unicode没有乱码的问题,所以也叫万国码
Unicode缺点:Unicode只规定了符号的二进制代码。却没有规定这个二进制代码应该是如何存储的 ,无法区别Unicode和ASCII:计算机无法区分三个字节表示一个符号,还是分别表示三个符号。另外我们知道英文字母只用一个字节表示就够了,如果Unicode统一规定,。每一个符号用三个或4个字节表示.那么每个英文字母前都必然有2~3个字节是0,这是对存储空间来说是极大的浪费。
Unicode方向是比较大的。真正落地的实现是下面这种方式
UTF-8:是在互联网上使用最广泛的一种Unicode的实现方式。
UTF-8是一种变长的编码方式。它可以使用1~6个字节来表示一个符号。根据不同的符号而变化字节长度。
后边的学习乃至工作开发中都是会用这个编码方式
3、字符串的+操作
3.1 问题
1 字符串是什么数据类型
2 字符串的表现形式
3 字符串的+操作是什么意思
3.2 答案
3.2.1 字符串
字符串是引用数据类型;用一对双引号包裹起来的
3.2.2 字符串的+操作
当“+”操作中出现字符串时,这个”+”是字符串连接符,而不是算术运算
public class Test {
public static voidmain(String[] args) {
System.out.println(1 + 23);
System.out.println("年龄为:" +23);
System.out.println(1 + 99 +"年黑马");
}
}
3.3 练习
char c='a';
int num=10;
String s="hello";
System.out.println(c+num+s);
System.out.println(c+s+num);
System.out.println(c+(num+s));
System.out.println(s+num+c);
System.out.println(s+(num+c));
4、案例:数值拆分
4.1 拆分规则
个位 :数值 % 10
十位 :数值 / 10 % 10
百位 :数值 / 10 / 10 % 10
千位 :数值 / 10 / 10 / 10 % 10;
4.2 练习
键盘录入一个四位数,获取该数字各个位置上的数据值并打印
5、自增自减运算符
5.1 问题
1 自增自减的符号
2 参与操作,在前和在后的区别
5.2 答案
5.2.1 符号
++和-- 既可以放在变量的后边,也可以放在变量的前边。单独使用的时候, ++和-- 无论是放在变量的前边还是后边,结果是一样的。
5.2.2 参与操作
如果放在变量的后边,先将该变量原本的值,取出来参与操作,随后再进行自增(++),自减(--)
如果放在变量的前边,先对该变量做自增(++)或者自减(--),然后再拿变量参与操作
5.3 练习
需求:看程序,不提前运行,说结果
代码1:
int a = 1;//这三个a是同一个,存储空间是一样的,其中一个改变其他的使用时候都变了
int b = a++ + a++;
分析:
int b = (1) + (2);//表达式
a值变化:1 -- 2 -- 3
a值?b值?
代码2:
int a = 1;
int b = ++a + a++;
int b = (2) + (2);//表达式
a值变化:1 2 3
a值?b值?
代码3:
int a = 1;
int b = ++a + ++a;
int b = (2) + (3);
a值变化:1 2 3
a值?b值?
注意点:
short s1=10;
s1++;//自增1不会改变自身的变量的数据类型
5.4 注意事项
使用自增/自减运算时应注意下面几个问题。
自增/自减只能作用于变量,不允许对常量、表达式或其他类型的变量进行操作。常见的错误是试图将自增或自减运算符用于非简单变量表达式中。
自增/自减运算可以用于整数类型byte、short、int、long,浮点类型 float、double,以及字符串类型char。
在 Java 1.5 以上版本中,自增/自减运算可以用于基本类型对应的包装器类Byte、Short、Integer、Long、Float、Double 和 Character。注:就业班会讲包装类
6、赋值运算符
6.1 问题
1、赋值运算符的作用
2、基本赋值运算符有哪些?
3、扩展赋值运算符有哪些
6.2 答案
6.2.1 作用
赋值运算符的作用是将一个表达式的值赋给左边,左边必须是可修改的,不能是常量。
6.2.2 基本赋值运算符
符号:=
作用:赋值
说明:将等号右边的数据值赋值给等号左边的变量(a = 10; 将10赋值给a变量)
6.2.3 扩展赋值运算符
注意事项:
扩展的赋值运算符隐含了强制类型转换。
short s = 10;
s = s + 10; // 此行代码报出,因为运算中s提升为int类型,运算结果int赋值给short可能损失精度
s += 10; // 此行代码没有问题,隐含了强制类型转换,相当于 s = (short) (s + 10);
7、关系运算符(比较运算符)
7.1 问题
1 关系运算符分类
2 关系运算符的结果是什么
3 =和==的区别
7.2 答案
7.2.1 分类
关系运算符有6种关系,分别为小于、小于等于、大于、等于、大于等于、不等于
7.2.2 结果
关系运算符的结果都是boolean类型,要么是true,要么是false。
7.2.3 =和==的区别
千万不要把“==”误写成“=”,"=="是判断是否相等的关系,"="是赋值。
=赋值运算符
==比较运算符
比较基本数据类型,比较的是数据值本身
比较引用数据类型,比较的是地址值(后续学习)
7.3 代码示例
int a = 10;
int b = 20;
System.out.println(a == b); // false
System.out.println(a != b); // true
System.out.println(a > b); // false
System.out.println(a >= b); // false
System.out.println(a < b); // true
System.out.println(a <= b); // true
// 关系运算的结果肯定是boolean类型,所以也可以将运算结果赋值给boolean类型的变量
boolean flag = a > b;
System.out.println(flag); // 输出false
8、逻辑运算符
8.1 问题
1、逻辑运算符的概念
2、逻辑运算符的分类
3、逻辑运算符的作用
8.2 答案
8.2.1 概念
- 理解层面:逻辑运算符,可以用来整合多个条件,为一段整体的逻辑
- 代码层面:连接布尔类型的表达式, 或者是值
8.2.2 分类
8.2.3 作用
用于(整合)多个比较表达式的条件,最终得到的结果是boolean类型的true或false。
其实就是用来连接关系表达式的运算符(也可以直接连接布尔类型的常量或者变量)
9、短路逻辑运算符
9.1 问题
1、分类
2、作用
9.2 答案
9.2.1 分类
9.2.2 作用
在逻辑与运算中,只要有一个表达式的值为false,那么结果就可以判定为false了,没有必要将所有表达式的值都计算出来,短路与操作就有这样的效果,可以提高效率。同理在逻辑或运算中,一旦发现值为true,右边的表达式将不再参与运算
计算规则:
- 逻辑与&,无论左边真假,右边都要执行。
- 短路与&&,如果左边为真,右边执行;如果左边为假,右边不执行。
- 逻辑或|,无论左边真假,右边都要执行。
- 短路或||,如果左边为假,右边执行;如果左边为真,右边不执行。
9.3 代码示例
int x = 3;
int y = 4;
System.out.println((x++ > 4) & (y++ > 5)); // 两个表达都会运算
System.out.println(x); // 4
System.out.println(y); // 5
System.out.println((x++ > 4) && (y++ > 5)); // 左边已经可以确定结果为false,右边不参与运算
System.out.println(x); // 4
System.out.println(y); // 4
备注:开发中推荐使用短路运算符
10、三元运算符
10.1 问题
1、格式
2、执行流程
10.2 答案
10.2.1 格式
关系表达式 ? 表达式1 : 表达式2;
10.2.2 执行流程
问号前面的位置是判断的条件,判断结果为boolean型。
为true时调用表达式1,为false时调用表达式2。
其逻辑为:如果条件表达式成立或者满足则执行表达式1,否则执行第二个。
10.3 示例代码
int a = 10;
int b = 20;
int c = a > b ? a : b; // 判断 a>b 是否为真,如果为真取a的值,如果为假,取b的值
10.4 注意事项
1.表达式1和2要有明确的计算结果,不能写输出语句
int max = num1 > num2 ?System.out.println(num1) : System.out.println(num);
//大错特错
2.三元运算符的运算结果不能直接摆在那里,要么定义变量接收,要么直接打印输出
num1 > num2 ? num1 : num2; //错误的
int num = num1 > num2 ? num1: num2;
可以直接打印(单纯展示数据)
System.out.println(num1 >num2 ? num1 : num2);
3.表达式1和2 结果要有一个统一的类型
double d = 10 > 5 ? 2 : 1.0; 提升,隐式转换
???=10 > 5 ? "2" : 1.0;
4.三元运算符可以嵌套使用:
int a=10,b=20;
String result=a>b?"a大":"b大";
如果a和b相等嵌套一下
String result=a>b?"a大":(a==b?"相等":"b大");
11、案例:三个和尚
求三个数的最大值
import java.util.Scanner;
public class Test2Operator {
public static voidmain(String[] args) {
//1.使用Scanner键盘录入三个整数
Scanner sc = newScanner(System.in);
System.out.println("请输入三个整数:");
int num1 = sc.nextInt();
int num2 = sc.nextInt();
int num3 = sc.nextInt();
//2:用三元运算符获取前两个整数的最大值,并用临时变量保存起来。
int temp = num1 > num2 ? num1: num2;
//3:用三元运算符,让获取临时最大值和第三个数比较,得到结果。
int max = temp > num3 ? temp: num3;
//4:输出结果
System.out.println("最大值是:"+ max);
}
}
思考:
如果我要求三个数的最小值呢?
只要把里面的大于号变成小于号就可以了
12、运算符的优先级
在Java中,运算符优先级如下图所示:
有没有觉得很麻烦,很头疼?所以,这些优先级我们不需要记忆。
只要知道一点即可:小括号优先于所有!
在计算的时候必定是先计算小括号里面的,再计算小括号外面的。
代码示例:
int a = 10;
int b = 20;
System.out.println(a > b || a< b && a > b);//代码阅读性很差
-----------改写如下--------------
int a = 10;
int b = 20;
System.out.println((a > b) ||(a < b && a > b));//代码阅读性很好