一道面试题:StringBuffer a=new StringBuffer ("A"); StringBuffer b=new StringBuffer (StringBuffer线程安全 StringBuilder线程不安全)
前几天又看到这个面试题,再次看看
public class Jtest{ public static void main(String[] args) { StringBuffer a=new StringBuffer ("A"); StringBuffer b=new StringBuffer ("B"); oper(a,b); System.out.print(a+","+b); } static void oper(StringBuffer c,StringBuffer d){ c.append("B"); d=c; } }
------输出结果是什么?
此题关键就在于 oper(c,d) 方法,这个方法到底做了什么,怎么结果就和想的不一样呢?
那么,就来看一下这个方法做了什么。
上代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | package test; public class Jtest{ public static void main(String[] args) { StringBuffer a= new StringBuffer ( "A" ); StringBuffer b= new StringBuffer ( "B" ); //取代 oper(a,b) start; StringBuffer c; StringBuffer d; c = a; //c的地址指向了a,此时 c 的值为"A"; d = b; //d的地址指向了b,此时 d 的值为"A"; c.append( "B" ); //在c(a)的地址值变为 “AB” d=c; // d的地址指向了c,也就是指向了a,**关键就在这里了**,那么可以看到,这个过程中根本就没对b做任何操作, //就好像gg(d)路过一mm(b),说:这mm(b)不错,然后发现前面有个更有吸引力的mm(c)然后就见异思迁了,然后拿了一朵花("B")给mm(c(a))了,,所以mm(b)压根就不知道什么情况,没参与 // so, b 还是b("B") , a已不是a("A"),二是a("AB") //取代 oper(a,b) end; System.out.print(a+ "," +b); } static void oper(StringBuffer c,StringBuffer d){ c.append( "B" ); d=c; //一开始的想法是这样的,c = a; d= b; 那么 c.append("B");后 c=“AB”,d=c = "AB",实际上并不是数学中的简单等价传递 } } |
本文来自博客园,作者:aspirant,转载请注明原文链接:https://www.cnblogs.com/aspirant/p/6788998.html
分类:
Java 基础知识
, Interview_面试
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?