day04_数组

张春  金牌会员 | 2022-8-29 05:11:28 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 905|帖子 905|积分 2715

数组

学习目标:
  1. 1. jvm内存图入门
  2. 2. 一维数组的使用
  3. 3. 二维数组的使用
  4. 4. 数组的内存结构
  5. 5. 数组中常见算法
  6. 6. 数组中常见的异常
复制代码
一、JVM内存图入门

java程序运行在jvm上,jvm内存主要分为五块,结构如下:
每块内存负责的职责如下:

  • Java虚拟机栈(Java Virtual Machine Stacks):描述的是Java方法执行的内存模型:每个方法在执行的同时都会创建一个栈帧(Stack Frame),栈帧中存储着局部变量表、操作数栈、动态链接、方法出口等信息。每一个方法从调用直至执行完成的过程,会对应一个栈帧在虚拟机栈中入栈到出栈的过程。与程序计数器一样,Java虚拟机栈也是线程私有的。
局部变量和引用地址都是在栈内存中。

  • 堆:此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例都在这里分配内存。这一点在Java虚拟机规范中的描述是:所有的对象实例以及数组都要在堆上分配。
  • 方法区:用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。方法区存放的数据只有一份
  • 本地方法栈(Native Method Stack):与Java虚拟机栈作用很相似,它们的区别在于虚拟机栈为虚拟机执行Java方法(即字节码)服务,而本地方法栈则为虚拟机使用到的Native方法服务。例如调用本地c/c++的方法。
  • 程序计数器:程序计数器是记录当前线程所执行的指令行数。
二、数组的概述

2.1 为什么需要数组

为什么要有数组?在开发中,我们常常需要存取很多相同类型的数据,用变量的方式需要定义很多变量,不方便管理。所以引入数组的概念,一次存取多个相同类型的数据。数组有两个一定,一个类型一定,一个是大小一定。
2.2 数组的基本概念

数组中存在着一些重要的概念,如下所示:

  • 数组名:数组的名称,数组内存的首地址
  • 下标名(索引):数组元素的序号索引,从0开始
  • 元素:数组中存放的内容
  • 长度 :数组的长度
三、一维数组的使用

3.1 数组的定义

一维数组的定义语法如下:
示例:
  1. /**
  2. * 数组定义
  3. */
  4. public class ArrayDemo1 {
  5. public static void main(String[] args) {
  6. //定义数组
  7. int[] arr1;
  8. String [] arr2;
  9. }
  10. }
复制代码
3.2 数组的初始化

数组动态初始化语法:
示例:
  1. /**
  2. * 数组定义,以及动态初始化
  3. */
  4. public class ArrayDemo1 {
  5. public static void main(String[] args) {
  6. //定义数组
  7. int[] arr1;
  8. //数组动态初始化
  9. arr1 = new int[4];
  10. arr1[0] = 10;
  11. arr1[1] = 20;
  12. arr1[2] = 30;
  13. arr1[3] = 40;
  14. //取值
  15. System.out.println(arr1[0]);
  16. System.out.println(arr1[1]);
  17. System.out.println(arr1[2]);
  18. System.out.println(arr1[3]);
  19. }
  20. }
复制代码
数组静态初始化语法:
示例:
  1. /*
  2. 数组的定义与静态初始化
  3. */
  4. public class ArrayDemo2 {
  5. public static void main(String[] args) {
  6. //数组的声明
  7. // String[] arr = new String[]{"乔峰","段誉","杨过"};
  8. //简写
  9. String[] arr = {"乔峰","段誉","杨过"};
  10. //取值
  11. System.out.println(arr[0]);
  12. System.out.println(arr[1]);
  13. System.out.println(arr[2]);
  14. }
  15. }
复制代码
3.3 数组元素的引用

引用数组元素内容需要注意以下几点:

  • 定义并用运算符new为之分配空间后,才可以引用数组中的每个元素;
  • 数组元素的引用方式:数组名[数组元素下标]
  • 数组元素下标可以是整型常量或整型表达式。如a[3] , b , c[6*i];
  • 数组元素下标从0开始;长度为n的数组合法下标取值范围: 0 —>n-1;如int a[]=new int[3]; 可引用的数组元素为a[0]、a[1]、a[2]
  • 每个数组都有一个属性length指明它的长度,例如:a.length 指明数组a的长 度(元素个数) 。数组一旦初始化,其长度是不可变的
示例1:数组元素的引用
  1. /**
  2. * 数组元素的引用
  3. */
  4. public class ArrayDemo3 {
  5. public static void main(String[] args) {
  6. //数组的定义
  7. int[] arr = {1,3,5,7,9};
  8. //查看数组的长度
  9. System.out.println(arr.length);
  10. // 查看数组内容
  11. System.out.println(arr[0]);
  12. System.out.println(arr[1]);
  13. System.out.println(arr[2]);
  14. System.out.println(arr[3]);
  15. System.out.println(arr[4]);
  16. // 数组下标超过最大下标会越界,报异常ArrayIndexOutOfBoundsException
  17. System.out.println(arr[5]);
  18. }
  19. }
复制代码
示例2:数组的循环赋值与取值
  1. /**
  2. * 数组的循环赋值与取值
  3. */
  4. public class ArrayDemo4 {
  5. public static void main(String[] args) {
  6. //定义数组
  7. int[] arr = new int[5];
  8. //循环赋值
  9. for (int i = 0; i < arr.length; i++) {
  10. arr[i] = i*5;
  11. }
  12. //循环取值
  13. for (int i = 0; i < arr.length ; i++) {
  14. System.out.println(arr[i]);
  15. }
  16. }
  17. }
复制代码
3.4 数组的注意事项

数组在使用过程中需要注意以下几点:

  • 数组本身是引用数据类型,而数组中的元素可以是任何数据类型,包括基本数据类型和引用数据类型。
  • 创建数组对象会在内存中开辟一整块连续的空间,而数组名中引用的是这块连续空间的首地址。
  • 数组的长度一旦确定,就不能修改。
  • 数组的分类:
  • 按照维度:一维数组、二维数组、三维数组、…
  • 按照元素的数据类型分:基本数据类型元素的数组、引用数据类型元素的数组(即对象数组)
3.5 forEach的应用

forEach可以遍历数组或集合容器中的数据,语法如下:
示例:
  1. /**
  2. * forEach遍历
  3. */
  4. public class ArrayDemo5 {
  5. public static void main(String[] args) {
  6. //数组定义
  7. int[] arr = {1,3,5,7,9};
  8. //数组遍历
  9. for(int num : arr){
  10. System.out.println(num);
  11. }
  12. }
  13. }
复制代码
3.6 数组元素默认值

当数组元素没有赋值时,是存在默认值的,默认值如下:
3.7 一维数组内存图

3.8 小结


  • 数组的基本使用
  • 数据类型可以是基本类型或引用类型
  • 数组类型固定长度不变
  • 数组默认值
  • 数组的内存图
四、一维数组练习题

4.1 数组赋值练习

将班级所有同学名字录入到一个一维数组中 。
参考答案:
[code]/*** 将班级所有同学名字录入到一个一维数组中*/public class ArrayTest1 {public static void main(String[] args) {//1.创建大小为5的String类型数组String[] names = new String[5];//2.创建扫描仪对象Scanner input = new Scanner(System.in);for(int i=0;i
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

张春

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表