Java之数组

Java 数组

数组的基本概念

为什么使用数组

public class study {
    public static void main(String[] args) {
        int score1 = 70;
        int score2 = 80;
        int score3 = 85; 
        int score4 = 60;
        int score5 = 90;
        System.out.println(score1);
        System.out.println(score2);
        System.out.println(score3);
        System.out.println(score4);
        System.out.println(score5);
    }
}

所有成绩的**类型**都是相同的,如果采用这种方式来赋值的话十分的繁琐,那样的话是不是Java能不能存储一组相同类型的数据呢?

什么是数组

数组:可以看成是相同类型元素的一个集合。在内存中是一段连续的空间。

在这里插入图片描述

  1. 数组中存放的元素其类型相同

  2. 数组的空间是连在一起的

  3. 每个空间有自己的编号,其实位置的编号为0,即数组的下标。

    数组的使命

    数组是用来存储一组相同类型的数据的。

数组的创建以及初始化

数组的创建

T[] 数组名 = new T[N];

T:表示数组中存放元素的类型

T[]:表示数组的类型

N:表示数组的长度

数组的初始化

数组的初始化主要分为动态初始化以及静态初始化

1.动态初始化:在创建数组时,直接指定数组中元素的个数

int[] array = new int[10];

2.静态初始化:在创建数组时不直接指定数据元素个数,而直接将具体的数据内容进行指定

T[] 数组名称 = {data1, data2, data3, ..., datan};

数组主要可以分为以下三种形式

int[] array = {1,2,3,4,5,6};
int[] array2 = new int[]{1,2,3,4,5,6};
int[] array3 = new int[10];

【注意事项】

静态初始化虽然没有指定数组的长度,编译器在编译时会根据{}中元素个数来确定数组的长度。

静态初始化时, {}中数据类型必须与[]前数据类型一致。

静态初始化可以简写,省去后面的new T[]。

可以分为俩部分来简写

T[] array1;
array1 = new T[10]; 
T[] array2; 
array2 = new T[]{10, 20, 30}; 
/*  如果省略new T[]  必须一行写完 不能换行
        int[] array5;
        array5 = {1,2,3,4};
        则显示错误
*/

如果没有对数组进行初始化,数组中元素有其默认值

如果数组中存储元素类型为基类类型,默认值为基类类型对应的默认值。如图

在这里插入图片描述

boolean[] array = new boolean[10];//false

char[] array2 = new char[10];//'\u0000'

如果数组中存储元素类型为引用类型,默认值为null

数组的使用

数组的元素访问

数组在内存中是一段连续的空间,空间的编号都是从0开始的,依次递增,该编号称为数组的下标,数组可以通过下标访问其任意位置的元素

int[]array = new int[]{10, 20, 30, 40, 50};
System.out.println(array[0]); 
System.out.println(array[1]);
System.out.println(array[2]);
System.out.println(array[3]); 
System.out.println(array[4]);
System.out.println(array.length);//数组名.length就可以自动求出长度

下标从0开始,介于[0, N)之间不包含N,N为元素个数,不能越界,否则会报出下标越界异常

数组的遍历
int[]array = new int[]{10, 20, 30, 40, 50}; 
for(int i = 0; i < 5; i++){ 
System.out.println(array[i]); 
}
使用array.length
int[]array = new int[]{10, 20, 30, 40, 50}; 
for(int i = 0; i < array.length; i++){
System.out.println(array[i]); 
}
使用 for-each 遍历数组
int[] array = {1, 2, 3}; 
for (int x : array) { 
System.out.println(x);
}

在这里插入图片描述

用方法以字符串的形式输出

import java.util.Arrays;
public class study {
    public static void main(String[] args) {
  int []array={50,30,47,99,63,54,44};
  Arrays.sort(array);//排序
  String ret = Arrays.toString(array);//
        System.out.println(ret);
    }
}

在这里插入图片描述

