0807-0812
一、本周回顾
本周,我们主要学习了Java中的数组和方法,并在实际练习中应用了这些知识。以下是我们的进展和总结:
- 数组的定义和初始化:学会了如何定义和初始化数组,并且通过索引访问数组中的元素。还学习了使用循环遍历数组,并对数组中的元素进行操作。
- 多维数组:学习了Java中的多维数组,特别是二维数组的使用。我了解了如何创建和初始化二维数组,并学会了使用嵌套循环来访问和操作元素。
- 方法的定义和调用:学习了如何定义方法,并理解了方法的参数和返回值的作用。并学会了在程序中调用这些方法。
- 方法的重载:学习了方法的重载。重载允许我们在方法名相同但参数列表不同的情况下实现多态性。
二、感受
- 规划时间:我意识到规划时间对于高效学习很重要。在这一周中,我有计划地安排了每天的学习时间,并设定了明确的学习目标。这让我更加专注于学习,并在有限的时间内取得了可观的进展。
- 主动参与和实践:仅仅通过听讲是远远不够的。我发现,主动参与和实践是真正加深理解和掌握知识的关键。在这一周中,我积极参与了讨论和交流,同时也通过练习题来巩固所学的知识。
- 错误:犯错是学习的一部分。在这一周中,我可能犯了好多好多错误,但我知道这些错误是我成长和学习的机会。这是我并没有掌握的知识,需要进一步的加强,通过接受错误并从中汲取教训,我能够更好地理解概念和解决问题。
- 共享:学习是一个共享的过程。在近几周中,我积极和同学进行讨论和交流,共同解决问题、分享发现和经验。通过和同学交流学习,我发现每个人的思维方式都是不一样的,多和别人交流是可以拓展自己的思维。
保持状态就会进步,或多或少取决于自己
永远不要站在原地等结果
三、学习笔记
数组
一维数组;静态初始化数组;数据类型[ ] 数组名;动态初始化数组;数据类型[ ] 数组名 = new 数据类型[数组长都度]
定义数组时,元素类型不同,默认值不同
数组元素类型 | 默认初始值 |
---|---|
byte、short、int,long | 0 |
float,double | 0.0 |
char | ‘\u0000’(空字符) |
boolean | false |
引用数据类型 | null |
数组执行原理
方法区:字节码文件先加载到这里
栈:方法运行时所进入的内存区域,由于变量在方法中,所以变量也在这一块 区域中
堆:存储new出来的东西,并分配地址。由于数组是new 出来的,所以数组也在 这块区域。
数组使用过程可能出现的问题
数组下标越界:
如果在数组中保存的元素可以自动提升(自动类型转化)为数组自己的类型,那是可以保存的
数组反转:
某个数组有5个数据:10,20,30,40,50,请将这个数组中的数据进行反转。 [10, 20, 30, 40, 50] 反转后 [50, 40, 30, 20, 10]
解法:
1.每次交换,需要有左右两边的两个索引,我们可以用i和j表示 刚开始i=0,j=数组长度-1;
2.每次让i和j索引位置的两个元素互换位置 arr[i]和arr[j]互换位置
3.每次还完位置之后,让i往右移动一位,让j往前移动一位
排序
排序算法 有多种,常用的排序算法有冒泡排序、插入排序、选择排序等…
选择排序:
表现最稳定的排序算法之一,因为无论什么数据进去都是O(n2)的时间复杂度,所 以用到它的时候,数据规模越小越好。唯一的好处可能就是不占用额外的内存空间了 吧。选择排序(Selection-sort)是一种简单直观的排序算法。
它的工作原理:首先在未排序序 列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素 中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素 均排序完毕。 n个记录的直接选择排序可经过n-1趟直接选择排序得到有序结果。
public static void main(String[] args) {
//选择排序
int[] arr = {55,34,2,77,45,4,8,40};
for (int i = 0; i < arr.length - 1; i++) {
int current = arr[i];
int index = i;
for (int j = i + 1; j < arr.length; j++) {
if (arr[index] > arr[j]){
index = j;
}
}
arr[i] = arr[index];
arr[index] = current;
}
for (int i1 = 0; i1 < arr.length; i1++) {
System.out.println(arr[i1]);
}
}
插入排序:
从第i + 1个数据向前找,认为前面的数据是已经排列好的,若索引大于等于零并且若前面的数大于当前数,把前面数据赋值给当前数据,若不满足索引大于等于零并且若前面的数大于当前数,跳出循环,把当前数据插入
public static void main(String[] args) {
//插入排序
int[] arr = {55,34,2,77,45,4,8,40};
for (int i = 0; i < arr.length -1; i++) {
int current = arr[i + 1];
int index = i;
for(;index >= 0 && current < arr[index];index--){
arr[index + 1] = arr[index];
}
arr[index + 1 ] = current;
}
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + "\t");
}
}
冒泡排序:
每次循环,比较相邻的两个数据,进行交换位置,会找到一个最大或最小的数字,把他放到数组一边
每循环一次,都可以少遍历一个数据
public static void main(String[] args) {
//冒泡排序
int[] arr = {2,3,1,8,3,9,6};
for (int i = 0; i < arr.length - 1; i++) {
for (int j = 0; j < arr.length - 1 - i; j++) {
if (arr[j + 1] > arr[j]){
arr[j] = arr[j + 1] ^ arr[j];
arr[j + 1] = arr[j + 1] ^ arr[j];
arr[j] = arr[j + 1] ^ arr[j];
}
}
}
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + "\t");
}
}
二分查找:
二分查找(Binary Search)算法,也叫折半查找算法。二分查找的思想非常简单,有 点类似分治的思想。二分查找针对的是一个有序的数据集合,每次都通过跟区间的中间元素对比,将待查找的区间缩小为之前的一半,直到找到要查找的元素,或者区间 被缩小为 0。
public static void main(String[] args) {
int[] arr = {1,2,5,7,9,10};
int start = arr[0];
int end = arr.length - 1;
int mid = (start + end) / 2;
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个数字");
int key = sc.nextInt();
while( end >= start){
if (key == arr[mid]){
System.out.println(mid);
break;
}else if (key < arr[mid]){
end = mid - 1;
}else {
start = mid + 1;
}
mid = (start + end) / 2;
}
if (end < start){
System.out.println(-1);
}
}
多维数组:
二维数组:数据类型[ ] [ ] 数组名;
初始化:
int[] [] arr = new int[3] [4];
int[] [] arr = {
{1,2,3},
{4,5}
}
二维数组的迭代:
for(int i = 0;i < arr.length;i++){
for(int j; j< arr[i].length;j++){
System.out.println(a)
}}
方法
方法是一种语法结构,它可以把一段代码封装成一个功能,以便重复调用。
修饰符(Modifier)是一种关键字,用于修饰类、方法、变量等各种程序元 素的声明。Java中常用的修饰符包括以下几种:
-
访问修饰符:用于控制程序元素的访问权限,包括public、protected、 private和默认(不写任何修饰符)四种。
-
非访问修饰符:用于控制程序元素的行为,包括static、final、abstract、 synchronized、volatile等。
-
其他修饰符:包括transient、native、strictfp等
使用方法的好处:
- 提高代码的复用性,提高了开发率
- 让程序的逻辑更清晰
修饰符 返回值类型 方法名( 形参列表 ){
方法体
return 返回值;
}
方法调用:
方法名(参数);
例题:
将main里的arr的地址赋值给Insert中的arr,若Insert中的arr改变,原数据也会改变
将main里a的值赋给addNum中的a,若addNum中的a改变,原数据a不变
public static void Insert(int[] arr){
arr[2] = 99;
}
public static int addNum(int a){
a += 10;
return a;
}
public static void main(String[] args) {
int[] arr = {1,2,3,4,5};
Insert(arr);
for (int i : arr) {
System.out.print(i + " "); //1 2 99 4 5
}
System.out.println();
int a = 20;
System.out.println(a); //20
System.out.println(addNum(a)); //30
}
方法重载:
一个类中,方法的名字相同,方法的参数不同(参数的个数、类型)
方法重载的调用,注意实参与形参一一匹配的规则调用