如何尝试......最终在内部工作
How try...finally works internally
目前我正在使用 try..finally 块来优化我的对象。
但是当我在 finally 块中创建对对象的空引用时,我对如何管理对象 return 感到困惑。 ??
当return在try块中调用一个对象时,它会在编译过程中创建一个预编译语句吗?或者在涉及 return 语句时在堆中创建新引用?或者只是 return 对象的当前引用?
下面是我的研究代码。
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());
}
}
输出为:
Inside Try Block
Hash code of str : -832992604
in finally bolck before
in finally block after
Message : Hello world
Hash code of message : -832992604
当我看到 returning 对象和调用对象具有相同的哈希码时,我感到非常惊讶。
所以我对对象引用感到困惑。
请帮我弄清楚这个基础。
Hashcode() 不用于显示引用。相反,哈希码用于检查 2 个字符串是否彼此相等。请参考http://docs.oracle.com/javase/6/docs/api/java/lang/String.html#hashCode()
Returns a hash code for this string. The hash code for a String object is computed as
s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]
既然两个字符串都具有相同的值,那么哈希码当然是相同的。
基于JLS 14.20.2 Execution of 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.
希望对您有所帮助:)
该方法不完全是 return 一个对象。它 return 是对对象的引用。该对象
引用是指在方法调用内外保持不变。因为是同一个对象,
哈希码将相同。
str
在 return str
时的值是对字符串 "Hello World" 的引用。 return
语句读取 str
的值并将其保存为方法的 return 值。
然后 finally 块是 运行,它有机会通过包含自己的改变 return 值
return 语句。在 finally 块中更改 str
的值不会更改已设置的值
return 值,只有另一个 return 语句会。
因为设置str
到null
没有效果,你可以去掉这样的语句。一旦方法 returns 无论如何,它就会超出范围,因此它对垃圾收集没有帮助。
目前我正在使用 try..finally 块来优化我的对象。
但是当我在 finally 块中创建对对象的空引用时,我对如何管理对象 return 感到困惑。 ??
当return在try块中调用一个对象时,它会在编译过程中创建一个预编译语句吗?或者在涉及 return 语句时在堆中创建新引用?或者只是 return 对象的当前引用?
下面是我的研究代码。
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());
}
}
输出为:
Inside Try Block
Hash code of str : -832992604
in finally bolck before
in finally block after
Message : Hello world
Hash code of message : -832992604
当我看到 returning 对象和调用对象具有相同的哈希码时,我感到非常惊讶。 所以我对对象引用感到困惑。
请帮我弄清楚这个基础。
Hashcode() 不用于显示引用。相反,哈希码用于检查 2 个字符串是否彼此相等。请参考http://docs.oracle.com/javase/6/docs/api/java/lang/String.html#hashCode()
Returns a hash code for this string. The hash code for a String object is computed as s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]
既然两个字符串都具有相同的值,那么哈希码当然是相同的。
基于JLS 14.20.2 Execution of 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.
希望对您有所帮助:)
该方法不完全是 return 一个对象。它 return 是对对象的引用。该对象 引用是指在方法调用内外保持不变。因为是同一个对象, 哈希码将相同。
str
在 return str
时的值是对字符串 "Hello World" 的引用。 return
语句读取 str
的值并将其保存为方法的 return 值。
然后 finally 块是 运行,它有机会通过包含自己的改变 return 值
return 语句。在 finally 块中更改 str
的值不会更改已设置的值
return 值,只有另一个 return 语句会。
因为设置str
到null
没有效果,你可以去掉这样的语句。一旦方法 returns 无论如何,它就会超出范围,因此它对垃圾收集没有帮助。