java在存储数组时栈内存和堆内存的联系

Python027

java在存储数组时栈内存和堆内存的联系,第1张

先这样分开写,方便解释

int[] a=null//声明数组,也是引用

a=new int[5]//分配内存地址。

好了,数组的引用,也就是a,当你在声明的时候,他会在栈中开辟一个地址空间。也就是第一步

第二步的作用,是在堆中开辟一系统连续的地址,具体的需要根据你的类型还有数组长度。

总结下,也是,数组的引用保存在栈中,同时实例的时候在堆中开辟连续空间,栈中的空间指向堆的首地址。

再稍微说明一下,为什么我们平常说不new不可以对数组进行操作呢??因为此时堆中没有分配内存地址。所以你的数据没有地方存放和操作。

public class Stack {

private Object[] stack

//这个不需要

//private int top = 0//初始化栈顶

//这个也不需要

//写一个栈出来,最好是可以动态的,可以自己改变大小的,即数组的长度

//private int size = 0// 初始化大小

//元素个数

private int size

//默认长度为10

public Stack(){

this(10)

}

//也可以自己设置长度,即容量

public Stack(int len){

stack = new Object[len]

}

//返回元素个数

public int size(){

return size

}

//返回数组长度,即容量

public int capacity(){

return stack.length

}

//实现动态的数组

public void ensureCapacity(){

if(size() == capacity()){

Object[] newStack = new Object[size() * 3 / 2 + 1]

System.arraycopy(stack, 0, newStack, 0, size())

stack = newStack

}

}

//入栈

public void push(Object o){

size++

ensureCapacity()

stack[size - 1] = o

}

/*

public void push(Object object) {

if (isFull()) {

System.out.println("栈满! 入栈失败")

}

stack[top++] = object

}

*/

//判空

public boolean isEmpty(){

return size == 0

}

//出栈

public Object pop(){

//首先要判空

if(isEmpty()){

throw new ArrayIndexOutOfBoundsException("不能为空")

}

Object o = stack[--size]

stack[size] = null

return o

}

/*

// 出栈

public Object pop() {

Object object = stack[--top]

stack[top] = null

return object

}

*/

/*

// 计算栈当前大小

public int size() {

return top

}

// 判断是否是空栈

public boolean isEmpey() {

return top == 0

}

// 判断是否栈满

public boolean isFull() {

return top >= size

}

public Stack(int size) {

this.size = size

}

*/

public static void main(String[] args) {

Stack stack = new Stack(3)

String[] data = new String[] { "a", "b", "c" }

for (int i = 0i <data.lengthi++) {

stack.push(data[i])

System.out.println(data[i] + "")

}

System.out.println("***********")

while (!stack.isEmpty()) {

System.out.println(stack.pop() + "")

}

//}

}

}

你自己对比一下,我是在你的里面修改的

Java栈的实现

public class MyStack { //定义一个堆栈

int[] array//用int数组来保存数据,根据需要可以换类型

int s_size //定义堆栈的宽度

public MyStack(int i){//定义一个带参数构造器

array=new int[i]//动态定义数组的长度

s_size=0//堆栈的默认宽度为0

}

public MyStack(){ //默认构造器

this(50)//默认构造器可容纳50个元素

}

public void push(int i){ //压栈

array[this.s_size]=i

this.s_size++

}

public int pop(){ //从堆栈中取元素,从栈顶开始取

if(this.s_size!=0){

int t=array[s_size-1] //用中间变量保存栈顶的元素

array[s_size-1]=0 //取完元素该位置设为0

s_size-- //栈的大小减1

return t//返回栈顶元素

}else{

System.out.println("This stack is empty") //当栈为空时显示提示信息,返回0

return 0

}

}

public boolean isEmpty(){ //判断栈是否为空

return this.s_size==0

}

public int top(){ //从栈顶取值,功能和 pop() 方法一样

if(!this.isEmpty()){

int t=array[this.s_size-1]

array[this.s_size-1]=0

this.s_size--

return t

}else{

System.out.println("This stack is empty!")

return 0

}

}

public void printAll(){ //打印出堆栈中的所有元素的值,不是取出,元素依然在堆栈里

if(!this.isEmpty()){

for(int i=this.s_size - 1i>=0i--){

System.out.println(array[i])

}

}

}

//下面是测试代码

public static void main(String[] args){

MyStack stack=new MyStack()

stack.push(4)

stack.push(5)

stack.push(6)

stack.push(7)

//System.out.println(stack.isEmpty())

stack.printAll()

System.out.println("===========")

System.out.println(stack.top())

System.out.println(stack.top())

System.out.println(stack.top())

System.out.println(stack.top())

System.out.println(stack.top())

}

}