Java数组定义、使用、以及数组内存分析详解

本文主要是从容器概念到数组概念再到数组的三种定义以及各种情况的数组内存分析,以及一些数组常用的遍历以及反转、取最大值等操作。旨在全面性了解java数组。

1、什么是容器

在讲数组之前,很有必要来谈谈容器的概念 所谓容器就是将多个数据存储到一起,每个数据称为该容器的元素。

生活中的容器:水杯,衣柜,教室

2、什么是数组

所谓数组就是存储数据长度固定容器,保证多个数据的数据类型一致

3、数组的三种定义

下面主要讲解下数组的三种定义方式。

定义方式一

数据类型[] 数组名字 = new 数据类型 [长度] ;

举例: 定义可以存储3个整数的数组容器,代码如: int[] arr = new int[3]

定义方式二

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

举例: 定义存储1,2,3,4,5整数的数组容器。 int[] arr = new int[]{1,2,3,4,5};

定义方式三

数据类型[] 数组名 = {元素1,元素2,元素3...};

举例: 定义存储1,2,3,4,5整数的数组容器 int[] arr = {1,2,3,4,5};

数组定义格式详解: 数组存储的数据类型: 创建的数组容器可以存储什么数据类型。 [] : 表示数组。 数组名字:为定义的数组起个变量名,满足标识符规范,可以使用名字操作数组 new:关键字,创建数组使用的关键字。 数组存储的数据类型: 创建的数组容器可以存储什么数据类型。 [长度]:数组的长度,表示数组容器中可以存储多少个元素。 注意:数组有定长特性,长度一旦指定,不可更改。 和水杯道理相同,买了一个2升的水杯,总容量就是2升,不能多也不能少。

4、数组的访问

索引:从0开始,索引 (index)可以访问到数组中的元素。

格式数组名[索引]

数组长度属性: 数组长度是固定的,由于索引从0开始,所以数组的最大索引值为数组名.length-1

public static void main(String[] args) { 
int[] arr = new int[]{1,2,3,4,5}; 
//打印数组的属性,输出结果是5 
System.out.println(arr.length); 
}

5、什么是内存

在讲数组的原理内存前,必须了解的一个叫内存的概念。

内存是计算机中的重要原件,临时存储区域,作用是运行程序。我们编写的程序是存放在硬盘中的,在硬盘中的程 序是不会运行的,必须放进内存中才能运行,运行完毕后会清空内存。 Java虚拟机要运行程序,必须要对内存进行空间的分配和管理。

5.1 Java虚拟机的内存划分

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


Java虚拟机的内存划分

5.2 数组在内存中的存储

5.2.1 一个数组内存图
public static void main(String[] args) { 
    int[] arr = new int[3]; 
    System.out.println(arr);//[I@5f150435 
    }

