Java异步setHash函数是否会存入null值?
问题描述
我有如下异步的setHash函数:
public void setHash(Context context, String hash) { SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); SharedPreferences.Editor editor = prefs.edit(); editor.putString("has", hash); editor.apply(); }
我通过以下代码调用该函数:
private String mHash = "s4mp1eh45h"; void myFunction() { setHash(this, mHash); mHash = null; }
已知Java是按值传递,现请教:setHash函数中保存的hash是否有可能为null?
回答
不可能为null,原因如下:
- Java中对于引用类型的参数传递,传递的是对象引用的副本。调用
setHash(this, mHash)时,mHash当前指向的是字符串s4mp1eh45h的引用,这个引用的副本会被传入setHash的hash参数,此时hash参数和mHash指向同一个字符串对象。 - 后续执行
mHash = null只是修改了mHash变量本身的指向,让它不再指向原来的字符串对象,但这不会影响setHash方法里hash参数的指向——它仍然指向最初的s4mp1eh45h字符串。 - 即便
editor.apply()是异步执行的,它最终保存的也是hash参数指向的字符串对象,外部mHash被设为null的操作不会对这个对象产生任何影响,因为字符串本身是不可变的,且hash参数的引用并未被修改。
内容的提问来源于stack exchange,提问作者user1506104
相关产品推荐
相关产品推荐

