Java SE基础部分--05.数组

标签:?java数组??数组??java

学习目标:

1、数组定义和访问

2、数组原理内存图

3、数组的常见操作

4、数组作为方法参数和返回值

一、数组的定义和访问

1、数组概述

数组:一个定长的容器。

容器:是指能够保存数据的空间。

2、数组的定义

???????? 方式一:数组存储的数据类型[] 数组名字 = new 数组存储的数据类型[长度];

?????????????????? 例子:int[]? arr = new? int[4];

???????? 方式二:数据类型[] 数组名 = new 数据类型[]{元素1,元素2,元素3...};

?????????????????? 例子:int[]? arr =? new? int[]{1,2,3};

???????? 方式三:数据类型[]? 数组名 = {元素1, 元素2, 元素3……..};

?????????????????? 例子 int[]? arr? = {1,2,3};

3、数组的访问

数组的索引:数组中每个空间、都会自动有一个编号、从0开始、可以通过下标来访问数组中的元素

? ? 格式:数组名[索引]

数组的长度:每个数组都有长度、且是固定的、可用length获取数组的长度、结果为int类型、最大索引为:数组名.length-1。

? ? ? ?格式:数组.length

例子:

public static void main(String[] args) {

? ???? int[] arr = new int[]{1,2,3,4,5};

? ???? //打印数组的属性,输出结果是5

? ???? System.out.println(arr.length);

}

索引访问数组中的元素:

? ? ? ? ?数组名[索引] = 数值:为数组中的元素赋值

? ? ? ? ?数据类型? 变量名 = 数组名[索引]:获取数组中的元素

例子:

public static void main(String[] args) {

??? //定义存储int类型数组,赋值元素1,2,3,4,5

??? int[] arr = {1,2,3,4,5};

??? //为0索引元素赋值为6

??? arr[0] = 6;

??? //获取数组0索引上的元素

??? int i = arr[0];

??? System.out.println(i);

??? //直接输出数组0索引元素

??? System.out.println(arr[0]);

}

二、数组原理内存图

1、内存概述

???????? 内存:计算机中有二个重要存储区域、一个是内存一个是硬盘、内存是临时存储区域,作用是运行程序

2Java虚拟机的内存划分

???????? 为了提高运算效率、JVM对内存空间进行了不同的划分、每一片区域都有特定的处理数据方式和内存管理方式

JVM的内存划分:

2.1、栈内存:栈内存主要是用来运行方法的、所有的方法都必须在栈内存中运行、

方法进栈:方法一旦被调用,就会加载到栈内存中去运行,这个过程我们叫做方法进栈。而且JVM只会运行处于栈内存顶部的方法。

方法出栈:当方法执行结束之后就会从栈内存中消失,这个过程我们叫做方法的出栈(弹栈)。

栈内存中变量细节:在方法中定义的所有变量,都会在这个方法所在的内存中开辟空间。在栈内存中定义的变量,不初始化,是不能直接使用的

2.2、堆内存:在程序中使用new 关键字创建出来的所有东西(特殊定义格式除外),都会保存在堆内存中。并且有系统分配的唯一的内存地址。

堆内存中变量细节:堆内存中开辟的空间,都会有默认的初始化数据。因此可以直接使用。

整数:默认是0

小数 默认0.0.

boolean 默认是false

char 默认是 ‘\u0000’

引用数据类型默认值是 null

?

2.3、方法区:

JVM在加载class文件时,所有的class文件都会被加载到方法区中

3、数组在内存中的存储

一个数组的内存图

public static void main(String[] args) {

? ???? int[] arr = new int[3];

? ???? System.out.println(arr);//[[email?protected]

}

