Java中==运算符与equals方法的区别及intern方法详解

Java中==运算符与equals方法的区别及intern方法详解

1.  ==运算符与equals()方法
2. hashCode()方法的应用
3. intern()方法

/*
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)

相关推荐

  • 浅谈java中==以及equals方法的用法

    equals 方法是 java.lang.Object 类的方法. 有两种用法说明: (1)对于字符串变量来说,使用"=="和"equals()"方法比较字符串时,其比较方法不同. "=="比较两个变量本身的值,即两个对象在内存中的首地址. "equals()"比较字符串中所包含的内容是否相同. 比如: String s1,s2,s3 = "abc", s4 ="abc" ; s1 =

  • Java编程中的equals方法使用全解

    通过下面的例子掌握equals的用法 package cn.galc.test; public class TestEquals { public static void main(String[] args) { /** * 这里使用构造方法Cat()在堆内存里面new出了两只猫, * 这两只猫的color,weight,height都是一样的, * 但c1和c2却永远不会相等,这是因为c1和c2分别为堆内存里面两只猫的引用对象, * 里面装着可以找到这两只猫的地址,但由于两只猫在堆内存里面存

  • java中hashCode方法与equals方法的用法总结

    首先,想要明白hashCode的作用,必须要先知道Java中的集合. 总的来说,Java中的集合(Collection)有两类,一类是List,再有一类是Set. 前者集合内的元素是有序的,元素可以重复:后者元素无序,但元素不可重复. 那么这里就有一个比较严重的问题了:要想保证元素不重复,可两个元素是否重复应该依据什么来判断呢? 这就是Object.equals方法了.但是,如果每增加一个元素就检查一次,那么当元素很多时,后添加到集合中的元素比较的次数就非常多了. 也就是说,如果集合中现在已经有

  • java必学必会之equals方法

    一.equals方法介绍 1.1.通过下面的例子掌握equals的用法 package cn.galc.test; public class TestEquals { public static void main(String[] args) { /** * 这里使用构造方法Cat()在堆内存里面new出了两只猫, * 这两只猫的color,weight,height都是一样的, * 但c1和c2却永远不会相等,这是因为c1和c2分别为堆内存里面两只猫的引用对象, * 里面装着可以找到这两只猫

  • Java 中的vector和list的区别和使用实例详解

    要了解vector,list,deque.我们先来了解一下STL. STL是Standard Template Library的简称,中文名是标准模板库.从根本上说,STL是一些容器和算法的集合.STL可分为容器(containers).迭代器(iterators).空间配置器(allocator).配接器(adapters).算法(algorithms).仿函数(functors)六个部分.指针被封装成迭代器,这里vector,list就是所谓的容器. 我们常常在实现链表,栈,队列或者数组时,

  • Java中==运算符与equals方法的区别及intern方法详解

    Java中==运算符与equals方法的区别及intern方法详解 1.  ==运算符与equals()方法 2. hashCode()方法的应用 3. intern()方法 /* Come from xixifeng.com Author: 习习风(StellAah) */ public class AboutString2 { public static void main(String[]arsgs) { String myName="xixifeng.com"; String

  • java 中模拟UDP传输的发送端和接收端实例详解

    java 中模拟UDP传输的发送端和接收端实例详解 一.创建UDP传输的发送端 1.建立UDP的Socket服务: 2.将要发送的数据封装到数据包中: 3.通过UDP的Socket服务将数据包发送出去: 4.关闭Socket服务. import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; public class

  • Java中的数组复制(clone与arraycopy)代码详解

    JAVA数组的复制是引用传递,而并不是其他语言的值传递. 1.clone protectedObjectclone() throwsCloneNotSupportedException创建并返回此对象的一个副本."副本"的准确含义可能依赖于对象的类.这样做的目的是,对于任何对象x,表达式: x.clone()!=x为true,表达式: x.clone().getClass()==x.getClass()也为true,但这些并非必须要满足的要求.一般情况下: x.clone().equa

  • Java中静态类型检查是如何进行的实例思路详解

    以下内容来自维基百科,关于静态类型检查和动态类型检查的解释: •静态类型检查:基于程序的源代码来验证类型安全的过程: •动态类型检查:在程序运行期间验证类型安全的过程: Java使用静态类型检查在编译期间分析程序,确保没有类型错误.基本的思想是不要让类型错误在运行期间发生. 以下代码是一个例子,理解了他,你会更好的理解Java静态类型检查是如何工作的. 代码示例 假定我们有如下类,A和B,B继承A. class A { A me() { return this; } public void do

  • java中栈和队列的实现和API的用法(详解)

    在java中要实现栈和队列,需要用到java集合的相关知识,特别是Stack.LinkedList等相关集合类型. 一.栈的实现 栈的实现,有两个方法:一个是用java本身的集合类型Stack类型:另一个是借用LinkedList来间接实现Stack. 1.Stack实现 直接用Stack来实现非常方便,常用的api函数如下: boolean        isEmpty() // 判断当前栈是否为空 synchronized E        peek() //获得当前栈顶元素 synchro

  • Java中lombok的@Builder注解的解析与简单使用详解

    Lombok中@Builder用法 1.建造者模式简介:Builder 使用创建者模式又叫建造者模式.简单来说,就是一步步创建一个对象,它对用户屏蔽了里面构建的细节,但却可以精细地控制对象的构造过程. 2.注解类Builder.java注释: * The builder annotation creates a so-called 'builder' aspect to the class that is annotated or the class  * that contains a mem

  • JAVA 中实现整句汉字拆分、转换为ASCII实例详解

    JAVA 中实现整句汉字拆分.转换为ASCII实例详解 大家都知道,一个汉字等于两个byte的大小.二进制数据通过网络传输时,如果两个byte都超过128则会合并成一个Unicode(汉字)字符,本文的代码主要实现的功能是:把这些汉字拆分为byte,然后重新变为ASCII类型的字符串. public static String ChineseToASCII(byte[] rec) { //从字节读取内容 ByteArrayInputStream bais = new ByteArrayInput

  • java中抽象类、抽象方法、接口与实现接口实例详解

    前言 对于java中的抽象类,抽象方法,接口,实现接口等具体的概念就不在这里详细的说明了,网上书本都有很多解释,主要是我懒,下面通过一个例子来说明其中的精髓要点,能不能练成绝世武功,踏上封王之路,就看自己的的啦(不要误会,我指的只是我自己啦啦) 用接口实现一个简单的计算器 1.利用接口做参数,写个计算器,能完成+-*/运算 (1)定义一个接口Compute含有一个方法int computer(int n,int m); (2)设计四个类分别实现此接口,完成+-*/运算 (3)设计一个类UseCo

  • Java中的日期和时间类以及Calendar类用法详解

    Java日期和时间类简介 Java 的日期和时间类位于 java.util 包中.利用日期时间类提供的方法,可以获取当前的日期和时间,创建日期和时间参数,计算和比较时间. Date 类 Date 类是 Java 中的日期时间类,其构造方法比较多,下面是常用的两个: Date():使用当前的日期和时间初始化一个对象. Date(long millisec):从1970年01月01日00时(格林威治时间)开始以毫秒计算时间,计算 millisec 毫秒.如果运行 Java 程序的本地时区是北京时区(

随机推荐