Java基础知识4

本文详细介绍了Java中的数组,包括数组的概念、定义格式、动态初始化、静态初始化、内存分配、数组元素访问、数组遍历以及多维数组的操作。特别强调了数组的动态初始化和静态初始化方式,以及在多维数组中如何访问和初始化元素。同时,讨论了数组操作可能遇到的索引越界和空指针异常及其解决办法。最后,通过示例展示了二维数组的使用和内存分析。
摘要由CSDN通过智能技术生成

1.数组:
        1.1:数组介绍:       

                1)数组就是用来存储一组相同类型数据的数据结构(容器)。   
                2)数组本身属于引用类型
                3)数组中的元素可以是基本数据类型也可以是引用数据类型
                4)Java中支持多维数组,多维数组中的元素都是数组
        1.2:数组的定义格式:
                1.2.1  第一种格式:
                        数组类型  [ ] 数组名
                        示例:
                                  int [ ] arr;
                                 double   [ ] arr;
                                 char [ ] arr;
                1.2.2  第二种格式:
                        数组类型 数组名 [ ]
                        示例:
                                  int arr [ ];
                                 double   arr [ ];
                                 char arr [ ];
                 解释:在定义数组时,所指定的数据类型,是用来表示数组中元素的数据类型。
        1.3:数组的动态初始化:
                1.3.1  什么是动态初始化
                        数组动态初始化就是只给定数组的长度,由系统给出默认初始化值。
                1.3.2 动态初始化格式
                         数据类型 [] 数组名 = new 数据类型 [ 数组长度 ];
                         int [ ] arr = new int [ 3 ];
                1.3.3 动态初始化格式详解
                        
                        1)等号左边:
                                int:数组的数据类型
                                [ ]:代表这是一个数组
                                arr:代表数组的名称
                       2)等号右边:
                                new:为数组开辟内存空间
                                int:数组的数据类型
                                [ ]:代表这是一个数组
                                5:代表数组的长度
        1.4 数组元素访问             
                1.4.1 什么是索引(下标)
                       1) 每一个存储到数组的元素,都会自动的拥有一个编号,从0开始。
                       2)这个自动编号称为数组索引(index),可以通过数组的索引访问到数组中的元素。
                       3) 数组中索引的最大值,就是数组的长度-1。
                        4)数组可以通过 数组名 .length 获取数组的长度。
        
                1.4.2访问数组元素格式
                        数组名  [  索引  ];
        
1.5 内存分配
        1.5.1 内存概述
                内存是计算机中的重要原件,临时存储区域,作用是运行程序。
                我们编写的程序是存放在硬盘中的,在硬盘中的程序是不会运行的。
                必须放进内存中才能运行,运行完毕后会清空内存。
                Java虚拟机要运行程序,必须要对内存进行空间的分配和管理
        1.5.2 java 中的内存分配
                目前我们只需要记住两个内存,分别是:栈内存和堆内存
        局部变量指的是在方法内部或者语句块内定义的变量。
        内存的运行:
 程序在执行时,首先把字节码文件加载到方法区,main 方法会被 jvm自动调用,此时就会进入main 方 法的栈内存,如果在 main 方法中声明并创建了一个数组对象,则数组声明的对象位于栈内存中,而当前 数组实际存放数据位于堆内存中,堆内存会产生一个地址,并且把该地址赋值给数组名,所以数组名实 际上是对堆内存地址的引用。
            注意:引用类型,对象位于栈内存,对象存储的数据都会位于堆内存。
1.6  数组的静态初始化
        1.6.1 什么是静态初始化
                        在创建数组时,直接将元素确定。
        1.6.2 静态初始化格式
              1) 完整版格式
                         数据类型  [ ]   数组名 = new 数据类型 []{ 元素 1 , 元素 2 ,...};
              2) 简化版格式
                         数据类型  [ ] 数组名 = { 元素 1 , 元素 2 ,...};
       
1.7  数组操作的两个常见问题
        1.7.1 索引越界异常
               1) 出现原因
                数组长度为3,索引范围是 0~2 ,但是我们却访问了一个 3 的索引。
                程序运行后,将会抛出ArrayIndexOutOfBoundsException 数组越界异常。在开发中,数组的越界异常是不能出现的,一旦出现了,就必须要修改我们编写的代码。
                2) 解决方案
                        将错误的索引修改为正确的索引范围即可!
        1.7.2 空指针异常
                1)出现原因

                arr = null 这行代码,意味着变量arr 将不会在保存数组的内存地址,也就不允许再操作数组了,因此运行的时候会抛出 NullPointerException 空指针异常。在开发中,空指针异常是不能出现的,一旦出现了,就必须要修改我们编写的代码。
                2)解决方案
                        给数组一个真正的堆内存空间引用即可!
