一、运算符
1.位运算符
-
按位与 A&B 将A与B转化成二进制,右侧对齐,上下比较, 每个位值两者都为1结果才为1,否者尾0,最后把结果转化成十进制。
int result1=12&3;//1100 & 11 --> 0000 --》0 System.out.println(result1);//0 int result2=12&11; System.out.println(result2);//8
-
按位或 A|B 将A与B转化成二进制,右侧对齐,上下比较, 每个位值两者只要有一个为1结果才为1,否则为0,最后把结果转化成十进制
int result3=12|11; System.out.println(result3);//15
-
按位异或 A^B 将A与B转化成二进制,右侧对齐,上下比较,每个位值两者相同则为0,不同则为1.最后把结果转化成十进制
int result4=12^11; System.out.println(result4);//7
-
反码运算 ~ 将二进制中的0换成1,1换成0
/*反码运算 ~:将二进制中的0换成1,1换成0*/ int result5=~11; //11求反为负数,负数--》求反+1,故原式相当于加1(求反 求反 +1) System.out.println(result5);//-12
-
移位运算 向左移位(右侧补0,放大倍数) << 向右移位(左侧补符号位) >> 向左移位(右侧补0) >>> 向右移位(左侧补0) >>>
int result6=3<<2;//放大倍数,移动2位就是放大2^2 System.out.println(result6); //-1:111111……11 int result7=-1>>2;//放大倍数,移动2位就是放大2^2 int result8=3>>2; System.out.println(result7); System.out.println(result8); //>>> 空出来的补0 System.out.println(Integer.MAX_VALUE);//2147483647 int result9=-1>>>1; System.out.println(result9);//2147483647
-
补充1:3*8 最快的计算方法 :3<<3
-
补充2: 3*16 最快的计算方法 :3<<4
-
Integer.MAX_VALUE:最大值--2147483647
-
交换数值测试小例
//交换数值测试小例 //方法1:第三变量 ---什么类型都可以使用 int a=11; int b=22; int t=a; a=b; b=t; System.out.println(a+"___"+b); //2.加法运算的方法 a=a+b;// a=33 b=22; b=a-b;// a=33 b=11; a=a-b;// a=22 b=11; System.out.println(a+"___-----"+b); //3.异或运算的形式 a=a^b; // a=29 b=22; b=a^b; // a=29 b=11; a=a^b; // a=22 b=11; System.out.println(a+"___-----___"+b);
-
&与&&有什么不同?
-
按位与:a&b是把a和b都转换成二进制数然后再进行与的运算;
逻辑与:a&&b就是当且仅当两个操作数均为 true时,其结果才为 true,只要有一个为false,a&&b就为false。&&进行的是短路判断,即如果左侧的表达式的结果为false,整个的结果就为false,不再计算右侧的表达式的值。
-
/* & | 也可以对布尔值运算,得到布尔值*/ boolean bool=true & false;//运算结果与&&和||一样,但是过程不一样 a=12;b=12; bool=a++<12&b++>12;//$每位二进制都进行与运算,不会出现短路现象 bool=a++<12&&b++>12;//有短路现象
2.赋值运算
赋值运算 == += -= *= /= %=
//赋值运算 == += -= *= /= %=
byte a = 12;
a += 2;//将a的值乘2再赋值给2,不能单纯理解为a=a+2
//a=+2;//a等于正2
//a=a+2;//报错,需要强制转换
System.out.println(a);
a = 33;
a *= 22;
System.out.println(a);
a = 33;
a %= 22;
System.out.println(a);
3.三元运算 A?B:C
/*三元运算A?B:C*/
int t = 12 > 34 ? 11 : 77; //三元运算 A?B:C
int result = 12 > 34 ? 11 : 23;
System.out.println(result);
result = 12.2 != 33.99 ? 'a' : 33;
- 注意点:true ?3:12.3
- 结果是3.0(可以理解为一个容器内既可以放int又可以放float,那么这个至少是一个float类型)
//12.2+3 ? double System.out.println(true ? 3 : 4.0);//3.0 System.out.println(12 / 0);
二、流程控制语句
1.if else
//有一个if就会有一个代码块执行(else if不算)
System.out.println("请输入成绩!");
Scanner sc=new Scanner(System.in);
int i = sc.nextInt();
if(i>85){
System.out.println("优秀");
}else if(i>70){
System.out.println("良好");
}else if(i>60){
System.out.println("及格");
}else {
System.out.println("不及格");
}
sc.close();
2.Switch case
-
(1)执行顺序:如果匹配到某一个case项,就从这个项开始运行,一直运行到break,或者代码快结束,如果所有的case项都没有匹配成功,才会执行default相关代码,此代码没有break后面都会执行。 (2)细节1.case项与default的顺序可以是错乱的,但是执行顺序不会乱 (3)细节2.switch 可以匹配的数据类型:byte short int char String Enum(枚举)
System.out.println("请输入月份");
Scanner scan=new Scanner(System.in);
int i1 = scan.nextInt();
switch(i1){
case 1:
case 2:
case 3:
System.out.println("春季");
break;
case 4:
case 5:
case 6:
System.out.println("夏季");
break;
case 7:
case 8:
case 9:
System.out.println("秋季");
break;
case 10:
case 11:
case 12:
System.out.println("冬季");
break;
default:
System.out.println("月份输入错误,请重新输入");
}
scan.close();
三、循环语句
1.while循环
-
在一些条件下可能没有for 循环,但一定有while循环
-
for循环:明确知道循环次数 while循环:知道循环条件
-
while 先判断执行条件,满足再执行 do while 先执行一边,再判断条件(至少执行一次)
-
int i=0; while(i<5){ i++; System.out.println("A"); } //测试:打印 i='a'; while(i<='d'){ System.out.println((char)i); i++; }
2.do while 循环
至少执行1次
//do while 循环
i=0;
do{
System.out.println("--------条件不成立");
}while(i>20);
3.for循环
/* for(;;){
//死循环
}*/
for(int n=0;n<10;n++){
System.out.println("循环第"+(n+1)+"次");
}
4.练习小测:
(1)猫抓老鼠,猫重量大于老鼠,则成功抓取老鼠,否者失败,且抓一只老鼠生一只
//练习:猫抓老鼠,猫重量大于老鼠,则成功抓取老鼠,否者失败,且抓一只老鼠生一只
Math.random();//生成[0,1)范围的随机数
int cat=100;
int mouse=(int)(Math.random()*120)+1;
int count=0;
while(cat>mouse){
count++;
mouse=(int)(Math.random()*120)+1;
}
System.out.println("猫一共抓了"+count+"只老鼠");
(2)累加1-100
(3)累加100以内3的倍数
//累加1-100
int total=0;
for(int i1=1;i1<=100;i1++){
total+=i1;
}
System.out.println(total);
//累加100以内3的倍数
int num1=0;
for(int i1=0;i1<100;i1++){
if(i1%3==0){
num1=num1+i1;
}
}
System.out.println(num1+"-----------");
5.break与continue的区别
-
break:结束所在循环体 continue:停止此次循环,跳到下一次循环
//break;//结束所在循环体 //continue;//停止此次循环,跳到下一次循环 for(int aa=0;aa<100;aa++){ if(aa%7==0){ //break;//结束所在循环体 continue;//停止此次循环,跳到下一次循环 } System.out.println(aa); }
6.break跳出多重循环与建立锁对象跳出多重循环
/*2.定义一个锁变量,跳出多重循环*/
boolean bool=true;
for(int cc=0;bool&&cc<10;cc++){
for(int dd=0;bool&&dd<3;dd++){
for(int bb=0;bb<100;bb++){
if(bb==50){
bool=false;
}
}
}
}
/*1.break 跳出多重循环,需要跳出的循环可以取别名例如a*/
a:for(;;){
for(;;){
for(int bb=0;bb<100;bb++){
if(bb==50){
break a;
}
}
}
}
7.死循环与无限循环
-
死循环:没有结束循环的条件 无限循环:结束循环的条件永远达不到
死循环代码后代码会报错,不可以编写其他代码, 因为程序认为死循环下的代码永远达不到,无限循环则不会报错,其下可以编写其他代码
/*死循环:没有结束循环的条件
* 无限循环:结束循环的条件永远达不到*/
int a=0;
while(a<100000000){a--;}//实际上不可能无限循环,因为a的值1亿多--
while(a<1000){a--;}//可能无限循环
for(;;){
}
//while(true){}//死循环---
// 死循环代码后代码会报错,不可以编写其他代码,
// 因为程序认为死循环下的代码永远达不到,无限循环则不会报错,其下可以编写其他代码
四、数组
1.数字声明定义
三种定义方式:
//声明 int[]arr;
//定义--静态的
int[]arr={12,52,137};
int[] arr2=new int[]{23,56};
//定义--动态的
int[] arr1=new int[4];//长度定义范围 【4】代表可以存放4个元素
//实际上也可以采用此种方法,但是一般不采用
int arr3[] ={2,3,4,5};
2.数组的限定
-
数组限定: * 1.只能存放指定类型的数据 * 2.数组的长度是不可变的
- 数字相关方法
获取数组长度 length Arrays.toString(arr)
-
/*使用数组的元素---下标:从0开始,依次增加*/ System.out.println(arr[2]); System.out.println(arr);//[I@1b6d3586 地址 arr[0]=66; System.out.println(Arrays.toString(arr));//[66, 52, 137] //获取数组长度 length System.out.println(arr.length);//3 System.out.println("-----------");
3.二维数组定义
/*二维数组*/
int[][]arrs=new int [4][2];//4个元素,每个元素有2个数据
arrs[0][1]=12;
System.out.println(Arrays.toString(arrs));//[[I@4554617c, [I@74a14482, [I@1540e19d, [I@677327b6]
System.out.println(Arrays.deepToString(arrs));//[[0, 12], [0, 0], [0, 0], [0, 0]]
4.二维数组的限定
-
一维数组个数不可变,一维数组必须是int类型的数组
- 二维数组在不确定的情况下,第一个元素可以空,但第二个元素不可以空,一定要有值,例:int a[][5];
-
arrs[2]=new int[]{1,2,3,4}; System.out.println(Arrays.deepToString(arrs));//[[0, 12], [0, 0], [1, 2, 3, 4], [0, 0]] /*声明一个随机数,使用随机数为每个元数赋值*/ int[][] arrC=new int[5][4]; for(int i=0;i<arrC.length;i++){ //[0, 0, 0, 0] System.out.println(Arrays.toString(arrC[i])); for(int j=0;j< arrC[i].length;j++){ arrC[i][j]=(int)(Math.random()*88);//0-88随机数 } //[38, 83, 53, 50] System.out.println(Arrays.toString(arrC[i])); } //[[42, 62, 57, 17], [29, 65, 54, 10], [67, 71, 61, 18], [44, 17, 22, 46], [38, 83, 53, 50]] System.out.println(Arrays.deepToString(arrC));
5.数组越界问题
/*数组下标越界:*/ arr=new int[4]; System.out.println(Arrays.toString(arr)); arr[1]=32; arr[3]=32; // arr[4]=32;//运行时报错:ArrayIndexOutOfBoundsException下标越界