demo:

    public class TestStringEquals {  

        public static void main(String[] args) {  

            String a = "test";
String b = "test";
String c = new String("test");
String d = new String("test");
String e = a;
String f = new String(a);
String g = a + "";
System.out.println(a == b ? "expression \"a==b\" is true"
: "expression \"a==b\" is false");
System.out.println(a == c ? "expression \"a==c\" is true"
: "expression \"a==c\" is false");
System.out.println(c == d ? "expression \"c==d\" is true"
: "expression \"c==d\" is false");
System.out.println(a == e ? "expression \"a==e\" is true"
: "expression \"a==e\" is false");
System.out.println(a == f ? "expression \"a==f\" is true"
: "expression \"a==f\" is false");
System.out.println(a == g ? "expression \"a==g\" is true"
: "expression \"a==g\" is false");
if (a.equals(b) && b.equals(c) && c.equals(d) && d.equals(e)
&& e.equals(f) && f.equals(g)) {
System.out
.println("a equals b equals c equals d equals e equals f equals g");
}
} }

运行结果如下:

    expression "a==b" is true
expression "a==c" is false
expression "c==d" is false
expression "a==e" is true
expression "a==f" is false
expression "a==g" is false
a equals b equals c equals d equals e equals f equals g

要很好的理解这种题目,最好的办法就是深入理解Java中String的“==”方法和“equals”方法的机制和原理。“equals”想必大家都知道,就是比较字符串的内容,由于以上程序中的所有字符串内容都是“test”,所以用equals比较它们都会相等。

但是你是否知道Java中基类Obejct的equals方法跟“==”方法其实是一致的呢?只不过是String类继承Object类(Java中所有的类都是继承Object类的)后,重载了equal的方法,使得其成为了比较字符串中的内容。很好的理解了equals之后,现在让我们来研究一下“==”方法的扑朔迷离。

“==”是Java中的运算符,它比较的内容是两个对象的指针,也就是实际对象的地址。因此很容易理解e==a是返回true的。
我们再来看下c和d之间的比较,看到new关键词,说明c和d都是重新申请了一块内存地址,然后里面赋值为“test”,所以c==d返回的是false。同理都可以理解,a,c,d,f之间的“==”操作都返回的是false。

然后再来看看g= a + “”,虽然没有看到new关键词,但是由于String类“+”操作符被重载之后,重载的方法之中一定会重新new一个String,所以也就变成了上面的情况。那么最难理解的就是a和b的比较了,其实这是Java编译器的优化所带来的结果,java编译器有一个叫字符串常量池的存储区域,由于String a = "test"这条语句编译之后,“test”就会存储在这个字符串常量池中,那么再定义b的时候,b仍然指向这块区域,所以说a和b指向的仍然是同一块区域。所以a==b返回的true。

java基础 字符串 “==” 和 “equals” 比较的更多相关文章

  1. Java基础-字符串(String)常用方法

    Java基础-字符串(String)常用方法 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.java的API概念 Java的API(API:Application(应用) Pr ...

  2. Java基础-字符串连接运算符String link operator

    Java基础-字符串连接运算符String link operator 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 字符串链接运算符是通过“+”进行拼接的. 一.使用“+”进行字 ...

  3. Java String字符串/==和equals区别,str。toCharAt(),getBytes,indexOf过滤存在字符,trim()/String与StringBuffer多线程安全/StringBuilder单线程—— 14.0

    课程概要 String 字符串 String字符串常用方法 StringBuffer StringBuilder String字符串: 1.实例化String对象 直接赋值  String str=& ...

  4. [Java基础]字符串

    1.字符串特点 字符串是常量,创建之后不能修改: 字符串的内容一旦修改,就会马上创建一个新的对象: 字符串实际为一个char value[]={'a','a'};数组: 2.==与equal判断字符串 ...

  5. [Java 基础]字符串

    String类 实例化String对象 String 对象初始化方式有多种. 如下代码中,各种初始化方式的效果是一样的,初始化后,String 对象的内容为 "hello" . p ...

  6. [转]java基础学习总结——equals方法

    一.equals方法介绍 1.1.通过下面的例子掌握equals的用法 1 package cn.galc.test; 2 3 public class TestEquals { 4 public s ...

  7. java基础---字符串string

    1.字符创的概念 java字符串就是Unicode字符序列.例如,串“Java\u2122”由5个Unicode字符J.a.v.a和TM.java没有内置的字符串类型,而是在标准库Java类库中提供了 ...

  8. Java基础——字符串String

    String类 1. String类位于java.lang包中,使用时无需导包. 2. 创建字符串的两种方式: ① 直接指定(字面量声明):String str = "abc"; ...

  9. java基础(十六)----- equals()与hashCode()方法详解 —— 面试必问

    本文将详解 equals()与hashCode()方法 概述 java.lang.Object类中有两个非常重要的方法: public boolean equals(Object obj) publi ...

随机推荐

  1. flush和reflush

    /** * jpa 中的reflush 同 hibernate 中 Session 的 refresh 方法. * * reflush 会强制发送sql查询(select)语句,使缓存中的数据和数据库 ...

  2. MyBatis入门案例、增删改查

    一.MyBatis入门案例: ①:引入jar包 ②:创建实体类 Dept,并进行封装 ③ 在Src下创建大配置mybatis-config.xml <?xml version="1.0 ...

  3. spring初次体验

    1.BeanFactory:实际上是实例化,配置和管理众多bean的容器.这些bean通常会彼此合作,因而它们之间会相互依赖.BeanFactory使用的配置数据可以反映这些依赖关系中(一些依赖可能不 ...

  4. AutoMapper用法

    可在每层这样写一个类,整合每个实体类的映射 public class AutoMapperHelper { public static void Register() { Mapper.Initial ...

  5. IO(三)----序列流

    SequenceInputStream 表示其他输入流的逻辑串联.它从输入流的有序集合开始,并从第一个输入流开始读取,直到到达文件末尾,接着从第二个输入流读取,依次类推,直到到达包含的最后一个输入流的 ...

  6. Intellij Idea中的Jetty报出Web application not found src/main/webapp错误的解决方案

    今天在Intellij Idea中编译项目的时候,运行起来一直会报出如下的错误: Web application not found src/main/webapp 当时感觉应该是什么文件缺少了.所以 ...

  7. 【LeetCode】241. Different Ways to Add Parentheses

    Different Ways to Add Parentheses Given a string of numbers and operators, return all possible resul ...

  8. web前端开发最佳实践笔记

    一.文章开篇 由于最近也比较忙,一方面是忙着公司的事情,另外一方面也是忙着看书和学习,所以没有时间来和大家一起分享知识,现在好了,终于回归博客园的大家庭了,今天我打算来分享一下关于<web前端开 ...

  9. 关于把.net 2.0的项目升级到.net4.0遇到的一些问题

    进入公司实习的的第一个项目又是是一个升级项目.这次升级的是一个c/s架构的项目. 大致介绍一下这个项目的结构客户端采用winform+devexpress商业控件开发的,数据库是用的oracle数据库 ...

  10. 备忘:mybatis 3的使用记录

    这是一篇记录.mybatis是一个部分模仿ORM的framework.是一个介于ORM和原始JDBC的框架.既可以提供ORM的操作对象的特性,又能从详细地控制最终的SQL.达到一个平衡.我们还是得写s ...