java系统化基础-day02-运算符、选择结构、循环结构
1.java中的运算符

1 package com.wfd360.day02; 2 3 4 import org.junit.Test; 5 6 import java.math.BigInteger; 7 8 /** 9 * 1.算术运算符[掌握] 10 * <p> 11 * 2.自增自减[掌握] 12 * <p> 13 * 3.赋值运算[掌握] 14 * <p> 15 * 4.比较运算符[掌握] 16 * <p> 17 * 5.逻辑运算符[掌握] 18 * <p> 19 * 6.位运算符[了解] 20 * <p> 21 * 7.三目运算符[掌握] 22 */ 23 24 public class Demo01 { 25 /** 26 * 1.算术运算符[掌握] 27 * 1)加法(+) 加法 正号 字符串拼接 28 * 2)减法(-) 减法 负号 29 * 3)乘法 (*) 乘法 30 * 4)除法(/) 除法 31 * 整数(小数)相除的例子 32 * 10/3 =3; 10.0/3=3.33333… 33 * 0/0 34 * 0.0/0.0 35 * 结果是NaN ,任何的NaN都不等于自己(面试题) 36 * 1.0/0.0 37 * Infinity,表示无穷大 38 */ 39 @Test 40 public void test() { 41 int i1 = 3 + 2 - 5 * 6; 42 int i2 = 10 / 3; // 3 43 // 3.0 代表整数相除,将运算结果,转变为double 44 double d1 = 10 / 3; 45 System.out.println("d1=" + d1); 46 //double d2 = 10 / 3.0; // 3.3333333333333335 47 double d2 = 10.0 / 3; // 3.3333333333333335 48 System.out.println("d2=" + d2); 49 // 0/0 报错 java.lang.ArithmeticException: / by zero 50 //int i3=0/0; 51 // System.out.println("i3="+i3); 52 // 结果是NaN ,任何的NaN都不等于自己(面试题) 53 double d3 = 0.0 / 0; 54 System.out.println(" d3=" + d3); 55 double d4 = 1.0 / 0; // Infinity,表示无穷大 56 System.out.println(" d4=" + d4); 57 } 58 59 /** 60 * 取模(%) , 取余数 61 * 案例:假设大学的一个寝室可以住6个人,那么计算1024个大学生一共需要多少个寝室? (本质就是生产中经常用到的分页算法) 62 */ 63 @Test 64 public void test2() { 65 int n = 6; 66 int m = 1024; 67 //取余数 68 int y = m % n; 69 System.out.println("y=" + y); 70 //===================== 71 //如果余数为零那么,一共需要的寝室数=m/n; 72 //如果余数 不 为零那么,一共需要的寝室数=(m/n)+1; 73 } 74 75 /** 76 * 2. 自增自减[掌握] 77 * ++(自增) --(自减) 78 * 自增自减只能够用于 变量,不能用于常量 79 * 自增自减运算的优先级 比 算术运算符 高 80 */ 81 @Test 82 public void test3() { 83 //===========基本使用================== 84 int i = 3; // 表示把3赋值给变量i 85 i++; //表示变量i的值加1,i的值变成4 86 ++i; //表示变量i的值加 1,i的值变成5 87 System.out.println("i=" + i); 88 } 89 90 /** 91 * 面试题1 92 */ 93 @Test 94 public void test4() { 95 int i = 3; 96 int j = i++; // 先复制,在运输算 97 // i等于多少,j等于多少? 98 System.out.println("i=" + i);// 4 99 System.out.println("j=" + j);// 3 100 } 101 102 /** 103 * 面试题2 104 */ 105 @Test 106 public void test5() { 107 int i = 3; 108 int j = ++i; // 先运算,在赋值 109 // i等于多少,j等于多少? 110 System.out.println("i=" + i);// 4 111 System.out.println("j=" + j);// 4 112 } 113 114 /** 115 * 面试题3 116 */ 117 @Test 118 public void test6() { 119 int i = 3; 120 i = ++i; // 先运算,在赋值 121 // i等于多少,j等于多少? 122 System.out.println("i=" + i); // 4 123 int j = 3; 124 j = j++; 125 System.out.println("j=" + j); // 3 126 } 127 128 /** 129 * 面试题3 130 * 破题关键点: 131 * i++是先赋值在执行 自增 132 * ++i 是先执行自增 在赋值 133 */ 134 @Test 135 public void test7() { 136 int i = 3; 137 // 3(4) 4(5) 5(6) 138 int a = i++ + i++ + i++; 139 // 7 8 9 140 int b = ++i + ++i + ++i; 141 //请问 a=? b=? i=? 142 System.out.println("a=" + a); 143 System.out.println("b=" + b); 144 System.out.println("i=" + i); 145 } 146 147 /** 148 * 3. 赋值运算[简单,与平时的数学逻辑一样] 149 * = += -= *= /= %= 150 * 1)赋值符号的运算顺序? 151 * 从右到左,把符号右边的值赋值到左边的变量中 152 * 2)上面 后五个分别看成是一个整体: 例如 += 看成是一个符号,不要看成两个; 153 */ 154 @Test 155 public void test8() { 156 //请先在每行的后面给出i的值,然后用断点观察i值得变换 157 int i = 3; 158 i += 2;// 表示把2 累加到变量 i 中 159 i -= 1; // 表示把-1 累加到变量 i 中 160 i *= 3; // 等价 i=i*3; 划重点:等价不是等于 161 i /= 3; // 等价 i=i/3; 162 i %= 3; // 等价 i=i%3; 163 System.out.println("i=" + i); 164 } 165 166 /** 167 * 超级面试题 168 */ 169 @Test 170 public void test9() { 171 short s = 3; 172 s += 2; //正常 173 System.out.println("s=" + s); 174 //=========================== 175 short s2 = 3; 176 // 语法错误,结果值是int,int不能自动转换为short 177 // s2 = s2+2; 178 } 179 180 /** 181 * 4.比较运算符[掌握] 182 * == != > < >= <= instanceof 183 * 规律:比较运算的结果是一个布尔类型的值(true 或false); 184 * 举例: 185 * 定义一个布尔表达式,打印输出 186 * 特别说明:instanceof 是判断一个对象是否属于某种类型 187 * 是否可以用于我们之前学习的基本数据类型 188 */ 189 @Test 190 public void test10() { 191 System.out.println(1 == 2); //false 192 System.out.println(1 <= 2); //true 193 // instanceof 194 //是否可以用于我们之前学习的基本数据类型 ==> 不可以 195 // System.out.println( 1 instanceof int); 196 System.out.println("爱老虎油" instanceof String); // true 197 } 198 199 /** 200 * 5.逻辑运算符[掌握] 201 * & | && || ^ ! 202 * 是应用于多个条件的组合判断。 203 * 示例说明: 204 * 例如小明参加2个学科的考试 java php 205 * 1)java 和 php 同时考100分,奖励 欧洲十日游 206 * 伪代码描述:java==100 并且 php==100 207 * 2)java 和php,只要有一门考100分,奖励 奖励棒棒糖一个 208 * 伪代码描述:java==100 或者 php==100 209 * <p> 210 * 逻辑运算的两边结果值都必须是什么类型? 布尔 211 * <p> 212 * & :两边都为true ,结果为true 213 * | : 只要有一边为true,结果为true 214 * && : 两边都为true ,结果为true 215 * || : 只要有一边为true,结果为true 216 * ^ : 两边不一样,结果为true ,否则为false,举个例子打印一下 217 * ! : 逻辑非,举个例子打印一下 218 */ 219 @Test 220 public void test11() { 221 int java = 100; 222 int php = 100; 223 int c = 90; 224 int mysql = 80; 225 // || : 只要有一边为true,结果为true 226 System.out.println(java == 100 || php == 100); //true 227 System.out.println(java == 100 || c == 100); //true 228 System.out.println(mysql == 100 || c == 100); //false 229 // && 两边都为true ,结果为true 230 System.out.println(java == 100 && php == 100); //true 231 System.out.println(java == 100 && c == 100); //false 232 // 逻辑非 233 System.out.println(java != 100); //false 234 System.out.println(c != 100); // true 235 236 // ^ : 两边不一样,结果为true ,否则为false,举个例子打印一下 (用的很少) 237 System.out.println(java == 100 ^ php == 100); //false 238 System.out.println(mysql == 100 ^ c == 100); //false 239 System.out.println(java == 100 ^ c == 100); //true 240 } 241 242 /** 243 * && || 和 & | 区别? 244 * 1) & | 既可以充当逻辑运算,也可以是位运算符,怎么区分是逻辑运算还是位运算? 245 * 根据表达式的结果是否为 布尔类型 来判断 246 * 2)双与 双或 具有短路行为 什么意思? 247 * 举个例子 上面小明的考试的成绩 要求是两科都为100分,看到第一科低于100分之后没有必要再看第二科成绩 248 * 代码表示:Java = 100 && php = 100 (java只考了5分) 249 * 如果逻辑运算左边的值能够确定整个逻辑运算表达式的值,那么右边就不执行了,短路了。 250 * && 何时短路 ? 左边表达式结果为false 251 * || 何时短路 ? 左边表达式结果为true 252 * 思考:如何验证短路行为? 253 * 提示: 254 * 右边表达式用 自增自减,例如 ++i = 5 255 * 或者使用一个编译正常,运行报错的表达式,例如 1/0 256 */ 257 @Test 258 public void test12() { 259 int java = 5; 260 int php = 100; 261 262 // 区分 && 与 & 263 System.out.println(java == 100 && (++php) == 100); // php=100 &&具有短路行为,左边为false时,不在执行右边 264 System.out.println(java == 100 & (++php) == 100); // php=101 265 266 php = 100; 267 // 区分 || 与 | 268 System.out.println(php == 100 || (++java) == 100); // java=5 ||具有短路行为,左边为true时,不在执行右边 269 System.out.println(php == 100 | (++java) == 100); // java=6 270 System.out.println("java=" + java + " php=" + php); 271 } 272 273 /** 274 * 面试错误题 275 * 例如:判断一个整数的变量 a里面的数据 在0-100之间 276 * 正确写法: a>0 && a<100 277 * 错误写法: 0< a < 100 (java没有这种语法,不支持) 278 */ 279 @Test 280 public void test13() { 281 int a = 10; 282 System.out.println(a > 0 && a < 100); 283 284 //System.out.println(0 < a < 100); 错误 285 } 286 287 /** 288 * 十进制转成二进制 289 * String s = Integer.toBinaryString(n) //将十进制数转成字符串,例如n=5 ,s = "101" 290 * <p> 291 * 将字符串转成整形 292 * int a = Integer.valueof("1002"); //当然s只能是数字类的字符串 293 */ 294 @Test 295 public void test14() { 296 //十进制转成二进制 297 String s = Integer.toBinaryString(5); 298 System.out.println("s=" + s); 299 //二进制转变为十进制 300 BigInteger bi = new BigInteger("011", 2); //转换为BigInteger类型 301 int a = Integer.parseInt(bi.toString()); 302 System.out.println("a=" + a); 303 } 304 305 /** 306 * 6.位运算符[了解] 307 * & | ^ ~ << >> >>> 308 * 位运算就是 二进制的位进行运算。 309 * 示例:比如计算 125+176 ,从数学的角度是怎么计算的? 310 * 同理,位运算也类似,比如 3&4 311 * <p> 312 * 可以把1看成是true,把0看成是false 313 * & :与 位运算,两边为1,结果为1 314 * | :或 位运算,有一个为1,结果为1 315 * ^ : 异或,两边不一样,就为1,否则为0 316 * ~ : 取反,1变成0 ,0 变成1 317 * << : 向左位移动,例如1<<3 318 * >> : 向右位移动,例如8>>2 319 * >>>: 无符号向右移动 320 * <p> 321 * 注意: 322 * 正数的补码,反码,原码 都一样; 323 * 负数的反码:符号为不变,其他位取反; 324 * 负数的补码:它的反码+1; 325 */ 326 @Test 327 public void test15() { 328 // & :与 位运算,两边为1,结果为1 329 System.out.println(20 & 30); //得到的是十进制数 330 System.out.println("20的二进制:" + Integer.toBinaryString(20)); 331 System.out.println(" &"); 332 System.out.println("30的二进制:" + Integer.toBinaryString(30)); 333 System.out.println("----------------------------------------"); 334 System.out.println(" " + Integer.toBinaryString(20 & 30)); 335 } 336 337 @Test 338 public void test16() { 339 // | :或 位运算,有一个为1,结果为1 340 System.out.println(20 | 30); //得到的是十进制数 341 System.out.println("20的二进制:" + Integer.toBinaryString(20)); 342 System.out.println(" |"); 343 System.out.println("30的二进制:" + Integer.toBinaryString(30)); 344 System.out.println("----------------------------------------"); 345 System.out.println(" " + Integer.toBinaryString(20 | 30)); 346 } 347 348 @Test 349 public void test17() { 350 //<< : 向左位移动,例如1<<3 , 左位易的本质运算是,假设 a<<b ,相当于数学中的运算 a乘以2的b次方 351 System.out.println(2 << 3); //得到的是十进制数 352 System.out.println("2的二进制:000" + Integer.toBinaryString(2)); 353 System.out.println(" <<3"); 354 System.out.println("----------------------------------------"); 355 System.out.println(" " + Integer.toBinaryString(2 << 3)); 356 } 357 358 /** 359 * 注意: 360 * 正数的补码,反码,原码 都一样; 361 * 负数的反码:符号为不变,其他位取反; 362 * 负数的补码:它的反码+1; 363 */ 364 @Test 365 public void test18() { 366 //~ : 取反,1变成0 ,0 变成1 367 System.out.println(~(-5)); //得到的是十进制数 368 System.out.println("原码:00000000000000000000000000000" + Integer.toBinaryString(5)); 369 System.out.println("反码:" + Integer.toBinaryString(-5)); 370 System.out.println("补码:00000000000000000000000000000" + Integer.toBinaryString(~(-5))); 371 } 372 373 /** 374 * 7.三目运算符[掌握] 375 * 语法格式: X ? Y : Z 376 * 1)上面的三目运算整体看成是一个表达式,应该有一个结果值 377 * 2)X ? 布尔类型的值或者结果为布尔类型的表达式 378 * 3)Y Z ? 一般来说数据类型相同的值或者表达式 379 * 4)运算的规则? 380 * X 为true,就是 Y 的结果值 ( 冒号前面的表达式的值) 381 * X为false,就是Z的结果值 ( 冒号后面的表达式的值) 382 * x ? y : z 383 * <p> 384 * 注意: 不要受 ? 和 : 的干扰,它们只是一个固定语法格式而已 385 */ 386 @Test 387 public void test19() { 388 //举例:找出两个整型变量中的最大值 389 int a = 6; 390 int b = 7; 391 int c = a > b ? a : b; 392 System.out.println("c=" + c); 393 //举例 判断一个数是 奇数 还是 偶数 394 int i = 9; 395 System.out.println(i % 2 == 0 ? "偶数" : "奇数"); 396 } 397 398 }View Code
2.条件选择结构-if
3.条件选择结构-switch
4.java中的循环结构-while
5.java中的循环结构-for

更多精彩