说明:输出的结果是[[email?protected]、是数组在内存中的地址、new出来的内空、都是在堆内存中存储的、而堆内存中载辟的每个空间都有有一个唯一的内存地址。而等号左侧的变量arr中保存的是数组的地址。

二个数组内存图:

public static void main(String[] args) {

??? int[] arr1 = new int[3];

??? int[] arr2 = new int[2];

??? System.out.println(arr);

??? System.out.println(arr2);

}

三、数组的常见操作

1、数组越界异

?public static void main(String[] args) {

??? int[] arr = {1,2,3};

??? System.out.println(arr[3]);

}

原因:是访访问了数组中不存在的元素、程序运行后,将会抛出 ArrayIndexOutOfBoundsException 数组越界异常

2、数组空指针异常

public static void main(String[] args) {

??? int[] arr = {1,2,3};

??? arr = null;

??? System.out.println(arr[0]);

}

原因:arr = null 意味着变量arr将不会在保存数组的内存地址,也就不允许再操作数组了,因此运行的时候会抛出NullPointerException 空指针异常

空指针异常在内存图中的表现

?

3、两个变量指向一个数组

int[] arr = new int[5];

int[] arr2 = arr;

arr = null;

上述代码没有垃圾,因为有两个指针指向同一个堆中的内存地址。此时有一个指针不在执行堆中内存,但是有另外一条指针依然指向,因此没有垃圾。

4、数组的遍历【重点】

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

???????? 数组的5种遍历方法:(了解)后面会学到。

(1)、 根据下标 for 遍历????????

 for(int i = 0; i<5; i++){}

(2)、foreach遍历? ? ? ??

for(String str :array){}

(3)、迭代器遍历(这个是集合、)用到Arrays工具类方法

List list = Arrays.asList(array);

Iterator itr = list.iterator();

While(itr.hasNext()){

???????? Sout(itr.next())

}.

(4)、Stream遍历

 ? Stream.of(array).foreach(System.out::println)

(5)、Arrays工具类

 ?System.out.println(java.util.Arrays.toString(array));

5、数组获取最大值元素

public static void main(String[] args) {

??? int[] arr = { 5, 15, 2000, 10000, 100, 4000 };

??? //定义变量,保存数组中0索引的元素

??? int max = arr[0];

??? //遍历数组,取出每个元素

??? for (int i = 1; i < arr.length; i++) {

??????? //遍历到的元素和变量max比较

??????? //如果数组元素大于max

??????? if (arr[i] > max) {

??????????? //max记录住大值

??????????? max = arr[i];

??????? }

??? }

??? System.out.println("数组最大值是: " + max);

}

6、数组反转

始数组为1,2,3,4,5,反转后的数组为5,4,3,2,1

public static void main(String[] args) {

??? int[] arr = { 1, 2, 3, 4, 5 };

??? /*

????? 循环中定义变量min=0最小索引

????? max=arr.length-1最大索引

????? min++,max--

???? */

??? 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 = 0; i < arr.length; i++) {

??? ???????? System.out.println(arr[i]);

??? }

}

四、数组作为方法参数和返回值

1、数组作为方法参数、传递的参数是数组的内存的地址

代码:

public static void main(String[] args) {

??? int[] arr = { 1, 3, 5, 7, 9 };

??? //调用方法,传递数组

??? printArray(arr);

}

/*

? 创建方法,方法接收数组类型的参数

? 进行数组的遍历

*/

public static void printArray(int[] arr) {

??? for (int i = 0; i < arr.length; i++) {

?????????????????? System.out.println(arr[i]);

??? }

}

2、数组作为方法的返回值、返回的是数组的内存地址

public static void main(String[] args) {

??? //调用方法,接收数组的返回值

??? //接收到的是数组的内存地址

??? int[] arr = getArray();

??? for (int i = 0; i < arr.length; i++) {

? ? ? ? ?System.out.println(arr[i]);

??? }

}

/*

? 创建方法,返回值是数组类型

? return返回数组的地址

*/

public static int[] getArray() {

??? int[] arr = { 1, 3, 5, 7, 9 };

??? //返回数组的地址,返回到调用者

??? return arr;

}

3、区别方法参数类型:

public static void main(String[] args) {

??? int a = 3;

??? int b = 5;

??? change(a, b); //方法栈内存

??? System.out.println(a);

??? System.out.println(b);

}

public static void change(int a, int b) {

??? a = a + b;

??? b = b + a;

}

显示:3? 5
public static void main(String[] args) {

??? int[] arr = {3,5};

??? change(arr);//数组堆内存

??? System.out.print( arr[0] );

? ???? System.out.print( arr[1] );

}

public static void change(int[] arr) {

? ???? arr[0] = arr[0]+arr[0];

??? arr[1] = arr[1]+arr[1];

}

显示 6?? 10

?

原文链接:加载失败,请重新获取