关于堆栈理解

关于堆栈理解很重要,假如你想成为高手这是必修课。涉及到jvm内存中如何组织数据,
以及在以后的涉及数据和对象调用时能轻松自如,灵活运用,记住这是根上的问题。
首先简单写个简单测试小程序,如果对此感兴趣者可以直接运行一下 看一下结果:

public class EqualObject {
    protected int[] a={2,3};
    protected int[] b={2,3};
    protected boolean equaleObj(){
        if(a.equals(b)){     //判断条件equal值比较 ==址比较
            return true;
        }
        else{
            return false;
        }
    }
    public static void main(String[] args) {
        EqualObject obj=new EqualObject();
        System.out.print(obj.equaleObj());
    }

}
前几日一“技友”(技术类朋友),在日志里给出的一个小问题,当时感觉记忆
比较模糊,今天整理一下。
关于堆栈,首先得了解基本数据类型和对象在jvm内存中的存储形式:
(1)、基本数据类型(包含整型,浮点,双精度,字符)
其引用也就是变量a这个代号,以及他的实体值都是在栈中存放,该种数据类型
的分配原则或者规律是,只要是有相同值的数据存在,那么jvm会自动将引用链
接已经存在的相同的实体值,不会重新分配内存,比如int a=2;int b=2;那么
当判断他们的值和址都是相同,返回结果都是true。证明我上述推断正确。
(2)、字符串
该种数据类型经过测试后,其运行结果和基本数据类型一致,虽然其不属于基本
数据类型,但是在堆栈理解上姑且将他划分到基本数据类型中去。
(3)、数组以及对象
该类数据类型的存放形式是引用存放于栈中,实体值存放于堆中,每创建一次对
象就会分配一次内存,即使实体值相同,他们的equal比较也是返回false这说明
了数组和对象其非常特别的地方,也就是说对象之间的值是无法比较的。而他们
的址是可以比较的。

 

 

 

附带 考试题一道:

public void call(Test t) {
Test t2 = new Test();
t2.setName("cba');
t.setName("abc");
t = t2 ;
}

public static void main(String[] arg) {
Test obj = new Test();
call (obj) ;
System.out.println("obj"+obj.getName());
}
输出的是什么?为什么?

 

 

本人的解答:

首先我将先生问简化了一下,弱化其中极具干扰作用的一些东西。
从问题中Test在两个方法中的用法可以推测或者假设其为一个简单的javaBean,主程序入口
简化为Validate类。其程序如下:
//Test类;
package ex_1;

public class Test {
 protected String name;

 public String getName() {
  return name;
 }

 public void setName(String name) {
  this.name = name;
 }
 
}

//主程序如下:
package ex_1;

public class Validate {
 public void call(Test t){
  Test t2=new Test();
  t2.setName("bac");
  t.setName("abc");
  t=t2;
 }
 public static void main(String[] args) {
  Validate v=new Validate();
  Test obj=new Test();
  v.call(obj);
  System.out.println(obj.getName());
 }

}
其输出结果是“abc”。
现在我说说我做这个程序,或者分析这个问题时的一些感受。
我能感受到出这问题的人当时是一种什么样的心态,一句话,确实很干扰人,出这题的人
确实有水平,但是确实也很贱。
怎么说呢,先画个简单的该题在jvm内存中数据部署图吧。

 

从上述图中可以看出,call方法执行完后,改变的是t的实体对象,而问题最后输出的结果
确极具干扰的问obj。不过该问题隐含的一个重要的问题就是如何理解入口参数t这个概念,
本人曾经深刻的思考过这问题,但是从没看过哪位大虾对此的解释,今天我想听听齐君对此
的看法。对此我的理解如下:
入口参数其实就是一个局部变量(因为他在方法中,属成员体的子对象),执行程序时做为
引用,并在栈中为其分配这个t代号的引用内存,就像图示的1步,其代表的实体是obj所代表
的实体,而执行t=t2;过后其代表的实体是代号t2的实体对象即2步,而obj对象始终没有发
生引用与实体的更改或变换。

在说一下关于学习和实际应用中,我所感受到的一些东西,比如上述代码吧,如果在实际开
发过程中,假若某一PG写出如此代码,真的只能说是思维混乱,属于最次那伙的,但是考试
就是考试,容易误导一帮人,建议以后老师出题的时候多考虑一下以后学生的发展,别老往
牛角尖里引导。
呵呵 不知齐君对此回答是否满意,以后我希望齐君每天都能给我带来挑战。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值