一,java虚拟机内存的划分
内存在计算机中是一个比较重要的原件,他为数据从硬盘传输到cup起到了承上启下的作用。我们编写的程序是放在硬盘中,要运行程序就要放在内存条中,程序运行结束后就会去空内存。
为了提高运行效率,java虚拟机运行程序时,对内存空间进行了分配和管理。
java虚拟机内存划分为:
寄存器 给cup使用,我们开发不用知道
本地方法栈 JVM在使用操作系统功能的时候使用,和开发无关
方法栈 存储可以运行的class文件
堆内存 存储对象或者数组, new来创建的,都存储在堆内存
方法栈 方法运行时使用的内存,比如main方法运行,进入方法栈中执行
java数组的内存图:
二,数组定义及其操作
当我们要储存大量数据时,例如50个学生的考试成绩。这时我们用java的基本数据类型来储存这些数据时要定义50个,这样不仅麻烦,还造成内存的浪费。因此我们可以使用一种容器来进行储存。将所有成绩全部储存到一个容器中,统一操作。
容器:将多个数据存储到一起,期中的每个数据称为容器的元素。
java数组:在保持存储的数据的数据类型的一致的前提下,数组接收存储数据长度固定的容器。
(1)数组的定义(动态和静态)
1.动态初始化(指定长度):在创建数组的时候,直接指定数组当中的数据元素个数。
格式: 数组存储的数据类型 [ ] 数组名字 = new 数组存储的数据类型 [ 长度 ];
代码示例:
package cn.itcate.day4demo; public class Demo01Array { public static void main(String[] args) { // 动态初始化 int[] arrayA = new int[300]; double[] arrayB = new double[10]; String[] arrayC = new String[5]; } }
注意:
左侧数据类型:也就是数组当中保存的数据,全都是统一的什么类型
左侧的中括号:代表我是一个数组
左侧数组名称:给数组取一个名字
右侧的new:代表创建数组的动作
右侧数据类型:必须和左边的数据类型保持一致
右侧中括号的长度:也就是数组当中,到底可以保存多少个数据,是一个int数字
2,静态初始化(指定内容):在创建数组的时候,不直接指定数据个数多少,而是直接将具体的数据内容进行指定。
格式一: 数据类型 [ ] 数组名 = new 数据类型 [ ] {元素1,元素2,元素3...};
代码示例:
package cn.itcate.day4demo; public class Demo02Array { public static void main(String[] args) { // 整数数组 int[] arrayA = new int[] {1,2,3,4,5}; // 字符串数组 String[] arrayB = new String[] {"Hello", "World", "Python", "Java"}; } }
格式二: 数据类型 [ ] 数组名 = {元素1,元素2,元素3...};
代码示例:
package cn.itcate.day4demo; public class Demo03Array { public static void main(String[] args) { // 整数数组 int[] arrayA = {1,2,3,4,5}; // 字符串数组 String[] arrayB = {"Hello", "World", "Java"}; } }
建议:如果不确定数组当中的具体内容,用动态初始化;否则,已经确定了具体的内容,用静态初始化。
(二),数组的访问
数组的索引:存储的到数组的数据都是从0开始自动编号的,这些编号就成为数组的索引。通过索引能访问到数组里面的元素。
格式: 数组名【索引值】
代码如下:
package cn.itcate.day4demo; public class Demo04ArrayUse { public static void main(String[] args) { // 定义一个整数数组 int[] arrayA = new int[] {10, 20, 30, 40, 50}; System.out.println(arrayA); // 数组的索引 System.out.println(arrayA[0]);// 10 System.out.println(arrayA[1]);// 20 System.out.println(arrayA[2]);//30 System.out.println(arrayA[3]);//40 System.out.println(arrayA[4]);//50 // 将一个索引值赋值给一个变量 int num = arrayA[2]; System.out.println(num);// 20 } }
数组的长度属性: 数组名.length -------》 得到最大索引值为:数组名.length-1
代码示例:
package cn.itcate.day4demo; public class Demo05ArrayUse { public static void main(String[] args) { int[] arr = new int[] {1, 2, 3, 4, 5}; System.out.println(arr.length);// 5 } }
修改数组中的元素: 数组名[索引] = 数值
代码如下:
package cn.itcate.day4demo; public class Demo06ArrayUse { public static void main(String[] args) { // 定义int类型数组 int[] arr = {1, 2, 3, 4, 5}; // 为0索引元素赋值为10 System.out.println(arr[0]); arr[0] = 10; int i = arr[0]; System.out.println(i); System.out.println(arr[0]); } }
(三),数组的常见操作
3.1 数组越界异常
public static void main(String[] args) { int[] arr = {1,2,3}; System.out.println(arr[3]); }
创建数组,赋值3个元素,数组的索引就是0,1,2,没有3索引,因此我们不能访问数组中不存在的索引,程序运
行后,将会抛出 ArrayIndexOutOfBoundsException 数组越界异常。在开发中,数组的越界异常是不能出现的,一
旦出现了,就必须要修改我们编写的代码。
3.2 数组空指针异常
public static void main(String[] args) { int[] arr = {1,2,3}; arr = null; System.out.println(arr[0]); }
arr = null 这行代码,意味着变量arr将不会在保存数组的内存地址,也就不允许再操作数组了,因此运行的时候
会抛出 NullPointerException 空指针异常。在开发中,数组的越界异常是不能出现的,一旦出现了,就必须要修
改我们编写的代码。
在内存中的表现:
3.3,数组遍历
数组遍历: 就是将数组中的每个元素分别获取出来,一个一个的进行处理,就是遍历
package cn.itcate.day4demo; public class Demo07Array { public static void main(String[] args) { // 定义一个int类型的数组 int[] arr = {12,34,54,64,64}; // 遍历每一个元素 for (int i = 0; i < arr.length; i++) { System.out.println(arr[i]); } } }
3.4, 数组获取最大值元素
package cn.itcate.day4demo; public class Demo08Array { public static void main(String[] args) { // 定义一个int类型的颜值数组 int[] arr = {5, 15, 200, 10000, 100, 4000}; int max = arr[0]; // 遍历数组和max进行比较,优胜劣汰 for (int i = 0; i < arr.length; i++){ if (arr[i] > max) { max = arr[i]; } } System.out.println(max); } }
3.5, 数组的翻转
package cn.itcate.day4demo; public class Demo09Array { public static void main(String[] args) { int[] arr = {1, 2, 3, 4, 5}; /* 循环中定义变量min = 0最小索引 max = arr.lenth-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]); } } }