【Java从入门到入土】数组&方法

数组

数组就是存储数据长度固定的容器,保证多个数据的数据类型要一致。注意:此处说的是固定,记住数组一旦指定长度,那么长度就固定了。

数组的定义

第一种方式

数据类型[] 数组名 = new 数据类型[长度];

数组定义格式详解:
①数据类型:创建的数组容器可以存储什么数据类型。
②[]:表示数组。
③数组名:为定义的数组起个变量名,满足标识符规范,可以使数组名来操作数组。
④new:关键字,创建数组使用的关键字。
⑤[长度]:数组的长度,表示数组容器中可以存储多少个元素。
注意:数组有定长特性,长度一旦指定,不可更改。和水杯道理相同,买了一个2升的水杯,总容量就是2升,里面装的水不能多。
举例:定义可以存储3个整数的数组容器,代码如下:

int[] arr = new int[3];

第二种方式

数据类型[] 数组名 = new 数据类型[] {
    
    元素1,元素2,元素3 ...};
int[] arr = new int[] {
    
    1, 2, 3, 4, 5}

第三种方式

数据类型[] 数组名 = {
    
    元素1,元素2,元素3 ...};
int[] arr = {
    
    1, 2, 3, 4, 5};

数组的访问

索引(index):每一个存储到数组的元素,都会自动的拥有一个编号,从0开始,这个自动编号称为数组索引 ,可以通过数组的索引访问到数组中的元素。
格式:

数组名[索引] 例如:arr[1]

数组的长度属性:每个数组都具有长度,而且是固定的,Java中赋予了数组的一个属性,可以获取到数组的长度,语句为:数组名.length,属性length的执行结果是数组的长度,int类型结果。由此可以推断出,数组的索引是从0开始,那么数组的最大索引值就是数组名.length-1
索引访问数组中的元素
①数组名[索引]=数值,为数组中的元素赋值
②变量=数组名[索引],获取出数组中的元素

数组原理内存图

内存是计算机中的重要原件,临时存储区域,作用是运行程序。我们编写的程序是存放在硬盘中的,在硬盘中的程序是不会运行的,必须加载进内存中才能运行,运行完毕后会清空内存。 Java虚拟机要运行程序,必须要对内存进行空间的分配和管理。
Java虚拟机的内存划分
为了提高运算效率,就对空间进行了不同区域的划分,因为每一片区域都有特定的处理数据方式和内存管理方式。
在这里插入图片描述
数组在内存中的存储

public static void main(String[] args) {
    
     
    int[] arr = new int[3]; 
    System.out.println(arr); // [I@5f150435
}

