JAVA堆,栈的区别,用AarrayList、LinkedList自定义栈
大家都知道java模拟机在运行时要开辟空间所以它有特定的五个内存划分:
1.寄存器;
2.本地方法区;
3.方法区;
4.栈内存;
5.堆内存;
但是我们今天来注重讲一下栈和堆。
栈区(Stack):
1.栈的特点在于它是先进后出的线性表FILO(Last in first out),它的操作数据顺序是从上至下的。
就比如:一包抽巾纸,它放进包装袋时是最底下那一张最先进,但是在我们使用时最先拿出的是最上层的纸巾。
2.栈在被调用时存放在一级缓存中,调用完毕后就释放。
3.每个线程包含一个栈区,栈中只保存基础数据类型的对象和自定义对象的引用(不是对象),对象都存放在堆区中
4.每个栈中的数据都是私有的,其他栈不能访问
如何自定义栈:
一:用的是arraylist集合中去模拟栈的数据结构:
package com.j2ee;
/**
* 自定义栈
* @author Administrator
*
*/
import java.util.ArrayList;
public class Stack { ArrayList<Object> list = new ArrayList<Object>(); // 使用集合存储数据 // 栈是否为null
public boolean isEmpty() {
return list.isEmpty();
} // 栈长度
public int size() {
return list.size();
} // 取栈顶元素
public Object stackTop() {
if (list.size() == 0) {
return null;
}
return list.get(list.size() - 1);
}
// 出栈
public Object pop() {
if (list.size() == 0) {
return "栈为null,无法删除";
}
Object obj = list.get(list.size() - 1);
list.remove(list.size() - 1);
return obj;
} // 压栈
public void push(Object obj) {
list.add(obj);
} // toString
public String toString() {
return "Stack:" + list.toString();
}
}、
// 压栈
public void push(Object obj) {
list.add(obj);
} // toString
public String toString() {
return "Stack:" + list.toString();
}
}
//测试类代码:
package com.j2ee;
/**
* 测试
* @author Administrator
*
*/
public class Temp {
public static void main(String[] args) {
Stack stack=new Stack();
System.out.println("是否为空:" + stack.isEmpty());
System.out.println("长度:" + stack.size());
System.out.println("顶元素:" + stack.stackTop());
System.out.println("出栈:" + stack.pop());
System.out.println("==============我是分割线================");
stack.push("本是青灯不归客");
System.out.println("是否为空:" + stack.isEmpty());
System.out.println("长度:" + stack.size());
System.out.println("顶元素" + stack.stackTop());
System.out.println("出栈" + stack.pop());
}
}
二:用LinkedList集合去模拟栈的数据结构
//用LinkedList集合去模拟栈的数据结构
LinkedList arr=new LinkedList();
public void push(Object obj) {
arr.addFirst(obj);
}
public Object prop() {
Object object= arr.getFirst();
arr.removeFirst();
return object;
}
//测试代码
//栈
MyStarck myStarck=new MyStarck();
myStarck.push();
myStarck.push();
myStarck.push();
myStarck.push();
myStarck.push();
myStarck.push();
for (int i = ; i <myStarck.arr.size(); i++) {
System.out.println(myStarck.prop()); }
堆区(heap):
1.存储的全部是对象,每个对象都包含一个与之对应的class的信息。
2.堆的特点在于它是先进先出的缓存FIFO(First In First Out)队列,模拟器只有一个堆区(heap)被所有线程共享,堆中只存放对象本身,存放在二级缓存中,生命周期由虚拟机的垃圾回收机制定
谢谢观看!
JAVA堆,栈的区别,用AarrayList、LinkedList自定义栈的更多相关文章
- C语言中堆和栈的区别
原文:http://blog.csdn.net/tigerjibo/article/details/7423728 C语言中堆和栈的区别 一.前言: C语言程序经过编译连接后形成编译.连接后形成的二进 ...
- LinkdList和ArrayList异同、实现自定义栈
//.LinkdList和ArrayList异同 //ArrayList以连续的空间进行存储数据 //LinkedList以链表的结构存储数据 //栈 先进后出 最上面是栈顶元素 arrayLiat自 ...
- Java中堆和栈的区别(转)
栈与堆都是Java用来在Ram中存放数据的地方.与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆. Java的堆是一个运行时数据区,类的对象从中分配空间.这些对象通过new. ...
- Java中的堆和栈的区别
当一个人开始学习Java或者其他编程语言的时候,会接触到堆和栈,由于一开始没有明确清晰的说明解释,很多人会产生很多疑问,什么是堆,什么是栈,堆和栈有什么区别?更糟糕的是,Java中存在栈这样一个后进先 ...
- Java堆和栈的区别和介绍,JVM的堆和栈
一.Java的堆内存和栈内存 Java把内存划分成两种:一种是堆内存,一种是栈内存. 堆:主要用于存储实例化的对象,数组.由JVM动态分配内存空间.一个JVM只有一个堆内存,线程是可以共享数据的. ...
- 【转】Java运行时数据区简介及堆与栈的区别
理解JVM运行时的数据区是Java编程中的进阶部分.我们在开发中都遇到过一个很头疼的问题就是OutOfMemoryError(内存溢出错误),但是如果我们了解JVM的内部实现和其运行时的数据区的工作机 ...
- java堆和栈的区别
java 的内存分为两类,一类是栈内存,一类是堆内存.栈内存是指程序进入一个方法时,会为这个方法单独分配一块私属存储空间,用于存储这个方法内部的局部变量,当这个方法结束时,分配给这个方法的栈会释放,这 ...
- java堆、栈、堆栈的区别
1.栈(stack)与堆(heap)都是Java用来在Ram中存放数据的地方.与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆. 2. 栈的优势是,存取速度比堆要快,仅次于直接位于CP ...
- java 堆与栈的区别
1. 堆与栈的区别? 1-1. 数据存放位置: 数据都存放于RAM (Random Access Memory). 1-2. 存放数据的类型:stack栈中保存方法中的基本数据类型(int, do ...
随机推荐
- phpstorm yii2框架的redis和mongodb提示
随便找个目录创建一个 yii_helper.php 文件,内容如下: /** * Class Yii */ class Yii { /** * @var MyApplication */ public ...
- [转]在CentOS安装CMake (CentOS7 64位适用)
一.环境描述 1.系统:CentOS 6.4 i386 (min) 2.登录用户:root 3.版本:CMake 2.8.10.2 4.虚拟机:Oracle VM VirtualBox 二.安装步骤 ...
- fkutter Stepper步骤指示器
一个Material Design 步骤指示器,显示一系列步骤的过程 import 'package:flutter/material.dart'; class StepperDemo extends ...
- ES6深入浅出-13 Proxy 与 Reflect-2.Proxy 代理
阮一峰http://es6.ruanyifeng.com/#docs/proxy MDN https://developer.mozilla.org/zh-CN/docs/Web/JavaScript ...
- 关于python中的路径
如果在train.py中调用了1.py中的A方法,则A中的相对路径按照train.py来写!
- Python - Django - 添加首页尾页上一页下一页
添加首页和尾页: views.py: from django.shortcuts import render from app01 import models def book_list(reques ...
- Swift4.0复习扩展
1.扩展计算式属性: 2.对方法进行扩展: /// 定义枚举类型Light, /// 它指定了基本类型String enum Light: String { case red = "red& ...
- 【k8s 硬盘监控】prometheus grafana
设置监控哪块盘: https://www.bountysource.com/issues/50160777-disk-space-usage-depcited-in-grafana-correct h ...
- 《MySQL必知必会》学习笔记——第1章 了解SQL
第1章 了解SQL 本章将介绍数据库和SQL,它们是学习MySQL的先决条件. 1.1 数据库基础 你正在阅读本书,这表明你需要以某种方式与数据库打交道.在深入学习MySQL及其SQL语言的实现之前, ...
- 【Leetcode_easy】1137. N-th Tribonacci Number
problem 1137. N-th Tribonacci Number solution: class Solution { public: int tribonacci(int n) { ) ; ...