数组的基本知识点

数组

定义: 相同类型数据的集合。数组的内存是连续的
创建数组:
数据类型[ ]数组名称={初始化数据};
数据类型[ ]数组名称=new 数据类型[ ]{初始化数据};
数据类型[ ]数组名称=new 数据类型[数组长度];

int[] array1={1,2,3,4,5};//默认new(静态初始化)     
int[] array2=new int[]{1,2,3,4,5};//1和2是不能在[]中写出长度,若想得到数组长度,array1.length(数组名.length不是方法,是数组的属性)   
int[] array3=new int[5];
//New产生一个对象

数组名可以通过引用 来将数组传入函数中
“引用”:用来存放对象的地址

使用:

  1. 使用arr.length能够获取数组长度,.这个操作为成员访问操作。
  2. 使用[ ]按下标取数组元素,下标从0开始。
  3. 使用[ ]操作能读取数据也能修改数据。
  4. 下标访问操作不能超出有效范围[0,length-1],如果超出有效范围,会出现下标越界异常

注意:

  1. 当数组越界之后,报错:java.lang.ArrayIndexOutOfBoundException(数组越界异常)(属于运行异常)
  2. 数组名.length:数组的长度。length不是方法,是一个的属性
  3. for循环和foreach之间的区别
for循环:
    for(表达式1;表达式2;表达式3){
      循环体;
    } 
    for(int x=0;x<array1.length;x++){
        ;
    }


    foreach:  
      for(表达式1:表达式2){
      循环体;
     }//表达式1为数组类型,表达式2为数组名
      for(int x:array1){  
     循环体;
     }
 
      //所以foreach中,不能用下标进行访问数组
  1. 当定义好数组之后,没有初始化,则数组元素默认为0;若是引用类型则默认为null
  2. 按值传递:
int x=1;
int y=2;
printf("x="+x+"y="+y);
func1(x,y);
printf("x="+x+"y="+y);

public static void(int x,int y){
  int temp;
  temp=x;
  x=y;
  y=temp;
}//按值传递只改变形参的数值,不改变实参

按引用传递:

int[] array1={1,2,3,4,5};
   printf(array1[0]);
   func2(array1);
   print(array1[0]);
   
   public static void func2(int[] array){
 array[0]=99;
 }//array1中存储的是数组array1首元素1的地址,传引用进函数
 
 /*函数中array为array1开辟一块内存,存储array1中的值,也就是array存储的是array1中首元素的地址,所以可以通过函数修改主函数中数组的值。
 按引用传递本质也是按值传递*/

Java当中数组的内存分析:

数组在堆上存储,而不是像C语言一样在栈上存储

JVM上的存储:

java虚拟机栈: 存放局部变量
本地方法栈: native方法,底层由c/c++实现,特点:速度快
Native 方法: JVM 是一个基于 C++ 实现的程序. 在 Java 程序执行过程中, 本质上也需要调用 C++ 提供的一些函数进行和操作 系统底层进行一些交互. 因此在 Java 开发中也会调用到一些 C++ 实现的函数. 这里的native方法

程序计数器: 存放指令
堆: 存放通过new关键字,新建出的对象
方法区: 常量final 静态常量 类的信息
常量池: 存放字符串常量与符号引用。
在jdk1.7之前,常量池在方法区
在jdk1.7开始,常量池被挪到了堆当中

int[] array={}//数组长度为0;
Main(){  
int[] array={1,2,3,4,5};  
System.out.print(array);
}
//输出结果[I@16d3586  :地址的哈希码
//这个地址是通过真实地址哈希过的;

Main(){  
int[] array=null;  
System.out.print(array.length);
}
//结果报错:Java.lang.NullPointerException

Java.lang.NullPointerException:空指针异样数组名。