在struts中   输入页面a.jsp   代码截取片段如下:
<form   action= "zifuchuan.do "   method= "post ">
<input   type= "text "   name= "name "> <input   type= "submit ">
</form>   在这里输入abcaction中的代码如下:
ZifuchuanForm   zifuchuanForm   =   (ZifuchuanForm)   form;
String   str1=(String)zifuchuanForm.getName();
String   str2= "abc ";
if(str1==str2){
return   mapping.findForward( "chenggong ");
}else   return   mapping.findForward( "shibai ");}
大家说是转入成功页面   还是失败页面   为了避免大家浪费时间
我可以告诉大家是失败页面   那么谁能告诉我真正的原因。

解决方案 »

  1.   

    常量池(constant   pool)指的是在编译期被确定,并被保存在已编译的.class文件中的一些数据。它包括了关于类、方法、接口等中的常量,也包括字符串常量。  看例1:  String   s0=”kvill”;  String   s1=”kvill”;  String   s2=”kv”   +   “ill”;  System.out.println(   s0==s1   );  System.out.println(   s0==s2   );  
    结果为:  true  true  首先,我们要知结果为道Java会确保一个字符串常量只有一个拷贝。  因为例子中的s0和s1中的”kvill”都是字符串常量,它们在编译期就被确定了,所以s0==s1为true;
    而”kv”和”ill”也都是字符串常量,当一个字符串由多个字符串常量连接而成时,它自己肯定也是字符串常量,
    所以s2也同样在编译期就被解析为一个字符串常量,所以s2也是常量池中”kvill”的一个引用。  所以我们得出s0==s1==s2;  用new   String()   创建的字符串不是常量,不能在编译期就确定,所以new   String()   创建的字符串不放入常量池中,它们有自己的地址空间。  看例2:  String   s0=”kvill”;  String   s1=new   String(”kvill”);  String   s2=”kv”   +   new   String(“ill”);  System.out.println(   s0==s1   );  System.out.println(   s0==s2   );  System.out.println(   s1==s2   );   结果为:  false  false  false  
    例2中s0还是常量池中”kvill”的应用,s1因为无法在编译期确定,所以是运行时创建的新对象”kvill”的引用,
    s2因为有后半部分new   String(“ill”)所以也无法在编译期确定,所以也是一个新创建对象”kvill”的应用;明白了这些也就知道为何得出此结果了。JVM为运行一个程序定义了几种数据区(Data   Area),包括:pc寄存器、JVM堆栈、堆、方法区(Method   Area)、
    运行时常量池(Runtime   Constant   Pool)以及本机方法堆栈(Native   Method   Stacks),这些数据区根据其生存期可以分为两种,
    一种就是和JVM的生存期相同(包括堆和方法区),一种和线程的生存期相同(其它的),和JVM生存期相同的数据区在JVM启动的时候被创建并在JVM退出的时候被销毁,
    而和线程生存期相同的数据区是每个线程一个的,他们在线程创建的时候被创建,在线程被销毁的时候被销毁。
    String   str= "Hello   World ";---〉运行时常量池
    String   str=new   String( "Hello   World ");---> 堆   
      

  2.   

    对比字符串用equals,不要用==
    ==对比的是地址,那两个字符串地址不同,当然不相等了而进入失败页面了.
      

  3.   

    str1有可能为空,所以实际操作的时候往往这么写。
    str2.equls(str1)
      

  4.   

    明显是2个对象吗,==比较是地址,equls比较是内容啊,至于为什么是2个对象你看下1楼的比较全哈
      

  5.   

    “==”比较的是两个变量的“值”;对于字符串变量(和其它的引用变量)来说,这个“值”实际为地址,指向字符串在存储空间中的位置;而此时这两个abc所处位置不同,所以“==”返回“flase”;如果想比较实际的值,而非地址。则可使用equals()方法。