java中“==”和equals方法的区别,再加上特殊的String引用类型
==和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引用类型的更多相关文章
- Java中“==”与equals方法的区别
1. 用“==”比较两个变量,如果两个变量是基本类型变量,且都是数值类,则值相等就返回true 如果两个变量是引用型变量,则两个对象的地址一样,即指向同一个对象,则返回true 2.equals:St ...
- 【转】彻底弄懂Java中的equals()方法以及与"=="的区别
彻底弄懂Java中的equals()方法以及与"=="的区别 一.问题描述:今天在用Java实现需求的时候,发现equals()和“==”的功能傻傻分不清,导致结果产生巨大的偏差. ...
- 关于Java中的equals方法
关于Java中的equals方法 欢迎转载,但是请填写本人的博客园原址https://www.cnblogs.com/JNovice/p/9347099.html 一.什么是equals方法 equa ...
- 一文搞懂--Java中重写equals方法为什么要重写hashcode方法?
Java中重写equals方法为什么要重写hashcode方法? 直接看下面的例子: 首先我们只重写equals()方法 public class Test { public static void ...
- JAVA中“==”与equals()方法区别
equals 方法是 java.lang.Object 类的方法 有两种用法说明: ()对于字符串变量来说,使用"=="和"equals()"方法比较字符串时, ...
- 如何在Java中避免equals方法的隐藏陷阱
摘要 本文描述重载equals方法的技术,这种技术即使是具现类的子类增加了字段也能保证equal语义的正确性. 在<Effective Java>的第8项中,Josh Bloch描述了当继 ...
- java中的equals方法
这个方法首先比较的是两个对象的地址是否相同,如果相同直接返回true, 否则, (1)如果是string类型的先比较是否是string类型,是的话,再比较是否长度相同,相同的话再比较,每个字符是否相同 ...
- C#中==与Equals方法的区别
using System;using System.Collections.Generic;using System.Linq;using System.Text; namespace Console ...
- JAVA中复写equals方法
在JAVA中“==”用于比较两个引用对象的地址是否相同.但是如果我们想比较两个对象的内容是否相同,通常会覆写equals方法.equals方法用来比较两个对象的内容是否相等. package org. ...
随机推荐
- c语言,文件操作总结
C语言文件操作 一.标准文件的读写 1.文件的打开 fopen() 文件的打开操作表示将给用户指定的文件在内存分配一个FILE结构区,并将该结构的指针返回给用户程序,以后用户程序就可用此FILE指针来 ...
- SQL SERVER 锁资源问题
1204: cannot obtain a LOCK resource 在sql server 锁资源的限制基本是自动优化调整.如果调整过参数,可能在系统大批量查询的时候出现以上错误,或者是 alwa ...
- Django-CKedtior图片找不到的问题
从Django Packages站点上找到这个CKeditor集成组件:https://github.com/shaunsephton/django-ckeditor 按照官方的install方法安装 ...
- XYC2016上半年工作笔记整理
只要团队在,做那个方向都可能 这个产品的用户群人均价值高 第一次产品介绍会议就介绍了产品的初期全部目标功能 传统互联网人的产品思路比较偏媒体内容服务特性. 产品转化率高说明了其发展势头 任何一个形式变 ...
- Django单元测试简明实践
1.准备数据模式,Django空库测试需要所有相关数据模式必须在Django中定义,说白了,model不能有managed=Fasle,为了解决这个问题,你必须得有一个managed全部为True的S ...
- HDU-5705
Clock Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others) Problem De ...
- windows10不能修改hosts解决方案(亲测)
hosts文本解释: 有时候我们要破解一些软件与服务器通讯,所以通常都需要更改Hosts文件来达到目的,XP系统可以直接修改保存,但是Win10系统却提示没有权限去修改,那么我们要怎样办呢,我们修改的 ...
- nginx配置 location及rewrite规则详解
1. location正则写法 语法规则: location [=|~|~*|^~] /uri/ { … } = 开头表示精确匹配 ^~ 开头表示uri以某个常规字符串开头,理解为匹配 url ...
- jdbc连接阿里云服务器上的MySQL数据库 及 数据库IP限制
问题1:Jdbc 如何连接阿里云服务器上的MySQL数据库? 解决: 上截图: 其中IP是阿里云服务器的公网IP地址. 问题2: 刚开始接手开发的时候,使用Navicat连接阿里云服务器上的数据后 ...
- 【转】Python的下划线
原文: 1. Python中的下划线(译文) 2. [转]关于python中带下划线的变量和函数的意义 总结: 1. 单下划线开头.保护变量,不可被其他包导入使用,除非在__all__声明可以显示引用 ...