Java学习2 之 【数据运算、流程控制与数组】
目录1. 数据类型、变量与常量1.1. 标识符与命名规范1.2. 数据类型分类1.3. 变量与常量整型常量的表示形式浮点常量的两种表示形式2. 运算符2.1. 运算符分类2.2. 类型转换3. 流程控制语句3.1. 分支结构3.2. 循环结构3.3. 特殊流程控制4. 数组4.1. 一维数组4.2. 二维数组1. 数据类型、变量与常量1.1. 标识符与命名规范在Java中任何一个变量、常量、方法、对象和类都需要有名字即标识符组成规则由字母、数字、下划线_、美元符号$组成不能以数字开头不能是Java保留字严格区分大小写命名建议类名大驼峰命名法如 Person变量/方法名小驼峰命名法如 studentAge常量名全大写下划线如 MAX_SCORE注意Java采用Unicode字符集字符类型占2个字节错误命名 2a 不能以数字开头 test-3 “-”不是指定的字符 class 是Java 的保留字1.2. 数据类型分类数据类型决定数据的存储方式和运算方式Java是强类型语言数据类型分为两大类基本数据类型8种整数型byte、 short、int、long各整数类型有固定的表示范围和字段长度不受操作系统的影响以保证 Java 程序的可移植性浮点型float、doubleJava 浮点类型有固定的表示范围和字段长度字符型char(2字节)表示一个字符可用十六进制编码形式表示如charc1\u0061;采用Unicode编码字符常量必须用 单引号 双引号 表示字符串 String布尔型boolean只允许取值 true/false不可以用0或非0的整数替代true和false引用数据类型类class、接口interface、数组[]内存分配基本类型在栈中直接存值引用类型在栈中存引用地址在堆中存实际对象doublea 3.14; Personp1 newPerson(); //赋值时 doubleb a; //复制的是值 Personp2 p1; //复制的是引用1.3. 变量与常量变量程序运行中值可变的量。声明语法数据类型 变量名 值;常量使用 final 关键字修饰赋值后不能修改。语法final 数据类型 常量名 值;整型常量的表示形式进制前缀/规则示例对应十进制值说明十进制无前缀不能以0开头0除外12、-314、012、-314、0最常用八进制以0开头01210只能出现0~7如08非法十六进制以0x或0X开头0x12、0XFF18、255可用0~9、a~f、A~F二进制以0b或0B开头0b0001001018Java 7 及以上支持类型与后缀项目说明默认类型Java 整型常量默认是int型32 位long常量在数字后加l或L如123L、0xFFFFFFFFL推荐写法建议用大写L避免小写l与数字1混淆无符号数Java 基本整型没有无符号数byte、short、int、long都是有符号的32 位无符号数运算可用long64 位存储 32 位无符号整数的运算结果浮点常量的两种表示形式表示形式规则示例说明十进制数形式通常含小数点也可省略整数部分或小数部分3.14、314.0、.314、314.最常用科学记数法形式由尾数、e或E、指数组成3.14e2、3.14E2、14E2指数可带正负号如3.14e-2十进制数形式不一定必须含小数点如 3f 也是 float 字面量科学记数法形式也不一定含小数点如 14E2 合法类型与后缀项目说明默认类型Java 浮点常量默认是double型float常量必须在数字后加f或F如3.14f、3.14Fdouble常量可加d或D也可省略如3.14、3.14d错误写法float f 3.14;编译错误因为3.14是 double正确写法float f 3.14f;或float f (float) 3.14;自动提升double d 3.14f;合法float 自动提升为 double下划线分隔符规则Java 7规则合法示例非法示例可放在数字之间123_456.789_000—不能放开头—_123.45不能放结尾—123.45_不能紧邻小数点123_456.789123_.456、123._456不能紧邻e/E1.23e4_51.23_e45、1.23e_45不能紧邻后缀1_234.5f1_234.5_f下划线不是“千分位专用”只是可读性分隔符位置不要求每三位2. 运算符2.1. 运算符分类算术运算符, -, *, /, %取模, 自增, --自减注意a与a的区别前者先取值后运算后者先运算后取值。整数相除会直接舍去小数部分关系运算符, , , , , !。结果为boolean值逻辑运算符(逻辑与), |(逻辑或), !(逻辑非), ^(异或), (短路与), ||(短路或)和||具有短路特性即第一个条件能决定结果时不会执行第二个条件运算符名称操作数类型含义短路!逻辑非boolean取反true变falsefalse变true不涉及逻辑与 / 按位与boolean/ 整数两边都为true才为true整数则按位与否|逻辑或 / 按位或boolean/ 整数只要有一个为true就为true整数则按位或否^逻辑异或 / 按位异或boolean/ 整数两边不同为true相同为false整数则按位异或否短路与boolean两边都为true才为true左边为false时右边不计算是||短路或boolean只要有一个为true就为true左边为true时右边不计算是赋值与扩展运算符, , -, *, /等三元运算符条件 ? 表达式1 : 表达式2位运算符, |, ^, ~, 乘以2ⁿ, 除以2ⁿ向下取整, 高位永远补0运算符名称规则等价数学区分正负左移二进制整体左移 n 位低位补 0不溢出时x n x * 2ⁿ不区分带符号右移正数高位补 0负数高位补 1约等于x / 2ⁿ向下取整区分无符号右移无论正负高位一律补 0无直接除法等价按无符号数解释不区分2.2. 类型转换自动类型转换隐式小范围到大范围如 byte,short,char--»int--»long--»float--»doublebyte,short,char之间不相互转换直接转成int类型参与运算强制类型转换显式大范围到小范围可能造成精度丢失或数据溢出例如 int 强转 byte。语法(目标类型)值; byte, short, char 参与运算时会自动提升为 int字符串连接 运算符两侧只要有一方是字符串就会进行拼接操作3. 流程控制语句程序有三大基本结构顺序结构、分支结构、循环结构3.1. 分支结构if 语句根据条件表达式的布尔结果决定执行哪一段代码。单分支if条件为true时执行指定代码块否则跳过。双分支if-else条件为true执行 if 块为false执行 else 块。多分支if-else if-else依次判断多个条件命中第一个为true的分支执行适合处理多个互斥的区间判断。switch 语句根据表达式的值直接跳转到匹配的 case 分支适合做等值匹配。支持的数据类型byte、short、int、char、StringJava 7、枚举类型不能使用long类型因为 switch 的等值比较基于整型或字符串的哈希语义long不在其支持范围内。case 后不加break会发生“case穿透”即命中某个 case 后继续向下执行后续所有 case 的代码直到遇到break或 switch 结束default用于处理所有 case 都未匹配的情况通常放在最后。多个 case 可以共享同一段执行代码例如多个取值对应相同处理逻辑时可连续书写 case 标签。3.2. 循环结构for 循环最常用适用于循环次数确定的场景。for(初始化;条件;迭代){...}while 循环先判断后执行适用于次数不确定的场景do-while 循环先执行后判断至少执行一次注意避免死循环和循环变量未初始化的问题3.3. 特殊流程控制break终止当前循环。可配合标签如 outer:跳出多层嵌套循环public class BreakDemo2 { public static void main(String[] args) { outer: // 标签标记外层循环 for (int i 1; i 3; i) { for (int j 1; j 3; j) { if (i 2 j 2) { System.out.println(遇到 i2, j2跳出 outer 标记的外层循环); break outer; // 跳出标签 outer 所标记的外层循环 } System.out.println(i i , j j); } } System.out.println(循环结束); } }continue跳过本次循环剩余语句直接进入下一次循环判断4. 数组数组是存储同类型数据的集合长度一旦确定不可改变Java中数组是引用类型数组变量是引用变量数组变量保存数组对象在堆中的引用数组对象包含一组数组元素元素可以是基本类型值或者对象引用double[] myList new double[10];内存模型可以理解为myList 是一个引用变量存放在栈中new double[10] 在堆中创建了一个长度为 10 的数组对象myList 保存这个数组对象的引用数组元素通过下标访问如 myList[0]、myList[1] …… myList[9]。int[] arrA {1,2,3,4,5}; int[] arrB arrA;// arrB 和 arrA 指向同一个数组 arrB[0] 99; for(int num : arrA) { System.out.print(num ); } // 运行结果99 2 3 4 54.1. 一维数组声明与创建int[] arr new int[5];推荐或 int arr[] new int[5];与 C、C 不同Java 在声明数组时并不为数组元素分配内存因此[]中不用写数组长度初始化动态初始化先声明并分配空间随后赋值默认值整数为0浮点为0.0char为\u0000boolean为false引用类型为null静态初始化int[] arr {1, 2, 3}; 或 int[] arr new int[]{1, 2, 3};int[] arr new int[5] {1, 2, 3, 4, 5}; // 编译错误遍历方式普通 for 循环通过索引 arr[i] 访问可读可写增强 for 循环foreachfor(int num : arr)仅适用于只读遍历常用操作arr.length 获取长度属性System.arraycopy() 实现数组复制经典案例冒泡排序学生成绩排序String[] names new String[numOfStudents]; double[] scores new double[numOfStudents]; // ... 这里省略了给 names 和 scores 赋值的代码 ... // 冒泡排序按 scores 升序排列同时同步交换 names for (int i 0; i scores.length - 1; i) { for (int j 0; j scores.length - 1 - i; j) { if (scores[j] scores[j 1]) { // 交换成绩 double tempScore scores[j]; scores[j] scores[j 1]; scores[j 1] tempScore; // 同步交换姓名保证姓名和成绩对应 String tempName names[j]; names[j] names[j 1]; names[j 1] tempName; } } }4.2. 二维数组概念数组的数组类似于矩阵声明与初始化规则二维数组int[][] arr new int[3][4];不规则二维数组Java特色int[][] arr new int[3][];每行长度可以不同静态初始化int[][] arr {{1,2}, {3,4,5}};遍历双层嵌套循环。外层控制行 arr.length内层控制列 arr[i].length