(Java之路之重新开始)有关String底层原理的一道经典面试题

想必每一位Java学习者对String都很熟悉,但是对于String的底层是否了解就不一定了。

下面大家看到面试题:

package com.string.exer;

public class StringTest {
	String str = new String("good");
	char[] ch = {'t', 'e', 's', 't'};
	
	public void change(String str, char[] ch) {
		str = "test ok";
		ch[0] = 'b';
	}
	
	public static void main(String[] args) {
		StringTest st = new StringTest();
		st.change(st.str, st.ch);
		System.out.println(st.str);
		System.out.println(st.ch);
	}
}

问:输出的是什么?

运行结果如下:
在这里插入图片描述
为什么输出的是good、best,而不是test ok、test ?

解析:字符串和数组都是引用类型,在值传递都传递的是地址值,所以当在change方法中修改ch[0]的值时,其实就是对属性

ch[] 数组的修改。但是,在change方法中并不能通过修改形参str的值,进而修改属性str的值,因为字符串是不可变的 ,而数

组是可变的。对于change方法中“str = “test ok” ”,此时形参str的确是指向属性str的地址值,但是由于字符串的不可变性,在执行

此语句时,并不会更改属性str指向的String对象的value值,而是在字符串常量池创建字符串“test ok”,然后把"test ok"的地址值赋

给形参str。

如果你对字符串底层不太了解,请参考这篇博客:https://blog.csdn.net/qq_43437122/article/details/105806653
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值