Java基础笔记02

张开发
2026/4/7 18:58:54 15 分钟阅读

分享文章

Java基础笔记02
Java学习笔记数组、方法与面向对象课前回顾数组作用一次存储多个数据。数组特点定长可存储基本类型和引用类型。数组定义动态初始化数据类型[] 数组名 new 数据类型[长度]静态初始化数据类型[] 数组名 {元素1, 元素2, ...}获取长度数组名.length索引从0开始最大索引为长度-1唯一。存取元素数组名[索引] 值存数组名[索引]取。遍历数组名.foriIDEA快捷方式。常见异常ArrayIndexOutOfBoundsException索引越界。NullPointerException引用为null却操作它。今日重点手写冒泡排序、二分查找使用 Arrays 数组工具类操作二维数组定义、存取、遍历方法的使用无参/有参无返回值/有返回值重要提示今天如果方法的定义和调用不熟练请优先练习方法其他知识点可以稍后。第一章 数组常见算法1. 数组翻转概述将数组中对称位置上的元素互换。javapublic class Demo01ArrayReverse { public static void main(String[] args) { int[] arr {1,2,3,4,5}; for (int min 0, max arr.length-1; min max; min, max--) { int temp arr[min]; arr[min] arr[max]; arr[max] temp; } // 输出翻转后的数组 for (int i : arr) { System.out.print(i ); // 5 4 3 2 1 } } }2. 冒泡排序概述相邻元素两两比较大的往后移小的往前移升序。核心思想每轮将最大的元素“冒泡”到末尾。javapublic class Demo02Bubble { public static void main(String[] args) { int[] arr {5,4,3,2,1}; // 外层循环控制比较的轮数 for (int i 0; i arr.length-1; i) { // 内层循环控制每轮比较的次数 for (int j 0; j arr.length-1-i; j) { if (arr[j] arr[j1]) { int temp arr[j]; arr[j] arr[j1]; arr[j1] temp; } } } // 输出排序结果 for (int num : arr) { System.out.print(num ); // 1 2 3 4 5 } } }3. 二分查找概述每次取中间索引比较每次排除一半数据。前提数组必须有序默认升序。javapublic class Demo03BinarySearch { public static void main(String[] args) { int[] arr {1,2,3,4,5,6,7,8,9,10}; int min 0; int max arr.length - 1; int key 10; // 要查找的值 while (min max) { int mid (min max) / 2; if (key arr[mid]) { min mid 1; } else if (key arr[mid]) { max mid - 1; } else { System.out.println(找到了索引是 mid); break; } } } }第二章 数组工具类1. System 类系统相关类方法直接用类名调用。常用方法arraycopy(Object src, int srcPos, Object dest, int destPos, int length)javaint[] arr {1,2,3,4,5,6,7,8}; int[] arr2 new int[10]; System.arraycopy(arr, 0, arr2, 0, arr.length); System.out.println(Arrays.toString(arr2)); // [1,2,3,4,5,6,7,8,0,0]2. Arrays 类方法说明String toString(数组)按[元素1, 元素2, ...]格式打印void sort(数组)升序排序int binarySearch(数组, 要查找的元素)二分查找返回索引int[] copyOf(数组, 新长度)数组扩容返回新数组javaint[] arr {1,2,3,4,5,6,7,8}; System.out.println(Arrays.toString(arr)); int[] arr2 {5,4,3,2,1}; Arrays.sort(arr2); System.out.println(Arrays.toString(arr2)); int index Arrays.binarySearch(arr, 3); System.out.println(index); // 2 int[] newArr Arrays.copyOf(arr2, 10); System.out.println(Arrays.toString(newArr));3. Hutool 工具第三方官网https://www.hutool.cn/引入 jar 包步骤IDEA模块下新建lib目录复制 hutool 的 jar 包到 lib 下右键 lib →Add as Library→ 选择 ModuleArrayUtil 常用方法方法说明int max(数组)返回数组最大值int indexOf(数组, 要查找的数据)顺序查找返回索引reverse(数组)数组翻转javaint[] arr {1,2,3,4,5,6,7,8}; System.out.println(ArrayUtil.max(arr)); // 8 System.out.println(ArrayUtil.indexOf(arr, 3)); // 2 ArrayUtil.reverse(arr); System.out.println(ArrayUtil.toString(arr)); // [8,7,6,5,4,3,2,1]第三章 二维数组1. 定义格式动态初始化java数据类型[][] 数组名 new 数据类型[m][n]; // m:二维数组长度n:每个一维数组长度静态初始化java数据类型[][] 数组名 {{元素1,元素2,...},{元素1,元素2,...},...};示例javaint[][] arr1 new int[3][3]; int[][] arr2 new int[3][]; // 一维数组暂未创建 int[][] arr3 {{1,2,3},{4,5,6},{7,8,9}}; String[][] arr4 {{唐僧,孙悟空,猪八戒},{刘备,关羽},{金莲,涛哥}};2. 获取长度javaint[][] arr new int[3][3]; System.out.println(arr.length); // 3 System.out.println(arr[0].length); // 33. 存取元素javaString[][] arr {{唐僧,孙悟空,猪八戒},{刘备,关羽},{金莲,涛哥}}; System.out.println(arr[0][0]); // 唐僧 System.out.println(arr[1][1]); // 关羽 System.out.println(arr[2][1]); // 涛哥 arr[0][0] 唐三藏;4. 遍历二维数组javafor (int i 0; i arr.length; i) { for (int j 0; j arr[i].length; j) { System.out.println(arr[i][j]); } }第四章 方法的使用方法通用定义格式java修饰符 返回值类型 方法名(参数) { 方法体 return 结果; }1. 无参无返回值javapublic static void 方法名() { // 方法体 } // 调用方法名();示例javapublic static void add() { int a 10, b 20; System.out.println(a b); } // 调用 add();2. 有参无返回值javapublic static void 方法名(参数) { // 方法体 } // 调用方法名(实参);示例javapublic static void add(int a, int b) { System.out.println(a b); } // 调用 add(10,20);3. 无参有返回值javapublic static 返回值类型 方法名() { // 方法体 return 结果; } // 调用数据类型 变量名 方法名(); 或 System.out.println(方法名());示例javapublic static int add() { int a 10, b 20; return a b; } // 调用 int sum add();4. 有参有返回值javapublic static 返回值类型 方法名(参数) { // 方法体 return 结果; } // 调用数据类型 变量名 方法名(实参);示例javapublic static int add(int a, int b) { return a b; } // 调用 int sum add(10,20);形参与实参形参定义方法时的参数无具体值。实参调用方法时传递给形参的具体值。参数和返回值使用时机参数需要将数据从调用者传入方法内部时使用。返回值方法执行后需要将结果返回给调用者时使用。第五章 方法进阶方法注意事项方法不调用不执行。执行顺序只与调用顺序有关。void不能与return 结果共存但可以与return仅结束方法共存。调用方法时方法名、参数个数、类型、顺序必须完全一致。一个方法只能有一个返回值if-else 除外。方法练习练习1判断奇偶性javapublic static String judge(int num) { return num % 2 0 ? 偶数 : 奇数; }练习21~100 求和javapublic static int sum100() { int sum 0; for (int i 1; i 100; i) sum i; return sum; }练习3循环打印javapublic static void print(int n) { for (int i 0; i n; i) { System.out.println(我是一个有经验的Java智能体开发工程师); } }练习4遍历数组javapublic static void printArray(int[] arr) { System.out.println(Arrays.toString(arr)); }练习5求数组最大值自行练习练习6按指定格式输出数组自行练习练习7数组作为返回值javapublic static int[] getSumAndSub(int a, int b) { int sum a b; int sub a - b; return new int[]{sum, sub}; }第六章 方法参数传递基本类型传递的是值不影响原变量。引用类型传递的是地址值会影响原数组/对象。示例java// 基本类型 public static void change(int a) { a 100; } // 外部不变 // 引用类型 public static void change(int[] arr) { arr[0] 100; } // 外部数组改变第七章 方法重载Overload定义同一个类中方法名相同参数列表不同。参数列表不同参数个数不同参数类型不同参数顺序不同与返回值和参数名无关。示例javapublic static void open() {} public static void open(int a) {} public static void open(int a, int b) {} public static void open(double a, int b) {} public static void open(int a, double b) {}第八章 可变参数格式数据类型...变量名本质数组注意一个方法只能有一个可变参数且必须放在最后。javapublic static void sum(int... arr) { int sum 0; for (int num : arr) sum num; System.out.println(sum); } // 调用 sum(1,2,3,4);练习字符串拼接java// 无分隔符 public static String concat(String... strs) { String result ; for (String s : strs) result s; return result; } // 带分隔符 public static String concat(String separator, String... strs) { if (strs.length 0) return ; StringBuilder sb new StringBuilder(strs[0]); for (int i 1; i strs.length; i) { sb.append(separator).append(strs[i]); } return sb.toString(); }第九章 递归概述方法内部调用自身。注意必须有出口否则栈内存溢出。示例1输出 3 到 1javapublic static void print(int n) { if (n 0) return; System.out.println(n); print(n - 1); }示例2求 n!javapublic static int factorial(int n) { if (n 1) return 1; return n * factorial(n - 1); }示例3斐波那契数列不死神兔java// 第n个月兔子对数 public static int fib(int n) { if (n 1 || n 2) return 1; return fib(n - 1) fib(n - 2); } // 一年内fib(12) 144第十章 面向对象基础1. 面向对象思想是什么Java 的核心编程思想。作用减少代码量提高复用性。使用方式new对象然后.调用成员如 Scanner、Random类名直接调用静态成员2. 类实体类属性成员变量定义在类中方法外有默认值。行为成员方法去掉static关键字。javapublic class Person { // 属性 String name; // 默认 null int age; // 默认 0 // 行为 public void eat() { System.out.println(吃饭); } }3. 对象的使用导包同包下无需导包不同包需import创建对象类名 对象名 new 类名()调用成员对象名.属性名/对象名.方法名()javaPerson p new Person(); p.name 张三; p.age 18; p.eat();4. 匿名对象定义没有名字的对象即new 类名().成员使用场景只需调用一次方法时。javanew Person().eat(); // 不推荐用于赋值第十一章 成员变量与局部变量区别区别点成员变量局部变量定义位置类中方法外方法内或形参默认值有默认值无必须手动赋值作用范围整个类所在方法内内存位置堆内存栈内存生命周期随对象创建/销毁随方法调用/结束第十二章 封装private封装概述隐藏实现细节对外提供公共访问方式。关键字private私有只能在本类中访问使用步骤属性用private修饰提供公共的getXxx()/setXxx()方法javapublic class Person { private String name; private int age; public void setName(String name) { this.name name; } public String getName() { return name; } public void setAge(int age) { if (age 0 age 120) { this.age age; } } public int getAge() { return age; } }this 关键字代表当前对象调用该方法的对象用于区分成员变量和局部变量this.成员构造方法特点方法名与类名相同没有返回值连void都没有在new时自动调用空参构造javapublic Person() {}每个类默认有一个无参构造若自己写了有参构造则默认无参构造失效建议都写。有参构造javapublic Person(String name, int age) { this.name name; this.age age; }标准 JavaBean要求类为public私有属性提供无参构造、有参构造提供 getter / setterjavapublic class Student { private int sid; private String name; public Student() {} public Student(int sid, String name) { this.sid sid; this.name name; } // getter / setter 省略可用 IDE 快捷键生成 }IDEA 快捷键Alt Insert或Alt Fn Insert生成构造、getter/setter。第十三章 static 关键字特点修饰成员变量或方法属于类不属于对象。随类加载而加载优先于对象存在。所有对象共享静态成员。调用方式类名.静态成员javapublic class Student { static String classroom; // 静态成员 } // 调用 Student.classroom 101教室;静态与非静态访问规则场景访问非静态访问静态静态方法中不能需 new 对象能直接或类名调用非静态方法中能直接或 new 对象能直接或类名调用使用场景工具类工具类特点构造方法私有化成员全部静态javapublic class ArrayTools { private ArrayTools() {} public static int getSum(int[] arr) { int sum 0; for (int num : arr) sum num; return sum; } }

更多文章