数组是java 中一个非常重要的概念,也是一个面试过程中经常被问到的问题。面试中关于数组的问题无外乎有两大类,一类是与数组本身概念相关的;另外一类就是基于数组的一些算法,如冒泡排序算法、插入排序算法等等。
数组相关的概念
在声明一个数组的过程中,jvm是如何分配内存的,初始化方式有几种?
这道题可以说是非常基础了,主要考了以下几点内容:
a. 数组初始化方式
b. 数组初始化过程,以及过程中的内存分配问题
java的数组是静态的,即初始化之后长度不可变。所谓初始化,就是为数组对象元素分配内存空间,并为每个元素指定初始值。
数组初始化方式有两个:静态初始化和动态初始化。
那么问题来了,动态初始化过程中,系统怎么为每个数组元素分配初始值呢?系统会根据数组的数据类型来给数组中的元素分配初始值,具体如下:
基本类型初始化:整型(byte,short,int和long)初始化为0
浮点型(float,double)初始化为0.0
字符型(char)初始化为'\u0000'(Unicode字符,相当于一个空格)
布尔型(boolean)初始化为false
引用类型初始化:引用类型(类,接口,和数组)初始化为null
PS:java数组本身是没有办法被程序引用的,它需要赋值给一个变量,该变量称为数组变量,所以在初始化时,数组变量不一定要初始化,需要初始化的是数组本身,栈内存中的数组变量相当于一个指针,只需要指向堆内存中数组首地址即可;
了解了上面知识之后,上面面试题可以参照下面回答:
数组在初始化过程中,有两种初始化方式:静态和动态初始化,两者的区别在于由系统指定长度还是由程序员指定长度,然后系统根据指定的长度在堆内存中寻找一块大小符合的连续内存块分配给数组,并根据数组类型初始化每个数组元素的值,初始化完之后,数组长度不可改变。
初始化的方式主要有以下两种:
静态初始化:初始化时由程序员显示指定每个数组元素的初始值,由系统决定数组的长度(int[] a = ;)
动态初始化:初始化时程序员只指定数组的长度,由系统为每个数组元素分配初始化(int[] a = new int[3];)
什么是引用变量和引用对象,它们之间有什么联系?
首先,我们先理清楚变量和对象之间的关系,所有的基础类型和引用类型变量都是存储在自己的方法栈区中的,而对象(包括数组、普通java对象)总是存储在堆内存中的,而所谓的引用是指将方法栈区中的变量指向堆内存中的对象,在程序中通过引用变量访问属性时,就会映射到变量指向的对象,使该对象变成引用对象。
你知道基本类型数组和引用类型数组之间,在初始化时内存分配机制有什么区别?
对于基础类型数组而言,它的元素就是一个固定的值,而对于引用类型数组而言,他的数组元素是一个引用类型变量,可以指向任何有效的内存,即你的引用类型是A,那么A对象数组的元素也需要指向一个A对象。
所以在两种类型初始化时,还需为引用类型数组元素额外初始化另外一块内存,再把元素变量指向该内存地址
数组相关的
冒泡排序
2.在一个已经排序好的数组中插入一个数,要求按原来的规律将它插入数组中。
执行结果如下
3.二分查找又称折半查找,它是一种效率较高的查找方法。二分查找发要求:1.必须采用顺序存储结构 2.必须按关键字大小有序排列。
领取专属 10元无门槛券
私享最新 技术干货