有时候也会面试别人,也会被别人面试,问题基本上都会牵扯到String案例,例子都会牵扯到hashcode、equal这些,但是回答的时候基本上是照本宣科的方式应付,今天给大家普及下一些基础String JVM memory internals,以便于大家能够在基础方面有点不一样回答,给面试官留下深刻印象。
因为在类的编译中会使用到javap -c -verbose,最好大家能够预先普及下知识Understanding javap’s output for the Constant Pool。
也有涉猎到基本的抽象树的一些知识,如果不知道可以通过插件方式安装,挺简单的。地址plugin:
jdtview - http://www.eclipse.org/jdt/ui/update-site
如图:
Java code
String str1 = "abc";
String str2 = "abc";
String str3 = "abc3";
Class constant pool
每个类都有自己的 constant pool ,它包括了strings, numbers, method names等。
Javap -c -verbose TestClass.class
constant pool 条目中只存在了abc和abc3这是非常重要的依据
Byte code
HashCode
java的代码
import java.lang.reflect.Field;
public class TestClass {
public static void main(String[] args) throws Exception {
String str1 = "abc";
String str2 = "abc";
String str3 = "abc";
System.out
.println("str1.value: " + showInternalCharArrayHashCode(str1));
System.out
.println("str2.value: " + showInternalCharArrayHashCode(str2));
System.out.println("str1" + System.identityHashCode(str1));
System.out.println("str2" + System.identityHashCode(str2));
}
private static int showInternalCharArrayHashCode(String s) throws Exception {
final Field value = String.class.getDeclaredField("value");
value.setAccessible(true);
return value.get(s).hashCode();
}
}
print:
str1.value: 23660326
str2.value: 23660326
str15538765
str25538765
现在代码改变为
String str1 = "abc";
String str2 = "abc";
String str = new String("abc");
Javap -c -verbose TestClass.class
很明显看到新生成对象,且调用了默认的构造函数
HashCode
str1.value: 23660326
str2.value: 23660326
str15538765
str210039797
what a amazing!
为何下面一对的结果是不一致,明显是两个不同对象啊?可以参考String(String)
constructor works
public String(String original) {
this.offset = original.offset;
this.count = original.count;
this.value = original.value;
}
Runtime modification and intern()
String str1 = "abc";
String str2 = "?abc".substring(1);
str1.value: 23660326
str2.value: 5538765
str110039797
str227189676
明显不一样的两个对象
Java Code
String str1 = "abc";
String str2 = "?abc".substring(1);
str2 = str2.intern();
str1.value: 23660326
str2.value: 23660326
str15538765
str25538765
通过intern,对象的值和引用又捆绑在一起。想知道答案吗?
a string that has the same contents as this string, but is guaranteed to be from a pool of unique strings.
不知道对于初学者或者在应聘中被问到过该问题的童鞋有没有帮助?请给予反馈