目前我正在致力于代码优化,我正在使用 try..finally 块来尊重我的对象。
但是当我在finally块中创建对对象的空引用时,我对如何管理返回对象感到困惑。 ??
在try块中返回对象时,编译时会创建预编译语句吗?或者在返回语句时在堆中创建新的引用?或者只是返回对象的当前引用?
以下是我的研究代码。
public class testingFinally{
public static String getMessage(){
String str = "";
try{
str = "Hello world";
System.out.println("Inside Try Block");
System.out.println("Hash code of str : "+str.hashCode());
return str;
}
finally {
System.out.println("in finally block before");
str = null;
System.out.println("in finally block after");
}
}
public static void main(String a[]){
String message = getMessage();
System.out.println("Message : "+message);
System.out.println("Hash code of message : "+message.hashCode());
}
}
输出是:
尝试区块内
str 的哈希码:-832992604
终于在之前
在finally块之后
留言:世界你好
消息哈希码:-832992604
当我看到返回对象和调用对象具有相同的哈希码时,我感到非常惊讶。 所以我对对象引用感到困惑。
请帮我理清这个基础。
该方法并不完全返回一个对象。它返回一个对象的引用。该对象 引用指的是在方法调用内部和外部保持相同。因为是同一个对象, 哈希码将是相同的。
str
在return str
时的值是对字符串“Hello World”的引用。回报
语句读取str
的值并将其保存为方法的返回值。
然后运行finally块,它有机会通过包含自己的内容来更改返回值 返回声明。更改 finally 块中
str
的值不会更改已设置的值
返回值,只有另一个 return 语句才会。
因为将
str
设置为null
没有效果,所以可以删除这样的语句。无论如何,一旦方法返回,它就会超出范围,因此它对垃圾收集没有帮助。
基于JLS 14.20.2 try-catch-finally的执行
If execution of the try block completes normally, then the finally block is executed, and then there is a choice: If the finally block completes normally, then the try statement completes normally. If the finally block completes abruptly for reason S, then the try statement completes abruptly for reason S.
希望这有帮助:)
Hashcode() 不是用于显示引用。相反,哈希码用于检查 2 个字符串是否彼此相等。请参考 http://docs.oracle.com/javase/6/docs/api/java/lang/String.html#hashCode()
返回该字符串的哈希码。 String 对象的哈希码计算如下 s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]
由于两个字符串具有相同的值,因此哈希码当然是相同的。
为了更好地理解它是如何工作的。
public static String getMessage() {
StringBuilder str = new StringBuilder("");
try {
str.append("Hello world");
System.out.println("Inside Try Block");
System.out.println("Hash code of str : "+str.hashCode());
return str.toString();
}
finally {
System.out.println("in finally block before");
str.append("null");
System.out.println("in finally block after");
}
}
输出将是:-
Inside Try Block
Hash code of str : 1791741888
in finally block before
in finally block after
Message : Hello world
Hash code of message : -832992604
我们可以看到,在我们修改
StringBuilder
之前,已经设置了要返回的内容。它不返回修改后的字符串。