如何按现栈底再栈顶的顺序打印一个栈里的所有的元素
如何按现栈底再栈顶的顺序打印一个栈里的所有的元素 (java)?
(java)?
如果这个栈是你自己写的,那你自己知道每一个元素,就可以一个个按你想要的顺序打印。如果这个栈的类是别人写的,别人之提供给你push,pop方法,那么估计也只有全部pop出来这种方法了 哦,你的意思是栈虽然是你自己写的,但是你用的时候却需要反过来遍历,而不是说在栈的内部做这个遍历?那么在外部的话我觉得是没有好办法的,因为栈只有那两个操作,除非像java的Stack那样,还提供了整个线性表的功能。但是如果是你需要反过来遍历的话,我觉得这就不适合用栈这种数据结构啊 用什么数据结构要看你什么需求,比如你做的事情的确是栈的概念,你也的确只需要出栈,进栈的操作的话,那么你只需要栈就可以了。你现在要遍历整个集合,那就用最普通的顺序表好了
JAVA的内存是如何划分的?
谢邀~
关于JVM的知识,一直令很多Java程序员头疼,不过JVM也是值得我们深入学习的内容,下面我就谈谈自己对JVM内存划分的理解。
什么是Java的内存学习Java的朋友应该都知道,Java程序是在JVM上运行的,所以我们一般谈的Java内存划分事实上都是指的JVM内存区域的划分。在讨论JVM内存划分之前,我们需要知道Java程序的执行过程(手动画图,有点儿丑):
通过这个图可以看到,JVM在执行Java程序的时候,要用到一块空间来存储运行期间用到的数据,这块区域就是我们经常用的运行时区域,也就是常说的JVM内存。
Java的内存的组成程序计数器(Program Counter Register)、Java栈(VM Stack)、本地方法栈(Native Method Stack)、方法区(Method Area)、堆(Heap)。
这个是Java虚拟机规范规定好的,但是具体怎么实现还是由厂商决定的。
运行的时候,每一个区域存的是什么数据的,先看一张图:
程序计数器保存指令地址,也就是存的是下一条执行所在的存储地址。如果是多线程的时候,因为一个CPU在一个时刻只能执行一条命令,为了能够让每一个线程在切换之后能够恢复切换之前的位置,每个线程就需要有自己的计数器,所以说:程序计数器是每个线程私有的。
虚拟机栈
就是Stack,存放的是一个个的栈帧,每个栈帧对应一个被调用的方法。在栈帧中存着局部变量表、操作数栈、指向当前方法所属的类的运行时常量池的引用、方法返回地址和一些额外的附加信息。(这几个东西都是干啥的,可以单独写篇文章说了...)
每个线程都会有一个自己的Java栈,也是线程私有的。
本地方法栈
本地方法栈与Java栈的作用和原理非常相似。区别只不过是Java栈是为执行Java方法服务的,而本地方法栈则是为执行本地方法(Native Method)服务的。
在HotSopt虚拟机中直接就把本地方法栈和Java栈合二为一。堆
存储对象本身的以及数组,堆是被所有线程共享的,在JVM中只有一个堆。
方法区
存储了每个类的信息(包括类的名称、方法信息、字段信息)、静态变量、常量以及编译器编译后的代码等,也是被线程共享的。
Java内存区域划分,是一个中高级程序员的必修课,希望我的回答能够帮助到你!
我将持续分享Java开发、架构设计、程序员职业发展等方面的见解,希望能得到你的关注。