一、运算符
A:算术运算符:+,-,*,/,%模(取余)
a.+的几种作用:加法;正数;字符串连接符(应用最广泛)
b./:整数相除,只能得到整数;
要想得到小数,可以给分子或者分母乘以一个浮点类型数据
c.%:模(除法):取的是余数
例1:
/*
*题目1
*int a = 10;
int b = 10;
int c = 10;
a = b++;
c = --a;
b = ++a;
a = c--;
请分别计算出a,b,c的值
题目2:
int a = 4;
int b = (a++)+(++a)+(a*10);
* */
public class OperatorTest {
public static void main(String[] args) {
int a = 10 ;
int b = 10 ;
int c = 10 ;
a = b++;//a=10,b=11,c=10
c = --a;// a=9,b=11,c=9
b = ++a;// a=10,b=10 ,c = 9
a = c -- ;//a=9,b=10,c = 8
System.out.println("a:"+a);
System.out.println("b:"+b);
System.out.println("c:"+c);
System.out.println("----------------");
int x = 4 ;
int y = (x++)+(++x)+(x*10);
//x:4,5,6
//y= 4 +6+60
System.out.println("x:"+x);
System.out.println("y:"+y);
}
}
【扩展的算术运算符:++,--】
1.++或者--单独使用:
无论++或者--在前还是在数据的后面,都是自增1或者自减1
2.++或者--参与运算的使用:
++和--在数据的后面,先参与运算(赋值),然后在自增1或者自减1;
++和--在数据的前面,先自增1,或者自减1,然后把最终的得到的结果进行赋值运算
B:赋值运算符
符号:= , +=, -=, *=, /=, %=
=:为基本的赋值运算符,其他的为扩展的赋值
例2:
如下操作写出结果
int a,b; a = b = 10;
System.out.println(a); System.out.println(b);
int a = 10; a += 20;//相当于把符号的左边的值和右边的值相加,赋值给左边
System.out.println(a);
面试题:
short s=1, s = s+1; short s=1, s+=1;
上面两个代码有没有问题,如果有,那里有问题
//第一个有问题:隐含了一个默认类型转换:类型不匹配:等号右边最终int类型,而等号左边属于short类型
第二个没有问题:扩展的赋值运算符隐藏了强制类型转换!
C:比较运算符:>,>=,<,<=,!= ,==
1)无论结果是复杂的还是简单的,结果都是boolean型,也就是要么是true,要么是false。
2)比较运算符“==”不能误写成“=” 。
例3:3<x<6
java语言中不能这样写,得用逻辑运算符连接
D:逻辑运算符:可以连接某个值或者某一个表达式:
1)&:逻辑与:并且的意思(并列关系)
特点:有false则false
2)|:逻辑或:两个满足一个条件即可
特点:有true则true
3)^:逻辑异或
特点:相同则为false,不同则为true
简单记:男男
男女
女男
女女
4)!:逻辑非
特点:非false则true,非true则false,
偶数个为非数它本身
逻辑运算符用于连接布尔型表达式,在Java中不可以写成3<x<6,应该写成x>3 & x<6 。
5)“&”和“&&”的区别:
单&时,左边无论真假,右边都进行运算;
双&时,如果左边为真,右边参与运算,如果左边为假,那么右边不参与运算。
6)“|”和“||”的区别同理,双或时,左边为真,右边不参与运算。
7)异或( ^ )与或( | )的不同之处是:当左右都为true时,结果为false。
【扩展的逻辑运算符】
逻辑双与:&&
逻辑双或:||
问题:逻辑单与:&和逻辑双与&&的区别?
共同点:两个表达的效果是一样的:有false则false
短路效果(笔试题中出现的比较多)
逻辑双与:&&:具有短路效果:左边的表达式如果是false,则右边不执行
逻辑双或:||具有短路效果:左边如果是true,右边不执行.
E:位运算符:&(位与),|(位或),^(位异或),~(反码的意思):按位取反
注意事项:
计算一个数据对另一个数据进行位运算操作,就必须算出该数据对应的二进制数据
<<:左移动
>>:右移动
>>>:无符号右移
例4:
计算出3和4对应的二进制数据
* 0b11
* 0b100
*3对应的二进制数据:4个字节
*00000000000000000000000000000011
*4..
*00000000000000000000000000000100
*
*位&:有0则0
* 00000000000000000000000000000011
*位(&)00000000000000000000000000000100
* 00000000000000000000000000000000
*结果:0
*
*位|:有1则1
* 00000000000000000000000000000011
*位(|)00000000000000000000000000000100
* 00000000000000000000000000000111
*结果:7
*
*位^:相同则为0,不同则为1
* 00000000000000000000000000000011
*位(^)00000000000000000000000000000100
* 00000000000000000000000000000111
*结果:7
*
* ~:反码:按位取反,0变1,1变0
* ~00000000000000000000000000000011
* 11111111111111111111111111111100(补码)
*
*补码,求原码
* 11111111111111111111111111111100(补码)
* -1(在补码的末尾-1得到反码)
* 11111111111111111111111111111011 (反码)
* 10000000000000000000000000000100(原码)
*
*结果:-4
例5:
/*
*<<:左移动:最高位丢弃掉,在右边补齐0
*>>:右移动:最高位是1,左补齐1,最高位为0,左补齐0
*>>>:无符号右移:无论最高符号位是1还是0,左边补齐0
* */
public class OperatorDemo4 {
public static void main(String[] args) {
//<<符号左边的数据乘以2的移动次幂
System.out.println(3<<2);// 3 * 2^2 = 12
//>>符号左边的数据除以2的移动次幂
System.out.println(24>>2);//24/4 = 6
System.out.println(-24>>2);
System.out.println(-24>>>2);
}
}
例6:
/*
*-24对应的二进制数据
*10000000000000000000000000011000 :原码
*11111111111111111111111111100111:反码
* +1
*11111111111111111111111111101000补码
*
*11111111111111111111111111101000补码去右移2位
*1111111111 11111111 11111111 111010(00)(补码)
* -1
*1111111111 11111111 11111111 111001:反码
*1000000000 00000000 00000000 000110:原码:
*
*结果:-6
*
*
*-24>>>2
*11111111111111111111111111101000
*0011111111 11111111 11111111 111010(00)
*结果:1073741818
*
* */
【位运算符(位^)的特点(重点:考点)】
位^运算符的特点:一个数据被另一个数据位异或两次,其值本身不变
例7:
public class Operato rDemo2 {
public static void main(String[] args){
//定义两个变量
int a = 10 ;
int b = 20 ;
System.out.println(a ^ b ^ b);
System.out.println(a ^ b ^ a);
}
}
/*
*面试题
*请实现两个数据值的交换
*
*如果没有告诉什么数据类型,一般默认int类型
* */
public class OperatorDemo3 {
public static void main(String[] args){
//两个变量
int a = 10 ;
int b = 20 ;
System.out.println("a:"+a+",b:"+b);
System.out.println("-----------------");
//方式1:采用中间变量的方式:(开发中常用)
//int c = a ;
//a = b ;
//b = c ;
//System.out.println("a:"+a+",b:"+b);
//System.out.println("-----------------");
//方式2:面试中使用的:采用位异或的特点去实现(想问的就是是否能说了位异或^特点)
//=号左边:a,b,a
//=号右边:a^b
//a = a ^ b ;
//b = a ^ b ;//b = a ^ b ^ b
//a = a ^ b ;// a = a ^ b ^ a
//System.out.println("a:"+a+",b:"+b);
//方式3:
//采用变量相加的方式
a = a + b ;//a = 3 0;
b = a - b ;// b = 30 - 20 ;
a = a - b ;//a = 30- 10
System.out.println("a:"+a+",b:"+b);
}
}
F:三目运算符:
1)单目运算符:~3
双目运算符:3+4
三目运算符也叫三元运算符:
2)格式:
(关系表达式)?表达式1:表达式2;
如果条件为true,运算后的结果是表达式1;
如果条件为false,运算后的结果是表达式2;
表达的结果是一个boolean类型
3)执行流程:
先判断表达式是否成立,如果 成立,就是一个true,把表达式1作为true的结果
如果不成立,就是false,把表达式2作为false的结果
4)示例:
例8:
获取两个数中大数。
int x=3,y=4,z;
z = (x>y)?x:y;//z变量存储的就是两个数的大数。
例9:/*
*练习:
*求两个数据的最大值
*求三个数据的最大值
*求两个数据是否相等
* */
public class OperatorTest {
public static void main(String[] args) {
//定义两个变量
int a = 100 ;
int b = 200 ;
//定义max变量
int max = (a> b) ? a : b ;
System.out.println("两个数据的最大值是:" + max);
System.out.println("-------------------");
//求三个数据的最大值
int x = 10 ;
int y = 30 ;
int z = 20 ;
//定义中间变量(第三方变量)记录前两个值的最大值
int temp = (x>y) ? x : y ;
//用中间变量和z进行比较
int max2 = (temp > z) ? temp : z ;
System.out.println("三个数据的最大值是:" +max2);
System.out.println("-------------------");
//一步搞定
int max3 = (x>y) ? ((x>z)? x : z) : ((y>z) ? y : z) ; //不建议这样使用
System.out.println("max3:" + max3);
int m = 100 ;
int n = 200 ;
//定义标记flag
//boolean flag = (m==n) ? true : false ;
boolean flag = (m==n) ;
System.out.println(flag);
}
}
二、键盘录入
由于之间对数据进程比较或者操作,值都是已经给定的,不随机;
为了程序更加灵活,所以加入这样键盘录入数据!
1)如何实现键盘录入数据呢?(目前先记住使用)
javaAPI给提供(Sacnner类)
导包(位置放到class定义的上面)
import java.util.Scanner;
创建对象
Scanner sc = new Scanner(System.in);
接收数据
int x = sc.nextInt();
输出语句输出我们的值;
例10:
//需求:求两个数据中的最大值,用键盘录入数据改进
//求:三个数据最大值,键盘录入数据
import java.util.Scanner ;
public class ScannerTest {
public static void main(String[] args) {
//创建键盘录入对象
Scanner sc = new Scanner(System.in) ;
//提示
System.out.println("请您输入第一个数据: ");
//接收第一个数据
int a = sc.nextInt();
System.out.println("请您输入第二个数据: ");
//接收第二个数据
int b = sc.nextInt() ;
//求最大值:直接使用三元运算符
//定义max变量
int max = (a>b) ? a: b ;
System.out.println("两个数据中的最大值是:" +max);
}
}
三、流程控制语句
A:顺序结构:
是程序中最简单最基本的流程控制,代码从上到下依次执行,有这样一种顺序流程.
B:选择结构:也被称为分支结构。
1)if语句:
a.格式1:
if(表达式){
语句;
}
执行流程:首先进来看表达式是否成立,如果为true,就执行这个语句
如果是false,就不执行
b.if语句的第二种格式:
if(表达式1){
语句1;
}else{
语句2;
}
执行流程:
首先判断表达式1是否成立,如果是true,则执行语句1;
如果是false,执行语句2
c. if语句的第三种格式:
if(表达式1){
语句1;
}else if(表达式2){
语句2;
}else if(表达式3){
语句3;
....
}else{
语句n;
}
执行流程:首先判断表达式1是否成立,如成立,true,执行语句1;
如果是false,再次表达式2是否成立,true,执行语句2;
如果还不成立,再次判断表达式3是否成立,true,执行语句3;
最终上述都不成立,走到else里面
if语句的应用场景
格式1:针对单个表达式判断
格式2:针对两个表达式判断
格式3:针对多个判断
d:if语句的注意事项:
如果if语句里面只有一条语句,if(表达式)后面的大括号可以省略,但是建议不要省略,永远给出大括号;
if语句的表达式不管是简单的还是复杂的,最终是boolean类型;
在if语句里面,有分号的地方不能有左大括号,有左大括号的地方不能有分号!
例11:
package 选择结构语句_If语句;
import java.util.Scanner;
/*
*键盘录入x的值,计算出y的并输出。
1:x和y的关系满足如下:
x>=3y = 2x + 1;
-1<=x<3y = 2x;
x<=-1y = 2x– 1;
* */
public class IfTest {
public static void main(String[] args) {
//创建键盘录入对象
Scanner sc = new Scanner(System.in);
System.out.println("请输入x的值:");
int x = sc.nextInt() ;
//使用if语句的第三种格式:针对多个判断进行操作
int y ;
if(x>=3){
y = 2* x + 1 ;
}else if(x >= -1 && x < 3){
y = 2 * x ;
}else {
y = 2 * x - 1 ;
}
System.out.println("y:" +y);
}
}
例12:
package 选择结构语句_If语句;
import java.util.Scanner;
/*
*盘录入月份的值,输出对应的季节
*
*3,4,5春季
*6,7,8夏季
*9,10,11秋季
*12,1,2冬季
* */
public class IfTest2 {
public static void main(String[] args) {
//创建键盘录入对象
Scanner sc = new Scanner(System.in) ;
System.out.println("请输入一个月份的值(1-12): ");
int month = sc.nextInt() ;
//使用if语句的第三种格式
/*if(month<0 || month >12){
System.out.println("地球上没有该月份!");
}else if(month == 3){
System.out.println("春季");
}else if(month == 4){
System.out.println("春季");
}else if(month == 5){
System.out.println("春季");
}else if(month == 6){
System.out.println("夏季");
}else if(month == 7){
System.out.println("夏季");
}else if(month == 8){
System.out.println("夏季");
}else if(month == 9){
System.out.println("秋季");
}else if(month == 10){
System.out.println("秋季");
}else if(month == 11){
System.out.println("秋季");
}else {
System.out.println("冬季");
}*/
//虽然可以实现,代码比较繁杂
//改进:3,4,5--->春季
//if(month<0 || month>12){
//System.out.println("地球上没有该月份!");
//}else if(month == 3 || month == 4 || month == 5){
//System.out.println("春季");
//}else if(month == 6 || month == 7 || month == 8){
//System.out.println("夏季");
//}else if(month == 9 || month == 10 || month == 11){
//System.out.println("秋季");
//}else{
//System.out.println("冬季");
//}
//最终版代码:改进
if(month<0 || month>12){
System.out.println("地球上没有该月份!");
}else if(month >=3 && month <= 5){
System.out.println("春季");
}else if(month>= 6 && month <=8){
System.out.println("夏季");
}else if(month >=9 && month <= 11){
System.out.println("秋季");
}else{
System.out.println("冬季");
}
}
}
例13:
package 选择结构语句_If语句;
import java.util.Scanner;
/*
*获取三个数据中的最大值,键盘录入
* */
public class IfTest3 {
public static void main(String[] args) {
//创建键盘录入对象
Scanner sc = new Scanner(System.in) ;
System.out.println("请输入第一个数据:");
int a = sc.nextInt() ;
System.out.println("请输入第二个数据:");
int b = sc.nextInt() ;
System.out.println("请输入第三个数据:");
int c = sc.nextInt() ;
//使用三元运算符/:采用第三方变量去实现
int temp= ( a > b) ? a : b ;
int max = (temp > c) ? temp : c ;
System.out.println("三个数据的最大值是:" + max);
System.out.println("--------------------");
//if语句的嵌套
int max2;
if(a > b){
if(a>c){
max2 = a ;
}else {
max2 = c ;
}
}else{//b>a
if(b>c){
max2 = b ;
}else{
max2 = c ;
}
}
System.out.println("max2:" +max2);
}
}
2)switch语句
a.格式:
switch(表达式){
case值1:
语句1;
break;
case值2:
语句2;
break;
....
default:
语句n+1;
break;
}
b.执行流程:
首先用siwtch后面表达式的值和case后面的值进行比较,如果和值1相等,执行语句1,
如果不相等,跟值2比较,成立,执行语句2,遇见break:结束
如果上述没有相等的值,执行default中的语句
面试题: switch语句后面可以跟byte类型吗
switch语句后面可以跟long类型吗
switch语句后面可以跟String类型
switch后面的数据类型可以是什么类型!
本身能跟的类型:int,byte,short,char
JDK5.0以后:可以根据枚举类型
JDK7以后,可以跟String类型
break:表示中断的意思,遇见switch语句结束
switch语句的结束条件什么?
1)遇见break结束
2)程序默认执行到末尾
case:后面的值只能常量:不能变量-------------->javascript:脚本语言中switch语句中case:可以跟常量,可以个变量,可以跟表达式
default里面的break可以省略,但是不建议省略
例14:
需求:键盘录入数据,判断星期几(1-7)
public class IfTest3 {
public static void main(String[] args) {
//创建键盘录入对象
Scanner sc = new Scanner(System.in) ;
*
* */
public class SwitchDemo {
public static void main(String[] args) {
//创建键盘录入对象
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个值:(1-7)");
int weekNumber = sc.nextInt() ;
//使用switch语句去完成
switch(weekNumber){
case 1:
System.out.println("星期一");
break ;
case 2:
System.out.println("星期二");
break ;
case 3:
System.out.println("星期三");
break ;
case 4:
System.out.println("星期四");
break ;
case 5:
System.out.println("星期五");
break ;
case 6:
System.out.println("星期六");
break ;
default:
System.out.println("星期天");
break ;//可以省略的
}
}
}