学了数组天下无敌————快乐人的JAVA初学日记[4]

在这里插入图片描述

数组的基本用法

1.1什么是数组

我们平时定义五个数可能需要int a=3,int b=4,int c=5,int d=6,int e=7;但是有了数组的出现我们简简单单的就可以定义一个含有五个数的数组,
例如:

int [] arr={3,4,5,6,7};

且数组中包含的变量必须是 相同类型。

1.2创建数组

基本语法

// 动态初始化数据类型[] 数组名称 = new 数据类型 [] { 初始化数据 };
// 静态初始化数据类型[] 数组名称 = { 初始化数据 };

代码示例:

int[] arr = new int[]{
    
    1, 2, 3};
int[] arr = {
    
    1, 2, 3};

这里面我们需要注意一点数组元素个数和初始化个数必须保持一致。

1.3数组的使用

如下面代码块;

 int[] arr = {
    
    1, 2, 3};
 // 获取数组长度
 System.out.println("length: " + arr.length); 
 // 执行结果:3 
 //访问数组中的元素
 System.out.println(arr[1]);
  // 执行结果:
 2System.out.println(arr[0]); 
  // 执行结果:
 arr[2] = 100;
 System.out.println(arr[2]); // 执行结果: 100
 

大家是不是以为数组要输出的时候直接System.out.println(arr);然后就好了,答案是错误的如果这样只会输出一个随机地址;
我们如果要输出(遍历)一个数组我们需要将每一个数组中的元素打印出来。
例如;

  int[] arr = {
    
    1, 2, 3};
  for (int i = 0; i < arr.length; i++) {
    
     
  System.out.println(arr[i]);
  } 
  // 执行结果
  1
  2
  3

还有一种快速的方法;
我们可以使用for each的方法
fot(int x:arr);
x代表的是数组中的有几个元素注意如果有三个就是三个,
x=3和数组下标不要搞混了

int[] arr = {
    
    1, 2, 3};
for (int x : arr) {
    
    
 System.out.println(x);
 } // 执行结果
 1
 2
 3

2. 数组作为方法的参数

2.1基本用法

代码示例:

打印数组的内容;

public static void main(String[] args) {
    
     
    int[] arr = {
    
    1, 2, 3};
    printArray(arr);
 } 
   public static void printArray(int[] a) {
    
    
    for (int x : a) {
    
    
   System.out.println(x);
   }
    }
     // 执行结果
     1
     2
     3

2.2 理解引用类型(重点/难点)

public static void main(String[] args) {
    
    
 int[] arr = {
    
    1, 2, 3};
  func(arr);
  System.out.println("arr[0] = " + arr[0]);
  } 
  public static void func(int[] a) {
    
    
   a[0] = 10;
    System.out.println("a[0] = " + a[0]);
    } 
    // 执行结果a[0] = 10
    arr[0] = 10

我们发现, 在函数内部修改数组内容, 函数外部也发生改变.此时数组名 arr 是一个 “引用” . 当传参的时候, 是按照引用传参.
这里就是运用了指针地址的概念,主要改的是地址上的数据。
接下来执行 int[] arr = new int[]{1, 2, 3} 相当于又创建了一个 int[] 变量,这个变量是一个引用类型面只保存了一个整数(数组的起始内存地址)

2.3 认识 null

null 在 Java 中表示 “空引用” , 也就是一个无效的引用.

注意:null和0没有任何的关联!

2.4 初识 JVM 内存区域划分(重点)

  1. 程序计数器 (PC Register): 只是一个很小的空间, 保存下一条执行的指令的地址.
  2. 虚拟机栈(JVM Stack):重点是存储局部变量表(当然也有其他信息). 我们刚才创建的 int[] arr 这样的存储地址的引用就是在这里保存.
  3. 本地方法栈(Native Method Stack): 本地方法栈与虚拟机栈的作用类似. 只不过保存的内容是Native方法的局部变量.
  4. 在有些版本的 JVM 实现中(例如HotSpot), 本地方法栈和虚拟机栈是一起的. 堆(Heap): JVM所管理的最大内存区域. 使用new 创建的对象都是在堆上保存 (例如前面的 new int[]{1, 2, 3})
  5. 方法区(Method Area):用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据.方法编译出的的字节码就是保存在这个区域.
  6. 运行时常量池(Runtime Constant Pool): 是方法区的一部分,存放字面量(字符串常量)与符号引用. (注意 从 JDK 1.7 开始, 运行时常量池在堆上
  7. 局部变量和引用保存在栈上, new 出的对象保存在堆上. 堆的空间非常大, 栈的空间比较小. 堆是整个 JVM 共享一个, 而栈每个线程具有一份(一个 Java 程序中可能存在多个栈).

3. 二维数组

基本语法;

数据类型[][] 数组名称 = new 数据类型 [行数][列数] { 初始化数据 };

int[][] arr = {
    
     {
    
    1, 2, 3, 4}, {
    
    5, 6, 7, 8}, {
    
    9, 10, 11, 12}
};
 for (int row = 0; row < arr.length; row++) {
    
    
  for (int col = 0; col < arr[row].length; col++) {
    
    
   System.out.printf("%d\t", arr[row][col]);
    } 
    System.out.println("");
    } 
    // 执行结果
    1 2 3 4
    5 6 7 8
    9 10 11 12

二维数组需要注意的一点是二维数组是将一维数组的一个元素扩大让他可以装下x位元素。第二个for中的arr[row];尤其重要。

int[][] test = {
    
    {
    
    0, 1, 2}, {
    
    2, 1}, {
    
    1}};
        for (int i=0;i<3;i++)
            System.out.println ( Arrays.toString (test[i]));
     结果      
 [0, 1, 2]
[2, 1]
[1]

Guess you like

Origin blog.csdn.net/m0_57315623/article/details/120985895