2020年Java小白升级之路之数组

数组

在这里插入图片描述 **这世上肯定有某个角落,存在着能完全领会我想表达的意思的人。** ---------村上春树
  1. 静态初始化:初始化时无需指定数组长度,指定其数组元素即可;例:

     String[]  s = new String[]{
                    "张三",//索引位 0
                    "李四",//索引位 1
                    "王五" //索引位 2
            };
    System.out.println("长度为:"+s.length);// 长度为:3
    
  2. 动态初始化:初始化时无需指定数组元素,指定其长度即可;例:

    String[] s2 = new String[5];
    System.out.println("长度为:"+s2.length);// 长度为:5
    

数组初始化分为静态初始化和动态初始化且不可同时使用静态和动态初始化方式Java 中数组初始化后该数组长度就不可再改变,但是在 JavaScript 这种动态语言中,数组是可改变长度的;

那么问题来了,数组一定要初始化吗?

例:

//    定义并初始化数组 a
int[] a = new int[]{1, 2, 3, 4};
//    定义数组变量 b
int[] b;
//    将 b 指向 a 所引用的数组
b = a;
//    遍历 b
for (int i = 0; i < b.length; i++) {
    System.out.println(b[i] + " ");//1 2 3 4
}
//    改变 b 的 第二个元素
b[1] = 100;
//    遍历 a
for (int i = 0; i < a.length; i++) {
    System.out.println(a[i] + " ");//1 2 100 4
}

上面例子中:数组 b 并没有初始化,但是为什么可以使用呢?在数组b指向数组a 后,改变 数组 b 的第二个元素,数组 a 也被改变,又是为什么呢?

其实,如果简单了解过 Java 的存储空间,可以知道在数组初始化时,堆内存空间分配了一个连续的内存空间给数组。上面例子中,数组 a 进行了初始化,分配了内存空间,而数组变量 b 在定义时虽然没有初始化,但是之后其指向了数组a,也相当于数组变量 b 指向了数组 a 分配到的内存空间,就造成了数组 a 和 b 此时都指向了同一个内存空间,也就出现了当改变数组b 的数组元素,数组 a 也受到了影响;那么,也要注意一个问题,数组 和 数组变量的区别,当在局部变量中定义时候,上面例子中的数组变量b 如果没有指向已经初始化的数组 a,那么数组变量 b是不可使用的,如果不进行指向已初始化的数组或其自身不进行初始化,那么是不可直接使用的。

3.基本数据类型数组动态初始化和引用类型数组动态初始化

①关于基本类型数组动态初始化

数据类型初始化值
浮点类型float,double0.0
字符类型char‘\u0000’
布尔类型Booleanfalse
整数类型byte,short,int,long0

②关于引用类型数组动态初始化

​ 首先,创建一个 person 类:

public class Person{
//    定义姓名
    public String name;
//    定义身高
    public double height;
//    定义年龄
    public int age;
//    个人信息
    @Override
    public String toString() {
        return "Person{" +name+"现在"+age+"岁,身高是"+height+"cm" +'}';
    }
}

​ 其次,创建引用类型数组

        //    ①定义引用类型数组
        Person[] students;
        //    ②动态初始化数组长度
        students = new Person[2];
        //    ③创建学生jack对象实例
        Person jack = new Person();
        jack.name = "jack";
        jack.age = 12;
        jack.height = 160;
        //    ④创建学生marry对象实例
        Person marry = new Person();
        marry.name = "marry";
        marry.age = 13;
        marry.height = 155;
        //    ⑤赋值为数组元素
        students[0] = jack;
        students[1] = marry;
				//    ⑥遍历
        for (int i = 0; i < students.length; i++) {
            System.out.println(students[i]);
            //    Person{jack现在12岁,身高是160.0cm}
            //    Person{marry现在13岁,身高是155.0cm}
        }

如上所示:

当①行定义数组时,并未进行初始化,也表示此时在堆内存中还未分配一段连续的内存空间给 students 数组;

第②行是对 students 数组进行了动态初始化,给予其数组长度为 2,也表示该数组长度为 2,同时 students 数组指向了在堆内存中两个 person 对象,只是此时堆内存中的两个对象值为 null;

第③④行创建了两个学生对象,此时在堆内存空间中分别创建了两个person 对象,并且此时 jack 对象和 marry 对象分别指向其对应创建的对象位置;

第⑤行两个学生对象赋值给了 students 数组,让数组在堆内存中的数组连续内存空间指向了堆内存中 jack 和 marry 对象位置,代表此时 students 数组在堆内存中指向了其两个对象;

著作日期:2020.08.30

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值