==和equals的区别:

1.==是运算符,而equals是基类Object定义的一个方法,并且equals使用==定义的

2.进行比较时,分为  基本数据类型  的比较和  引用数据类型 的比较

基本数据类型:两者都是比较的

引用数据类型:两者比较的是在栈内存中的地址

3.特殊的:对于像String这种对equals方法进行重写的引用数据类型,equals比较的是,而不是地址了。


特殊的String:

java程序在运行时,会创建一个字符串缓冲池,当使用s1=“abc”这样的表达式创建字符串时,程序首先会在这个String缓冲池中寻找相同值的对象,如果有就将该s1的引用指向这个已经存在的对象;

当用String s2 = new String(“abc”)时,他明确告诉程序要一个“新的”,于是一个新的"abc"Sting对象被创建在内存中。s1 和 s2 的值相同但是位置不同。

s2 = s2.intern();使用这条语句后,它做了个小动作:检查字符串缓冲池里是否存在"abc"这么一个字符串,如果存在,就返回池里的字符串的引用;如果不存在,该方法会把"abc"添加到字符串缓冲池中,然后再返回它的引用。

参考博客:http://www.cnblogs.com/zhxhdean/archive/2011/03/25/1995431.html


对于下面的代码:

String s1 = "abc";

String s2 = "a" + "bc";

System.out.prinln(s1==s2);

结果输出:true        原因是:常量进行计算,在编译时就可以确定其值,这也和字符串缓冲池的内容是在编译时确定的原理一致,所以输出为true;

但对于下面的代码:

String s1 = "a";

String s2 = "abc";

String s3 = s1 + "bc";

System.out.prinln(s2==s3);

结果输出:false    原因是:s1是变量,编译时无法确定其值,故不会去查询字符串缓冲池,而是运行时在堆上为其分配空间(“abc”),所以s2和s3的对象地址不同,故为false;


还有一点需要时刻记得:

String类是不可变的,也就是说,String对象一旦创建无法改变,如果需要频繁使用字符串连接操作,应该使用StringBuilder(JDK1.5以前使用StringBuffer)来代替String,另外String类重写了equals方法,而StringBuilder和StringBuffer并没有!!

java中“==”和equals方法的区别,再加上特殊的String引用类型的更多相关文章

  1. Java中“==”与equals方法的区别

    1. 用“==”比较两个变量,如果两个变量是基本类型变量,且都是数值类,则值相等就返回true 如果两个变量是引用型变量,则两个对象的地址一样,即指向同一个对象,则返回true 2.equals:St ...

  2. 【转】彻底弄懂Java中的equals()方法以及与"=="的区别

    彻底弄懂Java中的equals()方法以及与"=="的区别 一.问题描述:今天在用Java实现需求的时候,发现equals()和“==”的功能傻傻分不清,导致结果产生巨大的偏差. ...

  3. 关于Java中的equals方法

    关于Java中的equals方法 欢迎转载,但是请填写本人的博客园原址https://www.cnblogs.com/JNovice/p/9347099.html 一.什么是equals方法 equa ...

  4. 一文搞懂--Java中重写equals方法为什么要重写hashcode方法?

    Java中重写equals方法为什么要重写hashcode方法? 直接看下面的例子: 首先我们只重写equals()方法 public class Test { public static void ...

  5. JAVA中“==”与equals()方法区别

    equals 方法是 java.lang.Object 类的方法 有两种用法说明: ()对于字符串变量来说,使用"=="和"equals()"方法比较字符串时, ...

  6. 如何在Java中避免equals方法的隐藏陷阱

    摘要 本文描述重载equals方法的技术,这种技术即使是具现类的子类增加了字段也能保证equal语义的正确性. 在<Effective Java>的第8项中,Josh Bloch描述了当继 ...

  7. java中的equals方法

    这个方法首先比较的是两个对象的地址是否相同,如果相同直接返回true, 否则, (1)如果是string类型的先比较是否是string类型,是的话,再比较是否长度相同,相同的话再比较,每个字符是否相同 ...

  8. C#中==与Equals方法的区别

    using System;using System.Collections.Generic;using System.Linq;using System.Text; namespace Console ...

  9. JAVA中复写equals方法

    在JAVA中“==”用于比较两个引用对象的地址是否相同.但是如果我们想比较两个对象的内容是否相同,通常会覆写equals方法.equals方法用来比较两个对象的内容是否相等. package org. ...

随机推荐

  1. 【转载】详解 $_SERVER 函数中QUERY_STRING和REQUEST_URI区别

    实例:1,http://localhost/aaa/ (打开aaa中的index.php)结果:$_SERVER['QUERY_STRING'] = "";$_SERVER['RE ...

  2. access登录窗口校验代码一

    Private Sub login_Click()If IsNull(Me.username) ThenMsgBox "请输入用户名!", vbExclamationElseIf ...

  3. JavaScript 很长很长的JS

    var BaiduUsers = [], WechatUsers = []; var User = function(id, name, phone, gender, age, salary) { t ...

  4. java安装及设置环境变量

    目录: java安装 (找不到或无法加载主类 com.sun.tools.javac.Main) 设置环境变量 maven安装及环境变量设置 1. java安装 情景:不使用默认安装 问题:cmd-j ...

  5. TypeError: can't compare offset-naive and offset-aware datetimes bugfix

    参考:https://docs.djangoproject.com/en/1.8/topics/i18n/timezones/#naive-and-aware-datetime-objects 起因: ...

  6. 最优Django环境配置

    2 最优Django环境配置 本章描述了我们认为对于中等和高级Django使用者来说最优的本地环境配置 2.1 统一使用相同的数据库引擎 一个常见的开发者错误是在本地开发环境中使用SQLite3,而在 ...

  7. Java并发-取消与关闭

    如果外部代码可以再某个操作正常完成之前就将其置入"完成"状态,那么这个操作就是可以取消的.取消的原因有:用户请求取消.有时间限制的操作.应用程序事件.错误和关闭等 中断 如果使用某 ...

  8. require.js配置路径的用法和css的引入

    前端开发在近一两年发展的非常快,JavaScript作为主流的开发语言得到了前所未有的热捧.大量的前端框架出现了,这些框架都在尝试着解决一 些前端开发中的共性问题,但是实现又不尽相同.通常一般的前端加 ...

  9. 服务治理利器Hystrix-理论篇

    引言 现在的大中型应用,很多都在朝着服务化.分布式的方向发展.这有多方面的考虑,比如说,方便治理.便于扩展.服务隔离等等.不过在带来如此多利好的同时,不可避免的也会带来麻烦,比如系统架构复杂.服务依赖 ...

  10. 使用opencv调用24*24点阵字库和8*16ASCII字库在图片显示文字数字

    课程实验:编程读汉字点阵字库,把自己的名字和学号叠加到图片的右下位置. 主要步骤分为三部分 第一部分:读取图片(文件读取) 第二部分:读取文字并从字库中提取相应的编码(字库的存储原理) 第三部分:将相 ...