String、StringBuffer、int的地址不同,equals和=的比较不同

今天做了一个简单的登录界面,用到了struts框架,属性模型获取用户登录信息

 

1、新建项目struts,新建login.jsp页面,在根目录的WEB-INF文件夹里新建black文件夹,新建welcome.jsp页面,用于登陆成功后跳转。注:WEB-INF文件夹不能直接访问

1 <body>
2      <form action="logincheck.action" method="post">
3            账户:<input type="text" name="loginid"> 
4           密码:<input type="password" name="loginpwd">
5                   <input type="submit" value="提交">
6      </form>
7     ${message}
8 </body>

 

2、src目录下新建包com.login.entity,在包下新建LoginEntity.java

 

 1 public class LoginEntity {
 2     private String message;  
 3     private String loginid;
 4     private int loginpwd;
 5 
 6     
 7     //封装
 8     public String getMessage() {
 9         return message;
10     }
11 
12     public void setMessage(String message) {
13         this.message = message;
14     }
15 
16     public String getLoginid() {
17         return loginid;
18     }
19 
20     public void setLoginid(String loginid) {
21         this.loginid = loginid;
22     }
23 
24     public int getLoginpwd() {
25         return loginpwd;
26     }
27 
28     public void setLoginpwd(int loginpwd) {
29         this.loginpwd = loginpwd;
30     }
31 
32         public String logincheck(){
33             if("admin".equals(loginid) && "123".equals(loginpwd)){
34                 System.out.println("登陆成功!");  //在控制台打印,用于检测
35                 message="hello";
36                 return "success";       
37             }
38             else{
39                 System.out.println(loginid);
40                 System.out.println(loginpwd);
41  
42                 message="账户或密码输入错误,请重新输入";   //给message赋值
43                 System.out.println("登陆失败!");
44                 return "error";
45             }
46        }
47 }

3、创建Struts2,在src目录下struts.xml中配置

<struts> 
  <package name="default" namespace="/" extends="struts-default">
     <action name="logincheck" class="com.login.entity.LoginEntity" method="logincheck">
         <result name="success">/WEB-INF/black/welcome.jsp</result>
         <result name="error">/login.jsp</result>
    </action>
 </package>
</struts>

action中的method属性的值表示指定方法,如果不指定,就默认execute()方法。

result的name的属性值表示方法中的返回值。如果返回值是success,就跳转到welcome.jsp;返回值是error,则跳转到login.jsp;

 

4、在浏览器中输入地址,http://localhost:8080/struts/login.jsp

然后输入正确的账户密码,可是它直接跳到了错误页面,即跳回login.jsp页面,并且输出message

 

 

这里就出现了问题,多次检查后发现,

LoginEntity.java中的第33行中的判断语句应改为"admin".equals(loginid) && loginpwd==123

然后重新认识了一下equals和==的区别,注:我此处给定的loginid是string类型,loginpwd是int类型

 

String类非常特殊,此处应用的equals方法是String类的equals()方法。注:很多类有相同的方法名,但可能方法的具体操作不同,可以通过看源码来了解所用的方法。

 

equals和==的区别:

String类的equals()方法是先判断对象是不是String类型,再找到地址,判断其中的内容是否相同,相同返回true,不同返回false。

而   ==  的判断则是判断二者的地址是否相同

 

int、String、StringBuffer的区别:

1、声明变量;

String对象被放进常量池里了,再次出现相同的“asd”字符串的时候,JVM把b的引用也指向了"asd"的地址,所以a与b的地址相同;当出现不同的字符串,就得新分配地址空间,所以a与c的地址空间不同。int对象也是如此。

         

 1 public class StringTest {
 2 
 3     public static void main(String[] args) {
 4             int aa=8;
 5             int bb=8;
 6             int cc=9;   
 7            System.out.println(aa==bb); //打印结果为true
 8            System.out.println(aa==cc);  //false     
 9 
10            String a="abc";
11            String b="abc";
12            String c="xyz";  
13            System.out.println(a==b);//结果为true
14            System.out.println(a==c);//结果为false    
15        }
16 }          

2、new一个对象:碰到new关键字,都新划分内存空间,所以地址都会不同

3、拼接字符串:

int类型:int类型数据始终存储在常量池中。只要不是new的对象,一般都是先在变量池中找是否有相同的值,如果有相同的值,直接将变量指向相同值的地址。

String类型:一旦看到new关键字,JVM会在中为String分配空间。即便二者的值是相同的,也要新分配地址。拼接字符串也是新分配地址。

StringBuffer类型:存储跟String的相同,。二者不同之处,就是拼接。String类型是新分配地址,并且是将之前的值不变,所以两个变量的值和地址都不同。StringBuffer类型是直接在原地址上拼接,节省内存空间,所以拼接前后的两个变量都指向同一个地址。

               //int类型         
                    Integer aaa=new Integer(8);
                    Integer bbb=new Integer(8);
                    System.out.println(aaa==bbb);  //false

                    int ccc=aa+2;   //衔接上面的代码,aa=8
                    System.out.println(ccc);  //打印结果为10
                    System.out.println(aa==ccc);  //false
                    System.out.println(aa==aaa);  //true
                    System.out.println(ccc==10);  //true

                    
              //String类型
                    String aStr=new String("asd");
                    String bStr=new String("asd");
                    System.out.println(aStr==bStr);  //false
                    System.out.println(aStr.equals(bStr));//true

                    String cStr=bStr+"adad";  //拼接字符串
                    String dStr=new String();
                    dStr=bStr+"adad";
                    System.out.println(cStr==bStr);   //false
                    System.out.println(cStr==dStr);//false
                    System.out.println(aStr=="asd"); //fasle

                    
                //StringBuffer类型
                    StringBuffer aBuffer=new StringBuffer("A");
                    StringBuffer bBuffer=new StringBuffer("A");
                    System.out.println(aBuffer==bBuffer);

                    StringBuffer aBu = aBuffer.append("ad");   //拼接字符串
                    System.out.println(aBuffer); //Aad
                    System.out.println(aBu);     //Aad
                    System.out.println(aBu==aBuffer);  //true    
                    bBuffer.append("b");   
                    System.out.println(bBuffer); //Ab

 

转载于:https://www.cnblogs.com/lrmsmile/p/7257891.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值