数组是引用类型

初始JVM 的内存分布

内存是一段连续的存储空间,主要用来存储程序运行时数据的。比如

  1. 程序运行时代码需要加载到内存

  2. 程序运行产生的中间数据要存放在内存

  3. 程序中的常量也要保存

  4. 有些数据可能需要长时间存储,而有些数据当方法运行结束后就要被销毁。

  5. 如果对内存中存储的数据不加区分的随意存储,那对内存管理起来将会非常麻烦

在这里插入图片描述

在这里插入图片描述

基本类型变量与引用类型变量的区别

基本数据类型创建的变量,称为基本变量,该变量空间中直接存放的是其所对应的值

int a = 10;

int b = 20;

而引用数据类型创建的变量,一般称为对象的引用,其空间中存储的是对象所在空间的地址

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

a、b是内置类型的变量,因此其空间中保存的就是给该变量初始化的值。array是数组类型的引用变量,其内部保存的内容可以简单理解成是数组在堆空间中的首地址。

在这里插入图片描述

array这个引用指向了一个对象

引用变量并不直接存储对象本身,可以简单理解成存储的是对象在堆中空间的起始地址。通过该地址,引用变量便可以去操作对象

在这里插入图片描述

引用举例
public class study{
    public static void main(String[] args) {
        int[] array1 = {1, 2, 3, 4};
        array1[0] = 99;
        int[] array2 = array1;
        array2[0] = 100;
        System.out.println(Arrays.toString(array1));
        System.out.println(Arrays.toString(array2));
    }
        }

array1[0] = 99;

array1这个引用所指向的对象的0下标改为100

int[] array2 = array1;

后array2这个引用指向了array1这个引用指向的对象 也可以理解为array2获得了array1所指向的对象的地址,array1把地址赋值给了array2,使array2拥有了指向array1所指向的对象的能力

在这里插入图片描述

int[] array2 = array1;

代表array2这个引用指向的是array1这个引用所指向的对象 即俩个引用指向一个对象

array2[0] = 100;(表示把这个对象的0下标改为100)

所以输出结果俩者都相同。

在这里插入图片描述

再看一道题

public class study{
    public static void main(String[] args) {
        int[] array1 = {1,2,3,4};
        int[] array2 = {11,22,33,44};
        array1 = array2;
        array1[0] = 1888;
        System.out.println(Arrays.toString(array1));
        System.out.println(Arrays.toString(array2));
    }
}

int[] array1 = {1,2,3,4}; int[] array2 = {11,22,33,44};

时候是

array1 = array2;

代表array2这个引用把其所指向的对象的地址赋值给了array1则array1这个引用所指向的对象也将发生变化

在这里插入图片描述

array1和array2这俩个引用指向的对象变得一样了

认识null

null 在 Java 中表示 “空引用” , 也就是一个不指向对象的引用

int[] arr = null; System.out.println(arr[0]); // 执行结果 Exception in thread "main" java.lang.NullPointerException at Test.main(Test.java:6)

null 的作用类似于 C 语言中的 NULL (空指针), 都是表示一个无效的内存位置. 因此不能对这个内存进行任何读写操

作. 一旦尝试读写, 就会抛出 NullPointerException.

注意: Java 中并没有约定 null 和 0 号地址的内存有任何关联.(与c语言不一样 有区别)

数组的应用

保存数据
public static void main(String[] args) { 
    int[] array = {1, 2, 3}; 
    for(int i = 0; i < array.length; i++){                 System.out.println(array[i]); 
       }
}

作为函数的参数

public class study{
    public static void func1(int[] array) {
        array=new int[]{13,14,15,16};
    }
    public static void func2(int[] array) {
        array[0] = 999;
    }
    public static void main(String[] args) {
        int[] array1 = {1,2,3,4};
             func1(array1);
            //func2(array1);//实参
            System.out.println(Arrays.toString(array1));

        }

    }

