String id=request.getParameter("id");id要用equals来判断

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));