基于Java字符串 "==" 与 "equals" 的深入理解_java

虽然关于Java字符串“==”和“equals”的问题是Java学习中的最基础的一个问题,但是仍然有不少刚刚学习Java的同学搞不清楚里面的原理,最近和朋友讨论到这个问题,所以写篇文章给大家分享一下我自己的理解。
首先让我们看一个例子:

复制代码 代码如下:

    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 
    <div style="text-align: left;"></div>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。

 

时间: 2024-09-30 04:29:57

基于Java字符串 &quot;==&quot; 与 &quot;equals&quot; 的深入理解_java的相关文章

基于java集合中的一些易混淆的知识点(详解)_java

(一) collection和collections 这两者均位于java.util包下,不同的是: collection是一个集合接口,有ListSet等常见的子接口,是集合框架图的第一个节点,,提供了对集合对象进行基本操作的一系列方法. 常见的方法有: boolean add(E e) 往容器中添加元素:int size() 返回collection的元素数:boolean isEmpty() 判断此容器是否为空: boolean contains(Object o) 如果此collecti

基于Java Socket实现一个简易在线聊天功能(一)_java

先给大家说下实现步骤分这样几大步: 1.使用awt组件和socket实现简单的单客户端向服务端持续发送消息: 2.结合线程,实现多客户端连接服务端发送消息: 3.实现服务端转发客户端消息至所有客户端,同时在客户端显示: 4.把awt组件生成的窗口界面改成前端jsp或者html展示的界面,java socket实现的客户端改为前端技术实现. 这里首先实现第一步的简单功能,难点在于: 1.没有用过awt组件,没有用过java相关的监听事件: 2.长时间没有使用socket进行客户端和服务端的交互,并

基于JAVA中使用Axis发布/调用Webservice的方法详解_java

本示例和参考文章的差别在于: 1)deploy.wsdd定义的更详细(对于server端定义了接口:ICalculate): 复制代码 代码如下: <deployment xmlns="http://xml.apache.org/axis/wsdd/"    xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">    <service name="Calculate&qu

java web-&amp;amp;lt;c:forEach items=&amp;amp;quot;${salesProducts }&amp;amp;quot; var=&amp;amp;quot;pro&amp;amp;quot;&amp;amp;gt;

问题描述 <c:forEach items="${salesProducts }" var="pro"> ${pro.goodsName}特价:¥${pro}/c:forEach pro的bean类属性都设了getter和setter方法,但是${pro.goodsName}没值,${pro}却有值 解决方案 检查一下goodsName属性名称有没写错. 解决方案二: private String goodsName;public String getG

基于Java中字符串内存位置详解_java

前言 之前写过一篇关于JVM内存区域划分的文章,但是昨天接到蚂蚁金服的面试,问到JVM相关的内容,解释一下JVM的内存区域划分,这部分答得还不错,但是后来又问了Java里面String存放的位置,之前只记得String是一个不变的量,应该是要存放在常量池里面的,但是后来问到new一个String出来应该是放到哪里的,这个应该是放到堆里面的,后来又问到String的引用是放在什么地方的,当时傻逼的说也是放在堆里面的,现在总结一下:基本类型的变量数据和对象的引用都是放在栈里面的,对象本身放在堆里面,

基于java得web服务器实现[Z]

web|web服务|web服务器 基于Java的Web服务器工作原理1 一个 Web 服务器也被称为 HTTP 服务器,它通过 HTTP 协议与客户端通信.这个客户端通常指的是 Web 浏览器.一个基于 Java 的 Web 服务器用到二个重要的类,java.net.Socket 与 java.net.ServerSocket ,并通过 HTTP 消息通信.因此,本文从讨论 HTTP 与这二个类开始,然后我将解释一个与本文相关的简单的 Web 应用. The Hypertext Transfer

基于Java代码实现支付充值的通用流程_java

废话不多说了,直接给大家贴java代码了. 具体代码如下所示: /*支付流程*/ /****Controller.java 代码如下:*/ @RequestMapping(value = "/paySubmit.htm", method = RequestMethod.POST) public ModelAndView paySubmit(HttpServletRequest request, HttpServletResponse response, @RequestParam Ma

基于JAVA技术的搜索引擎的研究与实现

搜索引擎 摘要 网络中的资源非常丰富,但是如何有效的搜索信息却是一件困难的事情.建立搜索引擎就是解决这个问题的最好方法.本文首先详细介绍了基于英特网的搜索引擎的系统结构,然后从网络机器人.索引引擎.Web服务器三个方面进行详细的说明.为了更加深刻的理解这种技术,本人还亲自实现了一个自己的搜索引擎--新闻搜索引擎. 新闻搜索引擎是从指定的Web页面中按照超连接进行解析.搜索,并把搜索到的每条新闻进行索引后加入数据库.然后通过Web服务器接受客户端请求后从索引数据库中搜索出所匹配的新闻. 本人在介绍

基于Java的PHP框架

简介 Quercus 是一个开源 PHP 5 引擎,它已经拥有了纯 Java 的完整实现.Quercus 文档指出,Quercus 在 Resin 应用服务器之上运行,利用了负载平衡.代理缓存等 Resin 特性.本文介绍了在 Apache Tomcat 之上运行 Quercus 所提供的特性.另外,本文还将展示 Quercus 针对 Web 服务和应用程序的 "PHP + Java" 混合方法的易用性和灵活性. 为何选择 Quercus? Quercus PHP 库在 Java 中得