1.8  数组遍历
       数组遍历:就是将数组中的每个元素分别获取出来,就是遍历。遍历也是数组操作中的基石。
         
       以上代码是可以将数组中每个元素全部遍历出来,但是如果数组元素非常多,这种写法肯定不行,因此我们需要改造成循环的写法。数组的索引是 0 到 lenght-1 ,可以作为循环的条件出现。

1.9  多维数组
        1)Java中其实并没有真正的多维数组,但是 Java 支持把一维数组可以作为其它数组的元素,这样就形成了多维数组
        2)Java中只有一维数组
        3)多维数组可以通过[ ] 来表示,一个 [ ] 表示一维数组,几个中括号就表示几维数组
1.9.1 二维数组
        动态初始化语法格式:

         静态初始化语法格式:
 

注意:多维数组在进行迭代输出时,数组的维数和使用的循环的嵌套数是一一匹配的。例如:三维数组,就要使用三重for 循环才能把数据迭代输出。
----------------------------------------------------------------------------------------
/**
多维数组
*/
public class Demo5 {
public static void main ( String [ ] args ){
// 二维数组,静态初始化
int [ ][ ] arr1 = {{ 10 , 20 , 30 },{ 40 , 50 , 60 },{ 7 , 8 , 9 }};
int [ ][ ] arr4 = new int [ ][ ]{{ 1 , 2 , 3 },{ 4 , 5 , 6 },{ 7 , 8 , 9 }};
// 二维数组的长度,其实就是一维数组的个数
System . out . println ( arr1 . length );
// 迭代数据
for ( int i = 0 ; i < arr1 . length ; i ++ ){
for ( int j = 0 ; j < arr1 [ i ]. length ; j ++ ){
System . out . println ( arr1 [ i ][ j ]);
}
}
// 动态初始化 , 二维数组的长度必须要指定
char [ ][ ] arr2 = new char [ 3 ][ ];
// 初始化 , 必须创建一维数组
arr2 [ 0 ] = new char [ 2 ];
arr2 [ 0 ][ 0 ] = 'a' ;
arr2 [ 0 ][ 1 ] = 'b' ;
arr2 [ 1 ] = new char [ 3 ];
arr2 [ 1 ][ 0 ] = 'c' ;
arr2 [ 1 ][ 1 ] = 'd' ;
arr2 [ 1 ][ 2 ] = 'e' ;
arr2 [ 2 ] = new char [ 2 ];
arr2 [ 2 ][ 0 ] = 'f' ;
arr2 [ 2 ][ 1 ] = 'g' ;
System . out . println ( arr2 [ 0 ][ 0 ]);
System . out . println ( arr2 [ 0 ][ 1 ]);
System . out . println ( arr2 [ 1 ][ 0 ]);
System . out . println ( arr2 [ 1 ][ 1 ]);
System . out . println ( arr2 [ 1 ][ 2 ]);
System . out . println ( arr2 [ 2 ][ 0 ]);
System . out . println ( arr2 [ 2 ][ 1 ]);
int [ ][ ][ ] arr3 = {{{ 1 , 2 },{ 3 , 4 }},{{ 5 , 6 },{ 7 , 8 , 9 }}};
System . out . println ( arr3 . length );
int [ ][ ][ ] arr4 = new int [ 3 ][ ][ ];
arr4 [ 0 ] = new int [ 2 ][ ];
arr4 [ 0 ][ 0 ] = new int [ 3 ];
arr4 [ 0 ][ 0 ][ 0 ] = 10 ;
arr4 [ 0 ][ 0 ][ 1 ] = 20 ;
}
}
---------------------------------------------------------------------------------------
1.9.2 内存分析

解析:
        上面图中所表示的,就相当于我们在堆中开辟了四个一维数组,其中一个一维数组用来存放二维数组的元素,然后由二维数组的元素各自指向一个一维数组,栈中定义了一个变量arr1,存放的是二维数组的内存地址。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值