Java入门篇--数组(一)

目录

什么是数组

数组的存储

一维数组

数组的创建

数组的初始化

数组的使用

数组的长度

数组的遍历

引用变量和基本变量

 数组的应用场景

存储数据

数组传参

数组作为返回值


在初学Java时,我们学习了变量是一个存储数据的内存空间,但是,一山不容二虎,一个变量只能存储一个数据。当我们需要存储多个数据时,就需要定义多个变量,那么这个过程就会麻烦起来。那么当我们需要一百个变量的时候,是不是就要Ctrl+x(复制)和Ctrl+v(粘贴)九十九次呢?其实不然,在Java中,存在着一种类型—>数组。可以存储多个数据。

下面我们就来看看什么是数组吧。

什么是数组

数组:存储一组相同类型的元素的集合,在同一个数组中的元素的类型必须是相同的,不允许一个数组出现不同类型元素。

数组的存储

当我们成功定义一个数组后,就会向内存申请一片连续的存储空间,用来存储数据。这片内存空间会被划分为n(n为我们申请的数组元素个数)个部分,然后Java就会为自动为这些数据从0开始编号,这些编号叫做下标,也称为索引

一维数组

数组的创建

数组一共有两种创建方式,具体格式如下:

第一种定义方式:

数组元素类型[ ] 数组名  = new int[ ]{  };

数组元素类型[ ] 数组名  = {  };

第二种定义方式

数组元素类型[ ] 数组名  = new int[10];

public static void func1(String args[]) {
//一维数组的创建

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


}

在第一种创建方式中,我们有两种选择。第二个代码可以认为是第一个代码的简化版,这是由于数组在编程中的使用场景比较多,所以语法简化了数组的创建。类似的还有字符串的创建。

public static void main( String args[]) {

    String str1 = "hello world";
    String str2 = new String("hello worldd");
}

这两种创建方式的区别是第一种创建方式在创建时直接给数组初始化(初始化就是第一次给数组元素赋值),而第二种方式是直接指定数组的元素个数。需要注意的是:在创建数组时,一旦指定大小就不能初始化,一旦初始化了在不能指定大小。

数组的创建也能分成两步,只是分成两步后就不能省略格式了。

public static void main(String args[]) {
        int[] array4;
        array4 = new int[10];

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

}

数组的初始化

数组的初始化也有两种方式:静态初始化,动态初始化。

静态初始化:在创建数组的同时给数组初始化。(第一种创建方式)

动态初始化:在创建数组时,直接指定数组元素个数,后面再进行初始化。(第二种创建方式)

public static void func1(String args[]) {
//一维数组的初始化

    //静态初始化
    int[] array2 = {1,2,3,4,5};
    //动态初始化
    int[] array3 = new int[10];


}

注意:

静态初始化虽然没有指定数组的长度,编译器在编译时会根据 {} 中元素个数来确定数组的长度。
数组如果没有初始化,里面存的是默认值。(值得注意的是:boolean的默认值的false)

数组的使用

一维数组通过下标使用数组元素,注意,数组下标从0开始,在使用时候不能越界。

public static void main(String args[]) {
        int[] array10 = {1,2,3,4,5,6,7,8,9,10};
        //数组下标从0-9,此处越界,编译时会报错
        System.out.println(array10[10]);
        //使用负数下标同样会报错
        System.out.println(array10[-1]);
}

代码运行报错提示

数组的长度

在Java中,可以通过直接调用方法求数组的长度。

    public static void main(String[] args) {
        int[] array10 = {1,2,3,4,5,6,7,8,9,10};
        int length = array10.length;
    }

数组的遍历

数组一共有4种遍历方式:

  1. 一个一个元素遍历
  2. for循环
  3. foreach遍历
  4. Arrays.toString(数组名)转字符串
 public static void main(String[] args) {
        int[] array10 = {1,2,3,4,5,6,7,8,9,10};
        //遍历数组

        //一个一个元素遍历-->麻烦低效
        System.out.println(array10[0]);
        System.out.println(array10[1]);
        System.out.println(array10[2]);

        //for循环遍历数组-->通过下标访问
        for (int i = 0; i < array10.length; i++) {
            System.out.println(array10[i]);
        }

        //foreach-->和下标无关。foreach相当于将每个数组元素数据
        //赋值给x,foreach不能改变数组元素的值,只能进行遍历
        for (int x : array10) {
            System.out.println(x);
        }

      
        //arrays数组转字符串遍历数组-->直接打印数组
        String str = Arrays.sort(array10);
        System.out.println(str);


    }

引用变量和基本变量

在了解变量类型之前,我们先学习Java的内存分布:

Java的变量按照变量的存储内容可以分为两类:

  1. 基本类型变量:存储基本类型值。(byte,short,int,long,float,double,char,boolean)
  2. 引用变量:存储所指向的对象的地址。引用变量并不直接存储对象本身,而是存储对象的地址。

除了八种基本数据类型外,Java中的其他类型都是引用类型了,创建一个引用类型的关键字是new,只要是new出来的,必定存在堆上。

public static void main(String[] args) {
        int[] array = {1,2,3,4,5,6};
}

array引用变量中并不直接存储数组,而是存储数组的地址,可以说,array这个引用指向数组。

注意:Java中局部变量存储在栈上(局部变量是定义在方法内部的变量)。在上面的代码中,引用变量array是定义在方法内部的,此时array是一个局部变量,但是,如果array不定义在方法内部,这时array就不是局部变量了。

 数组的应用场景

存储数据

数组传参

(关于参数这部分的内容不懂的话可以看一下之前的方法部分)

java方法https://blog.csdn.net/luoyuhhh/article/details/127676778

数组作为参数传递给方法时,传递的是引用变量存储的地址。

    public static void main12(String[] args) {
        int[] array = {1,2,3,4};
        func1(array);
        System.out.println(Arrays.toString(array));
        //打印[1,2,3,4]
        func2(array);
        System.out.println(Arrays.toString(array));
        //打印[99,2,3,4]
    }

    public static void func1(int[] ret) {
        ret = new int[]{5,6,7,8};
        ret[0] = 100;
        //只是改变了形参的指向,并不会改变实参的指向(形参是实参的一份临时拷贝)

    }

    //传递引用,通过引用修改了原来的值
    public static void func2(int[] tmp) {
        tmp[0] = 99;
        //通过形参指向实参的对象从而修改实参指向的对象
        //实参存储数据不变,改变的是实参指向的对象
    }

func1()执行顺序

  1. 数组作为参数,将引用变量的地址传递给形参ret后,实参和形参都指向同一个数组。
  2. 接着,ret又接收到新创建的数组的地址,此时,形参和实参分别指向两个不同的数组。
  3. 所以,修改形参指向的数组的值对实参指向的数组无影响,所以打印1,2,3,4

 

 fun2()执行顺序:

  1. 数组作为参数,将引用变量的地址传递给形参ret后,实参和形参都指向同一个数组。
  2. 所以,修改形参指向的数组的值会影响实参指向的数组,所以打印99,2,3,4

 

 总结,数组作为参数传参时,还是遵守按值传递,只不过此时的值是一个地址。

数组作为返回值

数组作为返回值,实际上返回的也是指向数组的地址。

    public static int[] grow() {
        int[] tmp = {99,99,99};
        return tmp;
    }

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

 

数组作为返回值,将tmp所指向的数组的地址传递给 arr,arr指向tmp指向的数组,arr原先所指向的数组没有变量指向,被系统自动回收。


数组第一部分到这里就结束啦! 小伙伴们要是有什么不理解的可以在评论区或者私信留言哦!

  • 7
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值