Java面试题,帮忙看一下吧

Cyl888 2009-12-10 02:55:43
public static void main(String[] args) {

String str = "1";
ArrayList arr = new ArrayList();
arr.add("a");
opp(str, arr);
for (int i = 0; i < arr.size(); i++) {
System.out.println(arr.get(i));
System.out.println(str);
}

}

static void opp(String s, ArrayList arr) {
arr.add("b");
s.replace("1", "2");
arr = new ArrayList();
arr.add("c");
}

最后输出的结果是
a
1
b
1
...全文
202 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
whut0802 2009-12-10
  • 打赏
  • 举报
回复
呵呵,忘了解释了:执行s.replace("1", "2"); 的时候只是把opp方法中的str指向了"2",因为传递的是值,所以对main方法中的str的指向没有影响
执行 arr = new ArrayList(); arr.add("c");的时候,看图。。opp方法中的arr指向了一个新的地 址 ,而main方法中的arr还是指向原来的地址,只是里面的内容发生了改变


whut0802 2009-12-10
  • 打赏
  • 举报
回复

godismydaughter 2009-12-10
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 sean1203 的回复:]
都说了。。。
[/Quote]
sean1203 2009-12-10
  • 打赏
  • 举报
回复
都说了。。。
ssyyo_bj 2009-12-10
  • 打赏
  • 举报
回复
luguo
longtenggdf 2009-12-10
  • 打赏
  • 举报
回复
1,String是不可变的。
2,java参数传递的实质是复制一个引用(基本类型除外),也就是说。所有的操作都是对原来对象的操作。
也就是说s.replace("1", "2"); 其实也企图对"1",进行操作,但是String不可变,所以s只好指向一个新的String----"2".
3,所有形如 arr = new ArrayList(); 是对应用的操作,而不是对对象的操作。也就是说"="实际上是引用的赋值运算。
新建文件夹 2009-12-10
  • 打赏
  • 举报
回复
首先,要知道在java中只有值传递,没有引用传递。
也就是说,在方法调用的过程中,对于引用类型的参数,Java会将实参的地址拷贝给形参。

下面我们分析一下opp方法里的每一行语句到底做了什么事情。

首先看opp(str, arr)这条语句,str和arr均为实参,它调用了opp(String s, ArrayList arr)方法,s和arr为形参,实参str的地址拷贝给了形参s,实参arr的地址拷贝给了形参arr。

然后,arr.add("b")这句话将会添加到原来的arr中,因为它们指向的是同一个实例。

紧接着,s.replace("1", "2") 这句话仅仅改变了形参,实参还是原来的字符串"1"。

接下来,arr = new ArrayList() 这句话将形参arr重新指向了一个新的实例,arr.add("c")已经和实参没有关系了,因为它们指向的不是一个实例,实参不会受影响。

希望对你会有所帮助。
KingWolfOfSky 2009-12-10
  • 打赏
  • 举报
回复

import java.util.ArrayList;

public class Demo
{
public static void main(String[] args)
{
String str = "1";
ArrayList arr = new ArrayList();
arr.add("a");
opp(str, arr);
for (int i = 0; i < arr.size(); i++) {
System.out.println(arr.get(i));
System.out.println(str);
}
}
static void opp(String s, ArrayList arr) {
arr.add("b");
s.replace("1", "2"); /*s.replace("1", "2")是取出s的一个副本进行操作并返回一个对“2”的新引用,但程序并没有接受返回值而是将其抛弃,故s还是“1”,但使用s=s.replace("1", "2"); 也不会改变s的值*/
arr = new ArrayList(); //新建了一个ArrayList,并将arr指向该引用,但原来的arr还是{"a","b"}
arr.add("c");
}

}
dajiadebeibei9 2009-12-10
  • 打赏
  • 举报
回复
arr的道理和刚才字符串的道理一样
arr.add("b"); 之后 arr里面有“a”“b”
arr = new ArrayList(); 之后 arr指向了新的内存单元
新的内存单元里arr.add("c"); 只有c
但是最开始的arr里没有c明白了吧
yangxiao_jiang 2009-12-10
  • 打赏
  • 举报
回复
java中string是不变的,s.replace("1", "2"); 没有对s进行重新赋值,所以不会有变化。
dajiadebeibei9 2009-12-10
  • 打赏
  • 举报
回复
s只是str的一个副本 它们所占用的内存是不一样的 你改变了s 但是没有改变原来的str 所以是1

62,621

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