java问题,下图是某个java数组在内存中如何分配堆上的示意图,写出能生成这个图的数组声明及赋值语句。

(点击上方公众号,可快速关注)

如何检查一个数组(无序)是否包含一个特定的值?这是一个在Java中经常用到的并且非常有用的操作。同时,这个问题在Stack Overflow中也是一个非常热门的问题。在投票比较高的几个答案中给出了几种不同的方法,但是他们的时间复杂度也是各不相同的。本文将分析几种常见用法及其时间成本。

检查数组是否包含某个值的方法

Arrays.binarySearch方法只能用于有序数组!!!如果数组无序的话得到的结果就会很奇怪。

查找有序数组中是否包含某个值的用法如下:

下面的代码可以大概的得出各种方法的时间成本。基本思想就是从数组中查找某个值,数组的大小分别是5、1k、10k。这种方法得到的结果可能并不精确,但是是最简单清晰的方式。

可能Java 数组大家都很熟悉,最近我遇到了一个关于Java 数组内存分配的问题。
呵呵。突然就发现许多书上“基本数据类型存储在栈内存当中,对象则保存在堆内存”这句话完全是错误的。下面是个简单的例子代码:



关于数组,我们首先要知道的是,他是引用数据类型,数组是存储同一种数据类型多个元素的容器。数组既可以存储基本数据类型,也可以存储引用数据类型。数组有两种初始化方式,动态初始化和静态初始化.以下通过介绍两种初始化方式来介绍内存的分配.

在介绍内存分配前,首先要对内存有一定的了解:

内存,简单说就是存放正在运行的程序,我们知道,java程序运行的载体是JVM,运行环境是JRE,内存分配给JVM空间执行程序,然后JVM又把内存划分了几个板块,分别是:

栈内存:这个内存是动态的,我们可以在栈内存中看到程序的执行流程(包括方法的执行和死亡),当有方法被调用,就会有方法进入栈内存中.注意,因为栈的特性,方法执行流程是先进后出;同时,栈内存也存放局部变量,使用完毕就会被垃圾回收.

堆内存:这个里面只保存new出来的东西,其本质是对象的实体.比如,你创建了一个数组对象A------>int[] A = new int[5];真正的实体不是左边的A,真正对象的实体是new出来的东西.

关于堆中的元素(new出的对象)的特点:

A.每一个对象都有一个唯一的地址值

B.每一个对象的数据都有默认值,系统根据数据类型给予

C.堆中的数据使用完毕不会立即回收,在垃圾回收机制空闲的时候回收

方法区:保存字节码文件,也就是.class文件.还有就是常量池.

本地方法区:用来存储java代码和Windows系统交互的方法.

寄存器:跟cpu相关,这里不做过多介绍.

讲一下这张图,首先左边的代码到内存后,先到了方法区,当执行到main方法时,main方法从上到下压进栈,给main方法分配一定的空间.接着,我们new一个int类型名字是arr的数组对象.那么,堆内存中会分配一块空间,来初始化这个对象,并有唯一的一个地址值对应这个对象,在栈内存中,会在main方法里分配一块空间,存放数组名 arr,以及new出对象的堆内存地址.

在栈内存中通过arr这个数组名,得到一个地址,我们拿着这个地址到堆内存中,找这个地址对应的内存块,根据索引0,找到这块空间,把默认值替换掉.

我们可以看到每个new出来的对象地址是不同的,这也就解释了下面的代码:

 
 
 

关于静态初始化内存的分配,就是就是通过栈内存中arr对应的地址,到堆内存中,根据数组索引,把数组的默认值改掉.

下面说一个思想,关于数组反转

 
 

 

最后补充一个变量的内存分布吧:

 

这里用到了常量池,在定义变量时,栈内存里存的是常量池中常量对应的地址,对于int b = a,这样的赋值,只是把b指向跟a相同的常量地址,在改变b的常量时,改变的时b指向的常量池的地址,a不会受到改变.

我要回帖

更多关于 java数组在内存中如何分配 的文章

 

随机推荐