String面试题分析

程序分析了Java中字符串和字符数组的不可变性,以及方法调用时栈帧的变化。在change方法中,str引用改变指向了新的字符串常量,而ch数组的第一个元素被修改。尽管在方法内部进行了修改,但对外部对象的影响不同,str仍指向原来的haha,而ch数组变为hava。
摘要由CSDN通过智能技术生成

下面程序运行的结果是什么

public class Test1{

        String str = new String("haha");

        final char[] ch = {'j','a','v','a'};

        public void change(String str,char ch[]){

          str = "java";

          ch[0] = 'h';

        }

   public static void main(String[] args){

        Test1 ex =  new Test1();

        ex.change(ex.str,ex.ch);

        System.out.print(ex.str+"and");

        System.out.print(ex.ch);

   } 

}

我们一起来分析下 这次使用画图来处理

先执行main方法的第一条语句

1.Test1 ex =  new Test1(); 

下面是执行完该语句的jvm内存

现在执行第二条语句 

2. ex.change(ex.str,ex.ch);

执行该语句会创建一个新的栈(执行方法会创建一个新的栈)

由于 它们都是引用类型所以是地址传递 ,我们先画出  public void change(String str,char ch[])

2.1 在执行 str ="java";

这条语句 会先在常量池中查找 有没有 "Java",没有那么会在常量池内添加一个 "java"

显然 这里并没有 ,所以在常量池 添加了一个 "java"

相当于ch指向的地址从[0x33] 变成了 [0x55](当然是 change栈里面的ch改变了指向)

 然后 我们执行

2.2 ch[0] = 'h';

将原来数组 ch下标为0的元素'j' 修改成了'h'

 

 到此change栈执行完毕

但是 但是 但是 方法执行完毕会关闭 change栈!!!!!

我们现在执行main栈的第三条语句

3.System.out.println(ex.str+"and");

通过下图知道  ex.str 指向String对象[0x22],期内的value指向[0x44]"haha"

所以输出: hahaand

 现在执行第四句话

4.System.out.print(ex.ch);

还是通过上图知道 ex.ch 是指向的 char对象[0x33] 其内字符串 "hava"

5. 所以 最后输出 :

hahaandhava

so 你答对没有啊?

总结: 数组,字符串不可变 (也就是相同的一个地址里面只能有一个 数组,字符串)

            执行一个方法会开辟新栈,执行完毕会回到调用处,并关闭新栈。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值