一亩三分地论坛

 找回密码
 获取更多干货,去instant注册!

扫码关注一亩三分地公众号
查看: 542|回复: 4
收起左侧

[算法题] Leetcode Binary Tree Path里关于Java StringBuilder 的问题

[复制链接] |试试Instant~ |关注本帖
windyL 发表于 2015-8-27 09:25:33 | 显示全部楼层 |阅读模式

注册一亩三分地论坛,查看更多干货!

您需要 登录 才可以下载或查看,没有帐号?获取更多干货,去instant注册!

x
用java做到leetcode的一道简单题,Binary Tree Path有一点卡住了
我的code如下:
  1. public class Solution {
  2.     List<String> result=new ArrayList<String>();
  3.     public List<String> binaryTreePaths(TreeNode root) {
  4.         StringBuilder path=new StringBuilder();
  5.         if(root!=null)
  6.             dfs(root,path);
  7.         return result;
  8.     }
  9.     public void dfs(TreeNode root, StringBuilder path){
  10.         if(root.left==null&&root.right==null){
  11.             path.append(root.val);
  12.             result.add(path.toString());
  13.             return;
  14.         }
  15.         path.append(root.val);
  16.         path.append("->");
  17.         if(root.left!=null){
  18.             dfs(root.left, path));
  19.         }
  20.         if(root.right!=null){
  21.             dfs(root.right,path);
  22.         }
  23.             
  24.     }
  25. }
复制代码
我把一个Stringbuilder (变量名path)做为参数在dfs里面传入,按道理java pass by value,在函数里应该会生成一个新的stringbuilder,原本的stringbuilder不会被修改。结果我的结果是:

Input:[1,2,3]
Output:["1->2","1->23"]
Expected:["1->2","1->3"]


显然原来位置的stringbuilder被修改了。
然后我把dfs(root.left, path) 改成dfs(root.left, new StringBuilder(path)),dfs(root.right, path) 改成dfs(root.right, new StringBuilder(path))就通过了。
实在不是很明白,为什么这里stringbuilder是pass by reference呢?是这个类比较特殊吗?
求大神解答
flyaway25 发表于 2015-8-27 10:27:30 | 显示全部楼层
实际上java的object传递虽然是pass by value,但是value对的是object的reference,所以很多人直接就说java是pass by reference了。
回复 支持 反对

使用道具 举报

muybienw 发表于 2015-8-27 10:34:10 | 显示全部楼层
Java里面传Object都是by reference的,任何修改都会反映在那个Object上。反而比较特殊的是String,虽然是个Object,但是函数传递的时候是by value(类似 primitives),而且任何函数操作都是返回一个修改后的副本。
回复 支持 反对

使用道具 举报

 楼主| windyL 发表于 2015-8-27 10:55:30 | 显示全部楼层
明白了。java虽然说是all pass by value但是对于object是copied reference,所以这里还是可以修改原来的object。谢谢楼上的回答。

http://stackoverflow.com/questio ... ce-or-pass-by-value
回复 支持 反对

使用道具 举报

vivaroma 发表于 2015-8-27 16:39:09 | 显示全部楼层
回顾下基础知识,java数据类型分为基本型和引用型,引用型指向特定的内存区域。基本型包括6种数值型+字符型+布尔型。引用型包括类、接口和数组。

Stringbuilder在此是一个类,属于引用型,pass by reference
回复 支持 反对

使用道具 举报

本版积分规则

请点这里访问我们的新网站:一亩三分地Instant.

Instant搜索更强大,不扣积分,内容组织的更好更整洁!目前仍在beta版本,努力完善中!反馈请点这里

关闭

一亩三分地推荐上一条 /5 下一条

手机版|小黑屋|一亩三分地论坛声明 ( 沪ICP备11015994号 )

custom counter

GMT+8, 2016-12-9 20:07

Powered by Discuz! X3

© 2001-2013 Comsenz Inc. Design By HUXTeam

快速回复 返回顶部 返回列表