黑马程序员 一道内存分配的面试题

本文详细解析了一道关于Java中基础类型与包装类型比较的面试题,解释了基本数据类型与包装类之间的比较机制,包括“==”运算符与equals()方法的区别,以及Java内存分配原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IO开发S</a>、<a href="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流! ----------------------

一道基础面试题如下:
请问,以下哪些代码可编译通过且可以打印输出Equal?请选择所有正确答案:
A.class Check{
public static void main(String args[])
{ int x=100;
float y=100.0F; 
if(x==y){ System.out.println(“Equal”);
} } }
B.class Check
{ public static void main(String args[])
{ int x=100; 
Integer y=new Integer(100);
if(x==y) { System.out.println(“Equal”); }
} } 
C.class Check{ 
public static void main(String args[])
{ Integer x=new Integer(100);
 Integer y=new Integer(100); 
if(x==y){ System.out.println(“Epual”); }
} } 
D.class Check{ 
public static void main(String args[])
{ String x=new String(“100”);
String y=new String(“100”);
If(x=y) { System.out.println(“Equal”); } 
} } 
E.class Check{ 
public static void main(String args[])
{ String x=new String(“100”); 
String y=new String(“100”); 
If(x==y){ System.out.println(“Equal”); }
} }
这道题是把我给弄蒙了,一开始我选的是D,因为我之前对“==”和equals()有点印象,知道它们比


的东西不一样,但是谁是比地址,谁是比值记不清了。而String类型又跟常量池有关系,所以一下子看这么多比


较,就把我彻底搞混了。之前有在一篇博客中看过讲解内存分配,特地找来:


http://developer.51cto.com/art/201009/225071.htm  。提交面试题了之后,又把它翻出来看了一遍,然后挨


个运行上面所有的例子,才明白了java内存分配的一些原理。
正确答案是AB,先说说我为什么选D,因为以前学习C语言的时候,经常会把“==”写成“=”,然后造


成死循环,就是因为赋值操作成功后判断会为真,但是用eclipse运行一下是不通过的,因为在java里面能进行


判断的类型只有boolean型,不像C里面,整数也是可以参与判断的,所以会提示Type mismatch: cannot 


convert from String to boolean的错误,“x=y”这个式子的值是String类型,不可以参与判断,不通过编译


,错。
然后我特地查了“==”和equals()的功能:比较类里面的数值是否相等时,用equals()方法;当测试


两个包装类的引用是否指向同一个对象时,用“==”。new关键字生成一个新的对象,每调用一次都会生成一个


对象,上面刚说了“==”是比较两对象的地址是否相同,也就是是否是同一个对象的引用,所以CE都是不一个对


象,这个很容易判断,错。
最让惊讶的是正确答案竟然是AB,要理解它们必须先了解栈的一个特性:就是存在栈中的数据可以共享


。举例说明一下:
int a = 3;   
int b = 3;
编译器先处理int a = 3;首先它会在栈中创建一个变量为a的引用,然后查找栈中是否有3这个值,如


果没找到,就将3存放进来,然后将a指向3。接着处理int b = 3;在创建完b的引用变量后,因为在栈中已经有3


这个值,便将b直接指向3。这样,就出现了a与b同时均指向3的情况。
这时,如果再令 a=4;那么编译器会重新搜索栈中是否有4值,如果没有,则将4存放进来,并令a指向4


;如果已经有了,则直接将a指向这个地址。因此a值的改变不会影响到b的值。
要注意这种数据的共享与两个对象的引用同时指向一个对象的这种共享是不同的,因为这种情况a的修


改并不会影响到b, 它是由编译器完成的,它有利于节省空间。而一个对象引用变量修改了这个对象的内部状态


,会影响到另一个对象引用变量。
所以A就可以理解了,虽然x和y的类型不同,但是它们均指向了同一个地址。这样一来,基本数据类型


的转型也就更好理解了,其实就是为了节省栈的空间,所以编译器才允许int赋给float或其他类型。
那么B就令人费解一点了,因为x是基本数据类型,y是包装类,x与y的引用也指向了同一个地址?自从


jdk1.5版本之后,java可以自动拆箱装箱操作,那么在进行“x==y”比较的时候,是x被装箱了,还是y被拆箱了


呢?如果是x被装箱了,岂不应该是一个新的对象,所以应该是y被拆箱了,然后一看100已经存在,所以x与y指


向了同一个地址。不过在这里,小弟做了大胆的猜测,装箱这个操作,y肯定是在栈里,只是在堆里并没有创建


一个相应的对象,而是直接指向了栈里的一个单元,节省了内存,同时又可以拥有多种方法对其进行操作,所以


x与y尽管类型不同,它们的指向却相同。

---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IO开发S</a>、<a href="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流! ----------------------

内容概要:本文档详细介绍了基于事件触发扩展状态观测器(ESO)的分布式非线性车辆队列控制系统的实现。该系统由N+1辆车组成(1个领头车和N个跟随车),每辆车具有非线性动力学模型,考虑了空气阻力、滚动阻力等非线性因素及参数不确定性和外部扰动。通过事件触发ESO估计总扰动,基于动态面控制方法设计分布式控制律,并引入事件触发机制以减少通信和计算负担。系统还包含仿真主循环、结果可视化等功能模块。该实现严格遵循论文所述方法,验证了观测误差有界性、间距误差收敛性等核心结论。 适合人群:具备一定编程基础,对非线性系统控制、事件触发机制、扩展状态观测器等有一定了解的研发人员和研究人员。 使用场景及目标:①研究分布式非线性车辆队列控制系统的理论与实现;②理解事件触发机制如何减少通信和计算负担;③掌握扩展状态观测器在非线性系统中的应用;④学习动态面控制方法的设计与实现。 其他说明:本文档不仅提供了详细的代码实现,还对每个模块进行了深入解析,包括非线性建模优势、ESO核心优势、动态面控制与传统反步法对比、事件触发机制优化等方面。此外,文档还实现了论文中的稳定性分析,通过数值仿真验证了论文的核心结论,确保了系统的稳定性和有效性。建议读者在学习过程中结合代码进行实践,并关注各个模块之间的联系与相互作用。
内容概要:本文档《c预约面试大全.pdf》汇集了大量C语言及其相关领域的面试问题与解答,涵盖了从基础概念到高级技巧的广泛知识点。主要内容包括但不限于:C语言的基础语法(如static关键字的作用、指针与引用的区别)、数据结构(如平衡二叉树、链表操作)、算法(如冒泡排序的时间复杂度)、计算机网络(如TCP/IP协议栈)、操作系统(如进程和线程的区别)、内存管理(如堆栈差异)等方面。此外,还涉及了一些较为复杂的主题,例如位域的应用、编译原理中的预编译概念、以及针对特定问题的编程实现(如寻找数组中的重复数字、实现约瑟夫环问题等)。每个问题都配有详细的解释或代码示例,旨在帮助求职者全面准备C语言相关的技术面试。 适合人群:正在准备C语言及相关领域(如嵌入式开发、系统编程)工作的求职者,尤其是有一定编程基础但缺乏实战经验的技术人员。 使用场景及目标:①帮助读者深入理解C语言的核心概念和技术细节;②通过实际案例分析提升解决复杂问题的能力;③为参加各类技术面试做好充分的知识储备和心理准备。 其他说明:此文档不仅包含了理论知识,还提供了大量实战练习的机会,鼓励读者动手实践,从而更好地掌握所学内容。同时,文档中的问题难度逐步递增,适合不同层次的学习者按需选择。由于C语言是许多高级编程语言的基础,因此这份资料对于想要深入学习计算机科学的学生也非常有价值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值