String id2="aa";
id2==id =false;
id是一个String对象
怎么判断一个String是在常量池还是在堆中?
Stirng id3=new String("aa");不是应该id3才在堆中吗?
永远都用equals,不要考虑是不是在常量池
js中用==,Java中用equals,至于怎么判断是不是在常量池中这种理论性的东西太麻烦了
楼主你判断是否在常量池的目的是什么?
在Java中,有几个概念需要理解,编译时,运行时,字面常量,引用。使用==操作符,比较的是引用,不是比较真正的变量的内容,如果要比较内容就得使用equals,而String id2="aa"; id2是一个字面常量,是在编译时确定的,Stirng id3=new String("aa"); id3在是运行时才确定的, 而且new关键字本身在堆中分配内存,Java中有虚拟机的存在,获得真正的内存地址还是比较难的,所以理解好上面几个概念和关键字,就可以理解原理了
String strA = "1";
String strB = new String("1");
java.lang.reflect.Field field = sun.misc.Unsafe.class.getDeclaredField("theUnsafe");
field.setAccessible(true);
sun.misc.Unsafe unsafe = (sun.misc.Unsafe) field.get(null);
long numL = unsafe.arrayBaseOffset(String[].class);
System.out.println(unsafe.addressSize());
System.out.println(unsafe.getLong(new String[] {strA}, numL));
System.out.println(unsafe.getLong(new String[] {strB}, numL));
System.out.println(unsafe.getLong(new String[] {strB.intern()}, numL));