1. java在声明一个数组的过程中,是如何分配内存的,初始化方式有几种?
这道题可以说是非常基础了,主要考了几点
a. 数组初始化方式
b. 数组初始化过程,以及过程中的内存分配问题
java的数组是静态的,即初始化之后长度不可变。所谓初始化,就是为数组对象元素分配内存空间,并为每个元素指定初始值
数组初始化方式有两个:
静态初始化:初始化时由程序员显示指定每个数组元素的初始值,由系统决定数组的长度(int[] a = {1,2,3};)
动态初始化:初始化时程序员只指定数组的长度,由系统为每个数组元素分配初始化(int[] a = new int[3];)
那么问题来了,动态初始化过程中,系统怎么为每个数组元素分配初始值呢?
基本类型初始化:整型(byte,short,int和long)初始化为0
浮点型(float,double)初始化为0.0
字符型(char)初始化为'\u0000'(Unicode字符,相当于一个空格)
布尔型(boolean)初始化为false
引用类型初始化:引用类型(类,接口,和数组)初始化为null
PS:java数组本身是没有办法被程序引用的,它需要赋值给一个变量,该变量称为数组变量,所以在初始化时,数组变量不一定要初始化,需要初始化的是数组本身,栈内存中的数组变量相当于一个指针,只需要指向堆内存中数组首地址即可;
了解了上面知识之后,上面面试题可以参照下面回答:
数组在初始化过程中,有两种初始化方式:静态和动态初始化,两者的区别在于由系统指定长度还是由程序员指定长度,然后系统根据指定的长度在堆内存中寻找一块大小符合的连续内存块分配给数组,并根据数组类型初始化每个数组元素的值,初始化完之后,数组长度不可改变
2. 什么是引用变量和引用对象,他们之间有什么联系
首先我们先理清楚变量和对象之间的关系,所有的基础类型和引用类型变量都是存储在自己的方法栈区中的,而对象(包括数组、普通java对象)总是存储在堆内存中的,而所谓的引用是指将方法栈区中的变量指向堆内存中的对象,在程序中通过引用变量访问属性时,就会映射到变量指向的对象,使该对象变成引用对象
3. 你知道基本类型数组和引用类型数组之间,在初始化时内存分配机制有什么区别?
对于基础类型数组而言,它的元素就是一个固定的值,而对于引用类型数组而言,他的数组元素是一个引用类型变量,可以指向任何有效的内存,即你的引用类型是A,那么A对象数组的元素也需要指向一个A对象。
所以在两种类型初始化时,还需为引用类型数组元素额外初始化另外一块内存,再把元素变量指向该内存地址