`
像蜗牛一样奔跑
  • 浏览: 7656 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

java中equals和==区别小结

    博客分类:
  • Java
阅读更多

记得当初学java时,我预测考试会考equals 和 ==,没想预测成功了。然后,慢慢的,发现在用java语言的过程中,会经常用到,虽然用过了很多次,但有时还是会有点糊涂,加上前段时间一个同学笔试也问了这个,我就心想干脆总结一下:

 

首先搞清楚’equals‘方法是比较String对象的内容的,它不管你比较对象的地址,而’==‘是比较两者的值,比较的前提是双方式处于同一内存地址中,否者就算两者值是一样,比较的结果也是false

 

String str1 = "hello";
String str2 = "hello";
String str3 = new String("hello");
System.out.println(str1.equals(str3));
System.out.println(str1==str3);
System.out.println(str1==str2);

 上面这段代码中,str1和str2声明后将保存在一个叫做常量池的地方(在堆中分配出来的一块存储区域,用于存储显式的String,float或者integer.例如String str="hello"; 这个字符串是显式声明,所以存储在常量池),而str3直接在堆中开辟了一块新的地址,所以两者的地址是不一样。由于equals方法是不管比较对象的地址的,==比较的前提是在同一内存地址中(或者理解成同一对象),因此显而易见,程序运行结果就是:

true

false

 

true

 

ps:当你声明了一个String对象 String str = new String(),如果要判断str是否为空,不能通过str==null来判断,要用 str.length()==0 或者 str.isEmpty() 来判断,因为当你实例化一个对象后就会在内存分配空间,这个对象是实实在在存在的,只是这个空间里没有东西而已(我曾经被这个给坑惨过)。

 

前段时间一个室友笔试碰到了一个问题:

  1. Integer a = 127;  
  2. Integer b = 127;  
  3. System.out.println(a == b);  
  4. System.out.println(a.equals(b));  
  5. a = 128;  
  6. b = 128;  
  7. System.out.println(a == b);  
  8. System.out.println(a.equals(b)); 

上面这段程序的运行结果是:

true

true

false

true

为什么当a和b变成128时就不行了呢?

首先解读 Interger a = 127 这个声明相当于Interger.valueOf(127),查看valueOf的源代码:

/**
 * Returns a {@code Integer} instance for the specified integer value.
 * <p>
 * If it is not necessary to get a new {@code Integer} instance, it is
 * recommended to use this method instead of the constructor, since it
 * maintains a cache of instances which may result in better performance.
 *
 * @param i
*            the integer value to store in the instance.
 * @return a {@code Integer} instance containing {@code i}.
 * @since 1.5
 */
 public static Integer valueOf(int i) {
        return  i >= 128 || i < -128 ? new Integer(i) : SMALL_VALUES[i + 128];
    }

 可以看到,该方法的取值范围是-128-127,超出这个范围话取到的就不是同一对象了,这也就是为什么当a和b的值变成128时 a==b 就是false了。所以当比较整形值的时候,直接用int类型以避免这种情况的发生

 

希望这个对暂时有迷惑的同学能有所帮助,如果有说的不对的地方,欢迎指出纠正

 

 

分享到:
评论
2 楼 像蜗牛一样奔跑 2017-07-05  
切切歆语 写道
你学的Java?

都学了
1 楼 切切歆语 2017-04-16  
你学的Java?

相关推荐

    Java中equals与==的用法和区别

    Java中equals与==的用法和区别 Java 中的 equals 与 == 是两个常用的比较操作符,但是它们的用法和区别却非常重要。理解它们的差异是编写高效、正确的 Java 程序的关键。 什么是 == ? 在 Java 中,== 是一个比较...

    Java中==与equals的区别小结

    在Java编程语言中,了解`==`和`equals()`的区别是非常重要的,这涉及到对基本类型和对象的正确比较。下面我们将详细探讨这两个操作符的工作原理及其在不同情况下的使用。 首先,`==`操作符主要用于比较基本类型的...

    C#与java相似点和差异小结.doc

    以下是关于这两种语言相似点和差异的小结: 1. **源文件约定**: - **C#** 允许一个源文件(.cs)中包含多个顶级公共类,文件名不必与类名相同。 - **Java** 则要求每个源文件(.java)只能有一个顶级类,且文件名...

    java面试题(1).pdf

    而==和equals方法用于比较Java中的基本类型和引用类型,它们的比较逻辑和使用方式有所不同。另外,hashCode()方法和equals()方法虽然有关联,但是它们的关系并不意味着可以用hashCode()方法的结果直接推断equals()...

    java String类常用方法练习小结

    - **`"abc".equals("abc")` 与 `"abc" == "abc"` 的区别是什么?** - `equals()` 比较的是字符串内容是否相等,`==` 比较的是对象引用是否相同。 - **如何比较两个字符串忽略大小写?** - 使用 `equalsIgnoreCase...

    java笔试题小结

    ### Java笔试题小结 #### 1. Java 字符串(String) **问题**: String 类的特点是什么?与 StringBuffer 的区别? **分析与解答**: `String` 类在 Java 中是不可变的,即一旦创建了一个字符串对象,其内容就不能...

    实验5 JAVA常用类.doc

    实验5的Java常用类主要涵盖了Java编程中的一些核心概念和常用工具类的使用。以下是这些知识点的详细说明: 1. **String、StringBuffer(StringBuilder)**: - **String** 类在Java中是不可变的,这意味着一旦创建了...

    JAVA入门1.2.3:一个老鸟的JAVA学习心得 PART1(共3个)

    3.4 小结:基本数据类型—— Java中一切数据和运算的基础 63 3.5 习题 65 第4章 Java中的程序执行流程 67 教学视频:1小时57分钟 4.1 顺序执行 67 4.2 使用if-else让程序懂得判断 68 4.2.1 if语句 68 4.2.2 ...

    Java完美编程影印版(第三版)

    ### 小结 通过上述章节的学习,我们了解到Java是一种功能强大且广泛应用的编程语言。无论是从语言基础、数据类型、运算符还是编程风格等方面,Java都为程序员提供了一套全面且灵活的工具。掌握这些基础知识对于...

    疯狂JAVA讲义

    6.2.2 ==和equals比较运算符 172 6.3 类成员 175 6.3.1 理解类成员 175 6.3.2 单例(Singleton)类 176 6.4 final修饰符 177 6.4.1 final变量 177 6.4.2 final方法 181 6.4.3 final类 182 6.4.4 不可变类 ...

    JavaJava%BEE软件工程师就业求职手册.doc

    - **1.4 本章小结**:总结了本章的主要内容,并强调了作为Java软件工程师在求职过程中需要注意的关键点。 #### 第二部分:Java试题篇 ##### 第2章 Java编程基础 - **2.1 Java概述和开发环境** - **2.1.1 理解...

    Java入门1·2·3:一个老鸟的Java学习心得.PART3(共3个)

    3.4 小结:基本数据类型—— Java中一切数据和运算的基础 63 3.5 习题 65 第4章 Java中的程序执行流程 67 教学视频:1小时57分钟 4.1 顺序执行 67 4.2 使用if-else让程序懂得判断 68 4.2.1 if语句 68 4.2.2 ...

    有关jave基本类的学习小结

    理解`equals()`方法和`==`运算符的区别对于编写高质量的Java代码至关重要。在比较对象时,如果需要基于对象的属性进行判断,而非内存位置,应该在子类中覆盖`equals()`方法并同时重写`hashCode()`方法以保持一致性,...

    湖北汽车工业学院Java实验一 Java编程环境使用

    #### 小结 本实验旨在帮助学生掌握Java开发环境的搭建与使用,理解Java语言的基础知识和String类的使用技巧。通过实践操作,学生不仅能够熟悉Java的开发流程,还能加深对面向对象编程的理解。这对于进一步学习更复杂...

    21天学通Java-由浅入深

    162 8.5.8 重写equals方法 163 8.6 final与继承的关系 164 8.7 abstract与继承的关系 165 8.8 什么是多态 166 8.9 什么是枚举类 168 8.10 什么是反射机制 169 8.11 什么是泛型 170 8.12 综合练习 172 8.13 小结 172 ...

    java异常分类

    #### 四、小结 理解并正确处理Java中的异常对于编写健壮、可靠的应用程序至关重要。通过了解各种异常的特性和如何有效地捕获和处理异常,可以显著提高程序的质量和稳定性。希望本文介绍的几种常见的运行时异常能够...

    Java精华(免费版)

     小结一下:   * Runtime exceptions:   在定义方法时不需要声明会抛出runtime exception;   在调用这个方法时不需要捕获这个runtime exception;   runtime exception是从java.lang....

Global site tag (gtag.js) - Google Analytics