以上方法执行,输出的结果是[I@5f150435,这个是什么呢?它是数组在内存中的地址。new出来的内容,都是在堆内存中存储的,而方法中的变量arr是在栈内存中存储的,保存的是数组的地址。
在这里插入图片描述
数组越界异常
创建数组,赋值3个元素,数组的索引就是0,1,2,没有3索引,因此我们不能访问数组中不存在的索引。如果访问程序运行后,将会抛出数组角标越界异常。在开发中,数组的角标越界异常是不能出现的,一 旦出现了,就必须要修改我们编写的代码。
数组空指针异常

public static void main(String[] args) {
    
     
    int[] arr = {
    
    1, 2, 3}; 
    arr = null; //模拟数组空指针异常
    System.out.println(arr[0]); 
}

arr = null; 这行代码,意味着变量arr将不会保存数组的内存地址,也就不允许再操作数组了,因此运行的时候会抛出NullPointerException空指针异常。在开发中,数组的越界异常是不能出现的,一旦出现了,我们也必须要修改我们编写的代码。我们在编写代码时,应该要避免这两种异常。

数组的遍历

什么是遍历?遍历其实就是将数组中的每个元素分别获取出来。

public static void main(String[] args) {
    
     
    int[] arr = {
    
    1, 2, 3, 4, 5}; 
    System.out.println(arr[0]); 
    System.out.println(arr[1]); 
    System.out.println(arr[2]); 
    System.out.println(arr[3]); 
    System.out.println(arr[4]); 
}

以上代码是可以将数组中每个元素全部遍历出来,但是如果数组元素非常多,这种写法肯定不行,因此我们需要改造成循环的写法。数组中元素的索引是0到lenght-1 ,可以作为循环的条件出现。

public static void main(String[] args) {
    
     
    int[] arr = {
    
    1, 2, 3, 4, 5}; 
    for (int i = 0; i < arr.length; i++) {
    
     
        System.out.println(arr[i]); 
    }
}

获取数组中最大值元素
实现思路:
①定义变量,保存数组中0索引上的元素
②遍历数组,获取出数组中的每个元素
③将遍历到的元素和0索引上值的变量进行比较
④如果数组元素的值大于该变量的值,变量记录住新的值
⑤数组循环遍历结束,变量保存的就是数组中的最大值

public static void main(String[] args) {
    
    
	int[] arr = {
    
    3, 23, 7, 53, 12};
	int x = arr[0];
	for(int i = 0; i < arr.length; i++) {
    
    
		if(arr[i] > x) {
    
    
			x = arr[i];
		}
	}
	System.out.println(x);
}

数组的排序

冒泡排序
原理:依次比较相邻的两个数,将小数放在前面,大数放在后面。即在第一趟:首先比较第1个和第2个数,将小数放前,大数放后;然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后。重复第一趟步骤,直至全部排序完成。

public static void main(String[] args) {
    
    
    int[] arr = {
    
    24, 69, 80, 57, 13};
    //外层循环控制比较趟数 5个元素一共需要比较4趟
    for(int i = 1; i < arr.length; i++) {
    
    
        //内层循环控制每一趟的比较次数,每一趟需要比较arr.length-i次
        for(int j = 0; j < arr.length-i; j++) {
    
    
            if(arr[j] > arr[j+1]) {
    
    
                	int temp = arr[j];
                 arr[j] = arr[j+1];
                arr[j+1] = temp;
           }
       }
    }
    for(int i : arr) {
    
    
        System.out.println(i);
    }
}

选择排序
原理:使用数组的第一位和数组后面的每一位进行比较大小,若第一位比第j位大,则交换;再用第二位和后面的每一位进行比较,以此类推。

public static void main(String[] args) {
    
    
    int[] arr = {
    
    24, 69, 80, 57, 13};
    //外层循环控制比较躺数  5个元素一共需要比较4趟
    for(int i = 0;i < arr.length-1; i++) {
    
    
        //内层循环控制每一趟的比较次数 第i位和数组中后面的每一位元素进行比较
        for(int j = i+1; j < arr.length; j++) {
    
    
            if(arr[i] > arr[j]) {
    
    
                int temp = arr[j];
                arr[j] = arr[i];
               arr[i] = temp;
			}
		}
	}
    for(int i : arr) {
    
    
        System.out.println(i);
    }
}

方法

我们在学习运算符的时候,都为每个运算符单独的创建一个新的类和main方法,我们会发现这样编写代码非常的繁琐,而且重复的代码过多。能否避免这些重复的代码呢,就需要使用方法来实现。
方法:就是将一个功能抽取出来,把代码单独定义在一个大括号内,形成一个单独的功能。当我们需要这个功能的时候,就可以去调用。这样即实现了代码的复用性,也解决了代码冗余的现象。

方法的定义

修饰符 返回值类型 方法名(参数列表) {
    
     
	....
	return ; 
}

定义方法时的两个明确:
需求:定义方法来实现两个整数的求和计算。
①明确返回值类型:方法计算的是整数的求和,结果也必然是个整数,返回值类型定义为int类型。
②明确参数列表:计算哪两个整数的和,并不清楚,但可以确定是整数,参数列表可以定义两个int类型的变量,由调用者调用方法时传递。
注意事项:
①方法必须定义在类的main方法外
②方法中不能定义方法

方法的调用

①直接调用:直接写方法名调用

public static void main(String[] args) {
    
    
    show();
}
public static void show() {
    
     
    System.out.println("方法被调用"); 
}

②赋值调用:调用方法,在方法前面定义变量,接收方法返回值

public static void main(String[] args) {
    
     
    int sum = getSum(5, 6);
    System.out.println(sum);
}
public static int getSum(int a, int b) {
    
     
    return a + b;
}

③输出语句调用

public static void main(String[] args) {
    
     
    System.out.println(getSum(5, 6)); 
}
public static int getSum(int a, int b) {
    
     
    return a + b; 
}

猜你喜欢

转载自blog.csdn.net/weixin_51678389/article/details/109155848