灯火互联
管理员
管理员
  • 注册日期2011-07-27
  • 发帖数41778
  • QQ
  • 火币41290枚
  • 粉丝1086
  • 关注100
  • 终身成就奖
  • 最爱沙发
  • 忠实会员
  • 灌水天才奖
  • 贴图大师奖
  • 原创先锋奖
  • 特殊贡献奖
  • 宣传大使奖
  • 优秀斑竹奖
  • 社区明星
阅读:2853回复:0

Java==运算符与equals方法的区别及intern方法的正确使用

楼主#
更多 发布于:2012-09-08 09:46

本篇主要内容:
1.  ==运算符与equals()方法
2. hashCode()方法的应用
3. intern()方法
(本篇末尾会做一个总结)
[java]
/*
Come from xixifeng.com
Author: 习习风(StellAah)
*/
public class AboutString2  
{
    public static void main(String[]arsgs)
    {
        String myName="xixifeng.com";
        String myName3="xixifeng";  
        String myName4=".com";
        String myName5=myName3+myName4;
        String myName6="xixifeng.com";
        
        if(myName==myName5)
        {
            
            System.out.println("myName==myName5");
        }
        else
        {
            System.out.println("myName="+myName);
            System.out.println("myName5="+myName5);
            System.out.println("myName!=myName5");
        }
        //经运行打印出: myName!=myName5
        
        if(myName==myName6)
        {
            System.out.println("myName==myName6");
        }
        else
        {
            System.out.println("myName!=myName6");
        }
        //经运行得出:  myName!=myName5,myName==myName6
        
        //myName,myName5(myName5的值是由myName3+myName4得到的),myName6 这三个对象的值是相等的, 为什么 它们之间用==进行运算的结果是 myName!=myName5,myName==myName6呢?
        //原因在于==运算符
        //显然==参与String运算中不是用来比较值的,而是用来比较对象是否相等的.
        //那么在String运算中,通过什么方法来比较它们的值是否相等呢,java 提供了equals()方法 ,主要用于比较对象的值是否相等
        //示例如下:
        //myName==myName5 是false (不是同一个对象)
        if(myName.equals(myName5))
        {
            System.out.println("myName.equals(myName5) 比较的结果是true !");
        }
        else
        {
            System.out.println("myName.equals(myName5) 比较的结果是false !");
        }
        //经运行输出:myName.equals(myName5) 比较的结果是true ! 在由于myName与myName5不是同一个对象,充分说明:
        //equals()方法[是用来比较对象的值是否相等]
        
        //再抛出疑问:是不是两个对象的哈希值相等就说明这两个对象相等呢?
        //(由上述测试myName==myName5 得出false ①表明myName与myName5不是同一个对象)
        System.out.println(myName.hashCode());
        System.out.println(myName5.hashCode());
        //经测试 ②myName与myName5的哈希值相等
        //由①,② 得出: 两个对象的hashCode值相等,不能表明其对象也相等.

        //抛出疑问: 怎样使myName与myName5的对象相等呢?
        //引入intern()方法
        myName5=myName5.intern();
        if(myName==myName5)
        {
            
            System.out.println("(myName==myName5) 得true");
        }
        else
        {
            System.out.println("(myName==myName5) 得false");
        }
        //经运行打印出: (myName==myName5) 得true
        //结论: intern()方法能使两个(对象不相等而值相等的)对象变得相等
        //myName5.intern();的意思,可以解释为: myName5在内存中查找对象嫁给自己,条件是,该对象要与自己的值相等. 找到了,就指定该对象.
        //myName5找到对象,并认定,就不必再创建对象了,所以说这样做,可以节约内存资源.
        
        //抛出疑问: 什么样的对象建议使用intern()呢?
        // myName="xixifeng.com" myName6="xixifeng.com", myName与myName6的对象是相等的,上述已经证实.
        // 所以说,对象在直接赋予同样的值的时候没有必要用intern().
        //myName="xixifeng.com" myName5=myName3+myName4,它们的值相等,但是对象不相等,上述已经证实.
        //所以说, 对象在间接赋予(有可能与已有对象)同样的值的时候,建议用一下intern()方法,从而可公用内存中存在的对象.
        
        
        //==参与int型运算中,也营造类似的比较
        int i=8;
        int j=3;
        int k=5;
        int m=j+k;
        int n=8;
        if(i==m)
        {
            System.out.println("i="+i);
            System.out.println("m="+m);
            System.out.println("i==m");
        }
        else
        {
            System.out.println("i!=m");
        }
        
        if(i==n)
        {
            System.out.println("... ... ... ...");
            System.out.println("i="+i);
            System.out.println("n="+n);
            System.out.println("i==n");
        }
        else
        {
            System.out.println("i!=n");
        }
        //经运行得出i=m(m的值由j+k得到),i=n
        //i,m,n的值都相等 , 由于i==m 得出true i==n得出true  
        //所以可以得出结论: ==参与非对象类型运算时,是用来比较常量的值是否相等      
    }
}
综上所属,得出如下结论:
1) ==运算符参与对象类型运算时是用来比较对象是否想得的.
2) ==运算符参与非对象类型运算时是用来比较值是否相等的.
3) equals()方法用于比较两个对象的值是否相等
4) 两个对象的hashCode()值相等,并不代表其对象也相等
5) intern()方法能使两个(对象不相等而值相等的)对象变得相等,从而可以公用内存已有的对象,这样做可以节约内存资源.
6) 对象在间接赋予(有可能与已有对象)同样的值的时候,建议用一下intern()方法,从而可公用内存中存在的对象.



喜欢0 评分0
游客

返回顶部