以上方法执行,输出的结果是[I@5f150435,这个是什么呢?是数组在内存中的地址。new出来的内容,都是在堆内存中存储的,而方法中的变量arr保存的是数组的地址。

输出arr[0],就会输出arr保存的内存地址中数组中0索引上的元素,如没有具体确定值,则是类型的默认值!比如:

 String[] arr=new String[3];
   System.out.println(arr);     //  [Ljava.lang.String;@1b6d3586
   System.out.println(arr[0]);  //  null

 int[] arrInt=new int[3];
   System.out.println(arrInt);    // [I@1b6d3586
   System.out.println(arrInt[0]); // 0

数组内存图
5.2.2 两个数组内存图
 public static void main(String[] args) { 
     int[] arr = new int[3]; 
     int[] arr2 = new int[2]; 
     System.out.println(arr); 
     System.out.println(arr2); 
 }

两个数组内存图
5.2.3 两个变量指向一个数组
 public static void main(String[] args) { 
     // 定义数组,存储3个元素 
     int[] arr = new int[3]; 
     //数组索引进行赋值 
     arr[0] = 5; 
     arr[1] = 6; 
     arr[2] = 7; 
     //输出3个索引上的元素值 
     System.out.println(arr[0]);
     System.out.println(arr[1]); 
     System.out.println(arr[2]); 
     //定义数组变量arr2,将arr的地址赋值给arr2 
     int[] arr2 = arr; 
     arr2[1] = 9; 
     System.out.println(arr[1]); 
 }

两个变量指向一个数组

6、数组常见的异常

数组常见的异常主要有数组越界异常以及空指针异常,这是非常基础的,就不多做介绍了,这里主要分析下空指针异常在内存的情况

数组常见的异常

7、 数组遍历【重点】

所谓数组遍历 就是将数组中的每个元素分别获取出来,就是遍历。遍历数组非常重要!!!

 public static void main(String[] args) { 
     int[] arr = { 1, 2, 3, 4, 5 }; 
     System.out.println(arr[0]); 
     System.out.println(arr[1]); 
     System.out.println(arr[2]); 
     System.out.println(arr[3]); 
     System.out.println(arr[4]); 
     } 

以上代码是可以将数组中每个元素全部遍历出来,但是如果数组元素非常多,我把这种方式叫做傻瓜式遍历,这种傻瓜式写法肯定不行,因此我们需要改 造成循环的写法。数组的索引是 0lenght-1 ,可以作为循环的条件出现。如下

 public static void main(String[] args) { 
     int[] arr = { 1, 2, 3, 4, 5 }; 
     for (int i = 0; i < arr.length; i++) {
     System.out.println(arr[i])
        } 
      } 

8、数组获取最大值元素

实现思路: 定义变量,保存数组0索引上的元素 遍历数组,获取出数组中的每个元素 将遍历到的元素和保存数组0索引上值的变量进行比较 如果数组元素的值大于了变量的值,变量记录住新的值 数组循环遍历结束,变量保存的就是数组中的最大值

真香警告大家小心点,别被第一个和第二个婆娘给迷住了

数组获取最大值元素

代码如下:

public static void main(String[] args) { 
    int[] arr = { 5, 15, 2000, 10000, 100, 4000 }; 
    //定义变量,保存数组中0索引的元素 
    int max = arr[0]; 
    //遍历数组,取出每个元素 
    for (int i = 0; i < arr.length; i++) { 
    //遍历到的元素和变量max比较 
    //如果数组元素大于max 
    if (arr[i] > max) { 
    //max记录住大值 
    max = arr[i]; 
    } 
  }
System.out.println("数组最大值是: " + max);
} 

9、 数组反转

所谓反转就是把数组元素位置颠倒过来

实现思想:数组最远端的元素互换位置 实现反转,就需要将数组最远端元素位置交换 定义两个变量,保存数组的最小索引和最大索引 两个索引上的元素交换位置 最小索引++,最大索引--,再次交换位置 最小索引超过了最大索引,数组反转操作结束

数组反转

具体代码如下

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])
     } 
 } 

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

首先明确一点:数组作为方法的返回值,返回的是数组的内存地址

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; 
   }

方法栈、堆

11、方法的参数类型区别

方法的参数为基本类型时,传递的是数据值. 方法的参数为引用类型时,传递的是地址值.

分析下列程序代码,计算输出结果。

 public static void main(String[] args) { 
     int a = 1; int b = 2; 
     System.out.println(a); 
     System.out.println(b); 
     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; 
 } 

  1. 分析下列程序代码,计算输出结果。
public static void main(String[] args) { 
    int[] arr = {1,3,5}; 
    System.out.println(arr[0]); 
    change(arr); 
    System.out.println(arr[0]); 
}

    public static void change(int[] arr) {
    arr[0] = 200; 
   }

总结: 方法的参数为基本类型时,传递的是数据值. 方法的参数为引用类型时,传递的是地址值.

相信各位已经将上面的代码 copy 到 eclipse 或者 idea 中运行了,是不是结果很意外?而且对总结不是很理解?这位童靴,我估计你可能是忽略了这一点:数组是引用类型,数组本身元素类型没有影响的,就像数组元素全是int,数组依旧是引用类型!

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350

推荐阅读更多精彩内容