求func1没被注解和func2没被注解时候的值

func1时

int[] array1 = {1,2,3,4}; func1(array1);

public static void func1(int[] array)

array1指向0x98的对象 我们把array1的值给到了形参array,即array和array1所指向的是同一个对象。

但当

array=new int[]{13,14,15,16};

可是创建了一个新的对象0x111

在这里插入图片描述

那个对象把地址给了array即

因此array影响不了array1

结果为

在func2时

int[] array1 = {1,2,3,4}; func2(array1);//实参 ;

public static void func2(int[] array)

按照上面的思路array和array1指向的是相同的对象

array[0] = 999;

而func2中是直接修改对象。

在这里插入图片描述

在这里插入图片描述

作为函数的返回值

public class study{
    public static int[] tmp(int[] arr){
        for(int i=0;i<arr.length;i++){
            arr[i]=arr[i]*2;
        }
         return arr;
    }
    public static void main(String[] args) {
        int arr[]={1,2,3,4,5,6};
        String ret =Arrays.toString(tmp(arr));
        System.out.println(ret);
    }
}

二维数组

二维数组本质上也就是一维数组, 只不过每个元素又是一个一维数组

二维数组创建

int[][] array={{1,2,3},{4,5,6}};

数组创建和一维数组时差不多

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

在我们对二维数组的第一印象应该是这样在这里插入图片描述

然而二维数组是特殊的一维数组。与C语言中的二维数组有一定的差别

Java中的二维数组应该是这样

在这里插入图片描述

即arry[0]拿着一个数组,arry[1]拿着一个数组

public class study{
    public static void main(String[] args) {
        int[][] array={{1,2,3},{4,5,6}};
        System.out.println(Arrays.toString(array[0]));
        System.out.println(Arrays.toString(array[1]));

    }
}

在这里插入图片描述

注意

public class test9 {
    public static void main(String[] args) {
        int[][] array=new int[][];
        int[][] array1=new int[2][3];
        int[][] array2=new int[][3];//报错
    }
}

注意Java二维数组和C语言中的二维数组不一样,有列时必得有行不然会报错

我顺便写一下不规则二维数组

不规则二维数组
public class test9 {
    public static void main(String[] args) {
        int[][] array = new int[2][];
        array[0]=new int[]{1,2,3,4,5,6,7,8};
        array[1]=new int[]{999,555,888,777,444,444,777};
        for (int i = 0; i < array.length; i++) {
            for (int j = 0; j < array[i].length; j++) {
                System.out.print(array[i][j] + "");
            }
            System.out.println();
        }
    }
}

在这里插入图片描述

二维数组遍历

public class test9 {
    public static void main(String[] args) {
        int[][] array = {{1, 2, 3}, {4, 5, 6}};
        for (int i = 0; i < array.length; i++) {//array。length表示二维数组有几个一维数组
            for (int j = 0; j < array[i].length; j++) {//每个一位数组的长度
                System.out.print(array[i][j] + "");
            }
            System.out.println();
        }
    }
}

在这里插入图片描述

public class test9 {
    public static void main(String[] args) {
        int[][] array = {{1, 2, 3}, {4, 5, 6}};
        System.out.println(Arrays.deepToString(array));
    }
}

在这里插入图片描述

public class test9 {
    public static void main(String[] args) {
        int[][] array = {{1, 2, 3}, {4, 5, 6}};
        for (int[] ret : array) {
            for (int x : ret) {
                System.out.print(x + "");
            }
            System.out.println();
        }
    }
}

v

总结

最近突然心血来潮想好好学习了,我想好好学习了。如果有不足之处请多多指教,另外图片不能直接上传每一个图片都是一个一个拷贝过来的🥲可能会有一点瑕疵,如果发现问题我会即时修改,后期会偶尔更新的。虽然我是一个小菜鸟,但我会越来越努力的。😊😊

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值