第三章 JAVA 运算
3.1 运算符
3.1.1 概述
1. 运算符概念:对常量或者变量进行操作的符号,通常用于数据的比较或运算。
2. 举例:
10 + 20 = 30 中,+ 是运算符中的算术符。
3. 运算符分类:
算术运算符,赋值运算符,比较运算符,逻辑运算符,位移运算符,三元运算符。
3.1.2 算术运算符
1. 表达式:由常量,变量,运算符组成的符合java语法的式子就称为表达式,表达式都有结果,结果就是表达式的值。
public class Test {
public static void main ( String [ ] args) {
int a = 20 ;
int b = 8 ;
System . out. println ( "a+b=" + ( a + b) ) ;
System . out. println ( "a-b=" + ( a - b) ) ;
System . out. println ( "a*b=" + ( a * b) ) ;
System . out. println ( "a/b=" + ( a / b) ) ;
System . out. println ( "a%b=" + ( a % b) ) ;
System . out. println ( "a++:" + ( a++ ) ) ;
System . out. println ( "++a:" + ( ++ a) ) ;
a = 20 ;
b = 8 ;
System . out. println ( "a--:" + ( a-- ) ) ;
System . out. println ( "--a:" + ( -- a) ) ;
}
}
3.1.3 赋值运算符
public class Test {
public static void main ( String [ ] args) {
int a = 20 ;
int b = 8 ;
System . out. println ( "a+=b:" + ( a += b) ) ;
a = 20 ;
b = 8 ;
System . out. println ( "a-=b:" + ( a -= b) ) ;
a = 20 ;
b = 8 ;
System . out. println ( "a*=b:" + ( a *= b) ) ;
a = 20 ;
b = 8 ;
System . out. println ( "a/=b:" + ( a /= b) ) ;
a = 20 ;
b = 8 ;
System . out. println ( "a%=b:" + ( a %= b) ) ;
a = 20 ;
b = 8 ;
}
}
3.1.4 比较(关系)运算符
比较运算符是用于比较是否相等和关系大小的符号,计算结果为布尔值,true或者false。
1. 关系运算符就是对两个变量存储的数值大小进行比较,是一个二元操作符(有两个参数)
2. 比较运算符只有两种boolean类型的值,true和false
3. equals() 比较两数内存中的值是否相等
4. == 比较两个值内存地址是否相同
public class Test {
public static void main ( String [ ] args) {
int a = 10 ;
int b= 30 ;
System . out. println ( "a==b?" + ( a== b) ) ;
System . out. println ( "a!=b?" + ( a!= b) ) ;
System . out. println ( "a>b?" + ( a> b) ) ;
System . out. println ( "a<b?" + ( a== b) ) ;
System . out. println ( "a>=b?" + ( a>= b) ) ;
System . out. println ( "a<=b?" + ( a<= b) ) ;
}
}
3.1.5 逻辑运算符
用于连接两个boolean类型(逻辑)数据的运算符,只能运算boolean类型的数据,运算结果为boolean类型。
public class Test {
public static void main ( String [ ] args) {
boolean a = true ;
boolean b = true ;
boolean c = false ;
boolean d = false ;
System . out. println ( "true & true :" + ( a& b) ) ;
System . out. println ( "true & false :" + ( a& c) ) ;
System . out. println ( "true | false :" + ( a| c) ) ;
System . out. println ( "false | false :" + ( d| c) ) ;
System . out. println ( "true ^ true :" + ( a^ b) ) ;
System . out. println ( "false ^ false :" + ( d^ c) ) ;
System . out. println ( "!a:" + ( ! a) ) ;
System . out. println ( "!c:" + ( ! c) ) ;
int x = 3 ;
int y = 4 ;
System . out. println ( ( x> y) && ( x< y) ) ;
System . out. println ( ( x< y) && ( x> y) ) ;
System . out. println ( ( x> y) || ( x> y) ) ;
System . out. println ( ( x< y) || ( x> y) ) ;
}
}
&,&& 和|,|| 的异同
1.&&和&相同点:
&是逻辑与,&&短路与。两个执行最终结果相同,表达式左右只要有一个为false 结果为false。
2. &&和&不同点:
如果表达左边已经为false && 右边就不执行了。
3.|和||相同点:
|是逻辑或,&&短路或。两个执行最终结果相同,表达式左右只要有一个为true 结果为true。
4.|和||不同点:
如果表达左边已经为true ||右边就不执行了。
- 口诀:
& 一假则假,全真为真
| 一真为真, 全假为假
! 结果取反
^ 相同为假, 不同为真
3.1.6 三元运算(三目运算)
1. 别名:三目运算符,同时可以操作三个数据或者表达式的运算符
2. 格式:表达式?值:值;------取值:左真右假。
表达式是布尔类型表达式
3. 使用三目运算的优点:节省代码
class S0305 {
public static void main ( String [ ] args) {
int score = 59 ;
if ( score >= 60 ) {
System . out. println ( "小明考试及格" ) ;
}
if ( score < 60 ) {
System . out. println ( "小明考试不及格" ) ;
}
System . out. println ( score >= 60 ? "小明考试及格" : "小明考试不及格" ) ;
int i = 1 ;
System . out. println ( i == 0 ? false : true ) ;
}
}
3.1.7 位运算
1. 位运算的概念
1. 位运算:就是对二进制数据进行数字操作的一些规则
2. 位运算在对源码进行分析或者自己研发工具时会大量使用到,比如HashMap源码中就涉及到位运算
3. 位运算的优势:直接对计算机中的二进制数据进行操作,速度快效率高
4. 位运算分为:
(1)按位非-- ~
(2)按位与-- &
(3)按位或-- |
(4)按位异或-- ^
(5)按位左移-- <<
(6)按位右移-- >>
(7)无符号按位右移-- >>>
5. 注意:除了按位非~ 是操作一个二进制数的,其他按位运算都是操作两个二进制数,故都叫二运操作符
2. 按位非-- ~
按位非-- ~:
将二进制数每一位(包括符号位)都取反:0变成1,1变成0
public class Test {
public static void main ( String [ ] args) {
byte num = 10 ;
byte num1 = ~ num ;
System . out. println ( num1) ;
}
}
3. 按位与-- &
按位与-- &:
将参与运算的两个数的二进制进行&运算,都为1,&为1,其他的&为0
public class Test {
public static void main ( String [ ] args) {
byte num1 = 10 ;
byte num2 = 11 ;
System . out. println ( num1& num2) ;
}
}
4. 按位或-- |
按位或-- |:
将参与运算的两个数的二进制进行|运算,都为0,|为0,其他的|为1
(1)两参数为一正一负时运算结果是负数
(2)两参数均为整数或者均为负数时,运算结果都是正数
public class Test {
public static void main ( String [ ] args) {
byte num1 = 10 ;
byte num2 = 11 ;
System . out. println ( num1| num2) ;
}
}
5. 按位异或-- ^
按位异或-- ^:
对应位上数据相同返回0,数据不同返回1
(1)两参数为一正一负时运算结果是负数
(2)两参数均为整数或者均为负数时,运算结果都是正数
public class Test {
public static void main ( String [ ] args) {
byte num1 = 10 ;
byte num2 = 11 ;
System . out. println ( num1^ num2) ;
}
}
6. 按位左移-- <<
1. 按位左移-- <<: 二进制位上的数据统一向左移动指定位数,高位(不包括符号位)移除,地位补0,符号位不变
2. 左移超出对应类型最大值或者最小值就截断(丢弃)符号位,使用左移后的最高位作为符号位,数据的符号位可能会改变,否则符号位不变
3. 若是byte(8位)或者short(16位),会自动扩大类型为int类型(32位)
4. 若运算数是int类型:每移动1位,第31位就要被移除丢弃(左移后的数据不超过int类型的最大值和最小值)
5. 若运算数是long类型:每移动1位,第63位就要被移除丢弃(左移后的数据不超过long类型的最大值和最小值)
int num1 = 10 ;
System . out. println ( num1<< 3 ) ;
int num2 = 10 ;
System . out. println ( num1<< 28 ) ;
int n = 5 ;
int m = n<< 3 ;
System . out. println ( "5*8=" + m) ;
}
}
7. 按位右移-- >>
分为带符号按位右移和无符号右移
1. 带符号按位右移-- >>: 二进制位上的数据统一向右移动指定位数,低位丢弃,符号位不变(不参与移动)
2. 带符号按位右移-- >>: 二进制位上的数据统一向右移动指定位数,低位溢出,高位补0,符号位跟着移动
public class Test {
public static void main ( String [ ] args) {
int num1 = 10 ;
System . out. println ( num1>> 1 ) ;
int num2 = 10 ;
System . out. println ( num1>>> 2 ) ;
}
}
3.2 键盘录入之Scanner类
3.2.1 Scanner类
1. 键盘输入:Scanner类,来自java.util包,是JDK提供的类型。
2. 作用:在程序运行中,可以使用Scanner类来获取从键盘输入的数据,提高数据来源灵活度。
3.2.2 Scanner类使用步骤:
1.导包, ---目的:让JDK定位到Scanner类型所在的具体位置。
import java.util.Scanner;
2. 创建键盘录入对象,如
Scanner sc = new Scanner(System.in);
3.调用sc对象的nextInt()方法,获取键盘录入的一个整数
int x = sc.nextInt();
4.使用x
import java. util. Scanner ;
public class Test {
public static void main ( String [ ] args) {
Scanner sc = new Scanner ( System . in) ;
System . out. println ( "请输入第1个数:" ) ;
int a = sc. nextInt ( ) ;
System . out. println ( "请输入第2个数:" ) ;
int b = sc. nextInt ( ) ;
System . out. println ( "两数之和为:" + ( a+ b) ) ;
}
}
案例:2 键盘录入三整数求最大值 键盘录入一整数,判断奇偶
import java. util. Scanner ; 2 class S0307 {
public static void main ( String [ ] args) {
Scanner sc = new Scanner ( System . in) ;
int a = sc. nextInt ( ) ;
int b = sc. nextInt ( ) ;
int c = sc. nextInt ( ) ;
int max = 0 ;
max = a > b ? a : b;
max = max > c ? max : c;
System . out. println ( max) ;
int x = sc. nextInt ( ) ;
System . out. println ( x % 2 == 0 ? "偶数" : "奇数" ) ;
}
}
3.3 随机数
3.3.1 Random类
1. Random类概述
1. JDK提供了一个类, 类名Random, 主要功能 : 可以生成**指定范围内**的任意一个随机数
2. Random来自于java.util路径下
2. Random类使用步骤:
1. 导包 - import java.util.Random;
2. 创建Random类对象:Random ran = new Random();
3.使用ran对象名,调用功能方法
int i = nextInt(int count);--> 参数count表示需要随机生成的数据的范围(0~count-1), 此方法生成数据范围
注意 : 生成的随机数, 可以使用一个变量将其结果保存下来
4.后续随机数使用。
import java. util. Random ;
public class Test {
public static void main ( String [ ] args) {
Random ran = new Random ( ) ;
for ( int i= 0 ; i< 10 ; i++ ) {
int number = ran. nextInt ( 100 ) + 1 ;
System . out. print ( number+ "\t" ) ;
}
}
}
3.3.2 UUID类
1. UUID(随机ID生成类)相当于封装处理了Random 类,主要用于给数据库表指定主键的时候使用的非常多。
2. UUID类使用
(10)导包:
import java.util.UUID;
(2)调用UUID类中的.randomUUID()方法:
UUID u = UUID.randomUUID();
随机ID生成类.类中的静态(static)方法是可以通过类名.方法名();直接调用的。
(3)后续使用。
import java. util. UUID; 2 class S0309 {
public static void main ( String [ ] args) {
UUID u = UUID. randomUUID ( ) ;
System . out. println ( u) ;
}
}