我们都知道,堆栈是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面试宝典吧。
推荐阅读: