我们都知道,堆栈是java的底层原理,是面试里面试官最喜欢问的问题之一,本篇文章我们就来了解些它们的面试题。
一、什么是堆栈?
类似于队列,堆栈是个简单的数据存储结构。堆栈中数据进出的顺序很重要,举个例子,餐厅的盘子堆,盘子洗完要堆到上面,而不是插到下面的某个位置(相信不会有人那么做)。当厨师要用到盘子时从最上面的开始拿。即最先放在堆里的盘子会被最后一个用到。
定义:堆栈就是只能在一端插入和删除数据的链表,这个端就叫做栈顶(top),最后一个添加的数据第一个被删除。因此,这也叫后进先出(LAST IN FIRST OUT)链表或是先进后出链表(FIRST IN LAST OUT)。
具体的大家可以通过下面的文章来进行了解:java堆栈图解
二、堆栈有什么作用?
用new创建的对象在堆区,函数中的临时变量在栈区,Java中的字符串在字符串常量区。
栈:存放进本数据类型的数据和对象的引用,但对象本身不存在栈中,而是存放在堆中。
堆:存放new产生的数据。 静态域:存放在对象中用static定义的静态成员。
常量池:存放常量
非RAM存储:硬盘等永久存储空间。
三、堆栈的区别是?
堆区(Heap):
堆区中存放的是对象以及每个对象对应的class的信息,其中存放class
的信息主要是获取类的操作指令,jvm只有一个堆区,被所有线程共享,堆中不存放基本
类型和对象引用,只存放对象本身。
栈区(Stack):
每个线程包含一个栈区,占中只保存基础数据类型的对象和自定义对象引用(不
是对象),对象都存放在堆区中;每个栈区中的数据(原始类型和对象引用)都是私有的,
其他栈不能访问;栈分为三个部分:基本类型变量区、执行环境上下文、操作指令区(存放
操作指令)。栈区由编译器自动分配释放,存放函数的参数值,局部变量的值等
具体的大家可以通过下面的文章来进行了解: java堆栈区别在哪?
题目:下面请通过代码实现简略实现下堆栈
public class Stack
{
int[] data;
int maxSize;
int top;
public Stack(int maxSize)
{
this.maxSize = maxSize;
data = new int[maxSize];
top = -1;
}
/**
* 依次加入数据
* @param data 要加入的数据
* @return 添加是否成功
*/
public boolean push(int data)
{
if (top + 1 == maxSize)
{
System.out.println("栈已满!");
return false;
}
this.data[++top] = data;
return true;
}
/**
* 从栈中取出数据
* @return 取出的数据
*/
public int pop() throws Exception
{
if (top == -1)
{
throw new Exception("栈已空!");
}
return this.data[top--];
}
public static void main(String[] args) throws Exception
{
Stack stack = new Stack(1000);
stack.push(1);
stack.push(2);
stack.push(3);
stack.push(4);
stack.push(5);
while (stack.top >= 0)
{
System.out.println(stack.pop());
}
}
}以上就是本篇文章的所有内容,需要了解更多面试题的话,就赶快来看看我们的java面试宝典吧。
推荐阅读: