Java学习基础部分【五】数组

目录

 

一.数组定义和访问

1.概念

2.容器的概念

3.数组的定义

4.数组的访问

①索引:

②数组的长度属性:

③索引访问数组中的元素: 

二.数组原理内存图

1.Java虚拟机的内存划分

三.数组的常见操作

1.数组越界异常

2.数组空指针异常 

3.遍历数组

4.获取数组中的最大值

5.反转数组

6.For-Each循环

四.数组作为方法参数和返回值

1.数组作为方法参数:

2 数组作为方法返回值

3.方法的参数类型区别

五.多维数组

1.概念

2.多维数组的动态初始化


一.数组定义和访问

1.概念

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

2.容器的概念

是将多个数据存储到一起,每个数据称为该容器的元素。

3.数组的定义

①格式:

 数组存储的数据类型[] 数组名字 = new 数组存储的数据类型[长度];// 首选的方法
 
或
 
    数据类型[] 数组名 = new 数据类型[]{元素1,元素2,元素3...};
    数据类型[] 数组名 = {元素1,元素2,元素3...};

②数组定义格式详解: 

数组存储的数据类型: 创建的数组容器可以存储什么数据类型。

[] : 表示数组。

数组名字:为定义的数组起个变量名,满足标识符规范,可以使用名字操作数组。

new:关键字,创建数组使用的关键字。

数组存储的数据类型: 创建的数组容器可以存储什么数据类型。

[长度]:数组的长度,表示数组容器中可以存储多少个元素。

注意:数组有定长特性,长度一旦指定,不可更改。 

4.数组的访问

①索引:

每一个存储到数组的元素,都会自动的拥有一个编号,从0开始,这个自动编号称为数组索引 (index),可以通过数组的索引访问到数组中的元素

②数组的长度属性:

每个数组都具有长度,而且是固定的,Java中赋予了数组的一个属性,可以获取到数组的 长度,语句为: 数组名.length ,属性length的执行结果是数组的长度,int类型结果。由次可以推断出,数 组的最大索引值为 数组名.length-1
 

③索引访问数组中的元素: 

  • 数组名[索引]=数值,为数组中的元素赋值
  • 变量=数组名[索引],获取出数组中的元素

二.数组原理内存图

1.Java虚拟机的内存划分

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

JVM的内存划分:

区域名称  作用
寄存器 给CPU使用,和我们开发无关
本地方法栈 JVM在使用操作系统功能的时候使用,和我们开发无关
方法区 存储可以运行的class文件
堆内存 存储对象或者数组,new来创建的,都存储在堆内存
方法栈 方法运行时使用的内存,比如main方法运行,进入方法栈中执行

Java学习基础部分【五】数组

 

三.数组的常见操作

1.数组越界异常

例:

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

异常原因:创建数组,赋值3个元素,数组的索引就是0,1,2,没有3索引,因此我们不能访问数组中不存在的索引,程序运 行后,将会抛出 ArrayIndexOutOfBoundsException 数组越界异常。

2.数组空指针异常 

例:

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

arr = null 这行代码,意味着变量arr将不会在保存数组的内存地址,也就不允许再操作数组了,因此运行的时候 会抛出 NullPointerException 空指针异常。

3.遍历数组

概念:就是将数组中的每个元素分别获取出来,就是遍历。遍历也是数组操作中的基石。

格式:

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

4.获取数组中的最大值

例:

 
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比较         
    if (arr[i] > max) {   //如果数组元素大于max 
     max = arr[i];   //max记录住大值        
         }     
    }     
    System.out.println("数组最大值是: " + max); 
} 

5.反转数组

实现思想:数组最远端的元素互换位置。

实现反转,就需要将数组最远端元素位置交换

定义两个变量,保存数组的最小索引和最大索引

两个索引上的元素交换位置

最小索引++,最大索引--,再次交换位置

最小索引超过了最大索引,数组反转操作结束
 

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

6.For-Each循环

概念:JDK 1.5 引进了一种新的循环类型,被称为 For-Each 循环或者加强型循环,它能在不使用下标的情况下遍历数组。

格式:

for(数据类型 element: 数组名)
{
    System.out.println(element);
}

四.数组作为方法参数和返回值

1.数组作为方法参数:

数组作为方法参数传递,传递的参数是数组内存的地址。

例:


public static void main(String[] args) {    
     int[] arr = { 1, 3, 5, 7, 9 };     //调用方法,传递数组     
       printArray(arr); }   
  
/* 创建方法,方法接收数组类型的参数      进行数组的遍历      */ 

public static void printArray(int[] arr) {     
    for (int i = 0; i < arr.length; i++) {       
    System.out.println(arr[i]);     
    } 
}  

2 数组作为方法返回值

 

 
        public static void main(String[] args) {     
        int[] arr = { 1, 3, 5, 7, 9 };     //调用方法,传递数组     
        printArray(arr); 
        } 

/* 创建方法,方法接收数组类型的参数      进行数组的遍历      */                             
        public static void printArray(int[] arr) {     
        for (int i = 0; i < arr.length; i++) {       
        System.out.println(arr[i]);    
        } 
}  

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

public static void printArray(int[] array) {
  for (int i = 0; i < array.length; i++) {
    System.out.print(array[i] + " ");
  }
}

3.方法的参数类型区别

①方法的参数为基本类型时,传递的是数据值. 

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

②方法的参数为引用类型时,传递的是地址值

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

五.多维数组

1.概念

多维数组可以看成是数组的数组,比如二维数组就是一个特殊的一维数组,其每一个元素都是一个一维数组。

例:

int a[][] = new int[2][3];

二维数组 a 可以看成一个两行三列的数组。

2.多维数组的动态初始化

从最高维开始,分别为每一维分配空间

例:

String s[][] = new String[2][];
s[0] = new String[2];
s[1] = new String[3];
s[0][0] = new String("Good");
s[0][1] = new String("Luck");
s[1][0] = new String("to");
s[1][1] = new String("you");
s[1][2] = new String("!");