数组
概念
数组是一种容器,可以同时存放多个数据值。
注意事项:
- 数组是引用数据类型。
- 数组当中的多个数据值,类型必须统一。
- 数组的长度在程序运行期间不可改变。
定义格式
数组初始化:向内存中穿件一个数组,并且赋予其初始化值。
两种常见初始化方式:
1,动态初始化(给定长度)
2,静态初始化(给定内容)
动态初始化格式:
数据类型 []数组名称 = new 数据类型[数组长度]
左侧的数据类型:数组当中保存的数据,都是什么类型。
左侧的中括号:代表一个数组。
左侧的数组名称:代表数组的一个名字。
右侧的new:代表创建数组的动作。
右侧的数据类型:必须和左侧的数据类型一致。
右侧的数据长度:在数组中保存数组的数量值,是一个iint类型
代码实现
package cn.itcast.day05.demo01;
public class Demo01Array {
public static void main(String[] args) {
//数据类型 []数组名称 = new 数据类型[数组长度] 数组的动态初始化
//创建一个数组,能存放300个int类型的数据
int[] array1 = new int[300];
//创建一个数组,能存放300个double类型的数据
double[]array2 = new double[300];
//创建一个数组,能存放300个字符串类型的数据
String[]array3 = new String[300];
}
}
静态初始化格式:
数据类型[]数组名称 = new 数据类型 []{元素1,元素2,元素3};
代码实现:
package cn.itcast.day05.demo01;
public class Demo02Array {
public static void main(String[] args) {
//直接创建一个数组,里面都是int数字,具体内容为 12,222,33.
int[]array1 = new int[]{12,222,33};
//直接创建一个数组,里面都是String字符春,具体内容为 "hello"."word","what".
String[]array2 = new String[]{"hello","word","what"};
}
}
注意事项:
虽然静态初始化没有直接指定其长度,但是根据大括号的内容可以推算出数组的长度。
静态初始化的省略格式:
数据类型[]数组名称 ={元素1,元素2,元素3};
注意事项:
-
虽然静态初始化没有直接指定其长度,但是根据大括号的内容可以推算出数组的长度。
-
动态初始化的标准格式可以拆分为两个步骤。
-
静态初始化的标准格式页可以拆分为两个步骤。
-
一旦使用静态初始化的省略格式,就不能够再拆分为两个步骤。
使用建议:
如果确定数组的具体内容,用静态初始化,否则,用动态初始化。
代码实现:
package cn.itcast.day05.demo01; public class Demo03Array { public static void main(String[] args) { //静态初始化的省略格式 int[]array1 = {1,23,44}; //动态初始化的标准格式可以拆分为两个步骤。 int[]array2; array2 = new int[12]; //静态初始化的标准格式可以拆分为两个步骤。 int[]array3; array3 = new int[]{11,22,33}; } }
访问数组元素进行获取
直接打印地址数组名称会的到数组对应的内存地址哈希值。
二进制:01
十进制:0123456789
十六进制:0123456789abcdef
访问数组元素的格式:
数组名称(索引值)
【索引值】就是一个int数字,代表数组元素的编号。
索引值从0开始,一致到数组的长度减1为止。
代码实现:
package cn.itcast.day05.demo01; public class Demo04ArrayUse { public static void main(String[] args) { int []num = {12,23,34}; System.out.println(num);//[I@1540e19d 内存地址哈希值 //直接打印数组当中的元素内容 System.out.println(num[0]); System.out.println(num[1]); System.out.println(num[2]); System.out.println("-------------"); //将数组当中的元素赋值交给变量,然后在进行打印。 int num1 = num[2]; System.out.println(num1); } }
访问数组元素进行赋值
使用动态初始化的时候,其中的元素会自动拥有一个默认值,规则如下:
如果是整数类型,默认值为0.
如果是浮点型,默认值为0.0.
如果是字符型,默认值为‘’\u0000’.
如果是布尔型,默认值为false.
如果是引用类型,默认值为null.
注意事项
静态初始化其实也有默认值的过程,只不过系统自动将默认值替换成了大括号当中具体的值。
代码实现如下:
package cn.itcast.day05.demo01; public class Demo05ArrayUse { public static void main(String[] args) { //使用动态初始化创建数组 int[]array = new int[3]; System.out.println(array);//内存地址哈希值 System.out.println(array[0]);//0 System.out.println(array[1]);//0 System.out.println(array[2]);//0 System.out.println("----------------"); //给数组元素赋值 array[2] = 100; System.out.println(array[2]); } }
JAVA当中的内存划分
Java内存需要划分成为五个部分。
-
栈(Stack)存放的都是方法中的局部变量,方法的运行一定要在栈当中运行。
局部变量::方法的参数,或者是方法{}内部的变量。
作用域:一旦超出作用域,立即从栈内存当中消失,
-
堆(Heap):凡是new出来的东西,都在堆当中。
堆内存中的东西都有一个地址值,16进制。
堆内存中的数据都默认值,规则:
-
如果是整数类型,默认值为0.
如果是浮点型,默认值为0.0.
如果是字符型,默认值为‘’\u0000’.
如果是布尔型,默认值为false.
如果是引用类型,默认值为null.
3。方法去(Method Area)存储class先关的信息,包含方法的信息;
4。本地方法栈(Native Method Stack):与操作系统有 关
5 寄存器:(PC Register)与cpu相关。
一个数组的内存图
两个数组的内存图
两个引用指向同一个数组
常见问题
-
数组越界异常。
代码演示
package cn.itcast.day05.demo03; /** * 如果访问数组元素的时候,数组索引不存在,就会发生数组苏索引越界异常 * ArrayIndexOutOfBoundsException * 原因:索引编号写错了。 * 解决:修改成为可用的索引。 */ public class Demo01ArrayIndex { public static void main(String[] args) { int [] array = {12,23,34}; System.out.println(array[0]); System.out.println(array[1]); System.out.println(array[2]); //System.out.println(array[3]); 数组索引越界 } }
2.空指针异常。
代码实现
package cn.itcast.day05.demo03;
/**
* 所有的引用数据类型都可以赋值一个null值,代表什么也没有。
* 数组只有只用new初始化才能使用其元素,
* 如果只是赋值了一个null,没有进行常见,那么金辉出现空指针异常
* .NullPointerException
* 原因:忘了new
* 解决:补上new
*/
public class Demo02ArrayNull {
public static void main(String[] args) {
int[]array = null;
// array = new int[3];
System.out.println(array[0]);
}
}
获取数组的长度
代码实现
package cn.itcast.day05.demo03;
public class Demo03ArrayLength {
public static void main(String[] args) {
/**
* 获取数组的长度
* 数组名称.length,会返回一个int数组,代表数组的长度
*
* 数组一旦创建,程序运行期间,长度不能发生改变。
*/
int[]array = {12,22,34};
int num = array.length;
System.out.println(num);//3
System.out.println("-----------------------");
int[] arrayc = new int[4];
System.out.println(arrayc.length);
arrayc = new int[6];
System.out.println(arrayc.length);//每new一次就创建了一个新的数组。
}
}
注意:
数组的遍历
就是对数组中的每一个元素进行挨个处理,默认的处理方式就是打印输出。
代码实现:
package cn.itcast.day05.demo03;
public class Demo04Array {
public static void main(String[] args) {
int[] array = {1, 2, 3, 4, 5, 6, 7, 7};
for (int i = 0; i < array.length; i++) {
System.out.println(array[i]);
}
}
}
练习
1.求出数组当中的最大值
代码实现:
package cn.itcast.day05.demo03;
public class Demo05ArrayMax {
public static void main(String[] args) {
int[] array = {12, 23, 34, 56, 67, 58};
int max = array[0];//定义擂台
for (int i = 1; i < array.length; i++) {
if (array[i] > max) {
max = array[i];
}
}
System.out.println(max);
}
}
求出数组当中的最小值。
代码实现:
package cn.itcast.day05.demo03;
public class Demo06ArrayMin {
public static void main(String[] args) {
int[] array = {12, 23, 34, 56, 67, 58};
int min = array[0];//定义擂台
for (int i = 1; i < array.length; i++) {
if (array[i] < min) {
min = array[i];
}
}
System.out.println(min);
}
}
2.数组元素的反转
代码实现:
package cn.itcast.day05.demo03;
import com.sun.xml.internal.ws.api.model.wsdl.WSDLOutput;
import org.w3c.dom.ls.LSOutput;
public class DemoArrayReverse {
public static void main(String[] args) {
int[]array = {12,23,34,45,56,67};
for (int i = 0; i < array.length; i++) {
System.out.println(array[i]);
}
System.out.println("-----------------------");
/**
* 进行数组元素的反转
* 初始化语句:int min = 0,int max = array.length - 1
* 条件判断 min < max
* 步进表达式 min++ ,max --
* 循环体 第三个变量倒手
*/
for (int min = 0,max = array.length - 1;min < max;min++,max--){
int temp = array[min];
array[min] = array[max];
array[max] = temp;
}
//z再次遍历数组当中的元素。
for (int i = 0; i < array.length; i++) {
System.out.println(array[i]);
}
}
}
步骤:
3.数组作为方法参数传递
代码实现:
package cn.itcast.day05.demo04;
/**
* 数组可以作为方法的参数,当调用方法的时候,向小括号中传入参数,其实传入的是数组的地址值。
*/
public class Demo01ArrayParam {
public static void main(String[] args) {
int[] array = {12, 2, 3, 45, 5};
System.out.println(array);
printArray(array);//传递进去的就是array当中的地址值。
System.out.println("------------aaaa---------------");
printArray(array);
System.out.println("-------------bbbbb---------------");
}
/**
* 三要素
* 返回值类型 无
* 方法名 printArray
* 参数列表 int[]array
*/
public static void printArray(int[] array) {
for (int i = 0; i < array.length; i++) {
System.out.println(array[i]);
}
}
}
4.数组作为返回值
代码实现
package cn.itcast.day05.demo04;
/**
* 注意:
* 一个方法可以有多个餐宿,但是只能有一个或0个返回值。
* 如果希望一个方法中有多个结果并返回,只需要把数组作为返回值类型即可。
* 任何数据类型,都能作为方法 的参数类型,或者返回值类型。
* 数组作为方法的参数,传输进去的其实是方法 的地址值。
* 数组作为方法的返回值,返回的其实也是数组的地址值。
*/
public class Demo02ArrayReturn {
public static void main(String[] args) {
int[] result = calculate(12, 22, 32);
System.out.println(result);//地址值
System.out.println("总数为" + result[0]);
System.out.println("平均数为" + result[1]);
}
/**
* 三要素:
* 返回值类型 int[]
* 方法名 calculate
* 参数列表 int a,int b,int c
*/
public static int[] calculate(int a, int b, int c) {
int num = a + b + c;//总数
int avg = num / 3;
int[] array = {num, avg};
System.out.println(array);//地址值
return array;
}
}