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. Struts2 OGNL案例

    一>>原始类型与包装类型 先定义两个实体类User和Address User package cn.entity; public class User { private String n ...

  2. [Unity3D]深度相机 Depth Camera

    作为3D世界里最重要的窗口,摄像机的应用就显得很重要,毕竟在屏幕上看到的一切都得用摄像机矩阵变换得来的嘛.论坛上看到了一篇帖子讲非天空盒的背景做法,让我想起其实很多界面合成画面可以用摄像机之间的交互来 ...

  3. git放弃本地修改 强制更新

    git fetch --all git reset --hard origin/mastergit fetch 只是下载远程的库的内容,不做任何的合并 git reset 把HEAD指向刚刚下载的最新 ...

  4. linux 下 sudo 指令不需要输入密码的配置

    sudo的配置文件位于 /etc/sudoers 里面.具体操作如下: 打开sudoers文件. bo@engineer ~/ $ sudo nano /etc/sudoers 假定你的用户名为  m ...

  5. Autofac手动注入及自动注入示例

    参考:http://www.cnblogs.com/xinchuang/archive/2013/05/07/3065433.html#2911661 一.环境 vs2012.mvc4..Net Fr ...

  6. 2016网络大事记 mark

    记录2016年每天的大事件. 2016年01月07日     快播庭审.辩护人各种出彩. 2016年01月09日     乐视多个贴吧被爆.百度出面平息. 2016年01月10日     斗鱼TV造人 ...

  7. 2016-2017-2《程序设计与数据结构》学生博客&git@OSC

    2016-2017-2<程序设计与数据结构>学生博客&git@OSC 博客园 20162301张师瑜 20162302杨京典 20162303石亚鑫 20162304张浩林 201 ...

  8. 图片轮播图插件的使用 unslider!!!

    1.百度图片轮播图unslider,第一个就会出现jquery unslider轮播图,点击进去,下载网站提供的文件,解压,内部有我们需要使用的各种js,图片等. 2.在自己的eclipse或者int ...

  9. 关于Unity的网络框架

    注:Unity 5.1里引入了新的网络框架,未来目标应该是WOW那样的,现在还只是个P2P的架子. 网络的框架,无非是如何管理网络数据的收发,通信双方如何约定协议.之前做的框架与GameObject无 ...

  10. Java中getResourceAsStream的用法

    首先,Java中的getResourceAsStream有以下几种: 1. Class.getResourceAsStream(String path) : path 不以'/'开头时默认是从此类所在 ...