文档章节

java中“==”和equals方法的区别,再加上特殊的String引用类型

黑色code
 黑色code
发布于 2016/07/24 23:02
字数 632
阅读 7
收藏 1

==和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并没有!!       

© 著作权归作者所有

黑色code
粉丝 0
博文 5
码字总数 3203
作品 0
成都
程序员
私信 提问
Java 208 道面试题:Java 基础模块答案

目前市面上的面试题存在两大问题:第一,题目太旧好久没有更新了,还都停留在 2010 年之前的状态;第二,近几年 JDK 更新和发布都很快,Java 的用法也变了不少,加上 Java 技术栈也加入了很多...

王磊的博客
03/05
0
0
Java中关系操作符“==”和equals()方法的区别

一、前言 如果问你Java中==和equals()有何区别,相信你的第一反应会回答:==比较的是它们所指向的对象地址,而equals()方法比较的是它们的内容值。实际上,这样的回答是不全面的。 二、关系操...

Lienson
03/29
0
0
java面试题--基础知识(精化版)

版权声明:本文供交流学习,能够帮助到你是我最大的荣幸! https://blog.csdn.net/u014231523/article/details/89302178 1. JDK 和 JRE 有什么区别? JDK:Java Development Kit 的简称,Jav...

兴国First
04/14
0
0
每周10道Java面试题:String, String Pool, StringBuilder

本文作者:ImportNew -唐尤华 未经许可,禁止转载! 每周10道 Java 面试题由 ImportNew 整理编译自网络。 面试题答案讨论请移步:https://github.com/jobbole/java-interview/issues/1 Java...

ImportNew
2018/12/23
0
0
最最最常见的Java面试题总结-第一周

这里会分享一些出现频率极其极其高的面试题,初定周更一篇,什么时候更完什么时候停止。 Github地址:https://github.com/Snailclimb/Java-Guide/blob/master/面试必备/最最最常见的Java面试...

Amsour丶
2018/08/08
0
0

没有更多内容

加载失败,请刷新页面

加载更多

springmvc集成cas,并解决前后端分离情况

1.最近项目需要集成已经存在的cas系统。 但是目前已集成的系统都是jsp。而我们项目是前后端分离开发(伪),没有分开部署。 2.cas原理就不介绍了 网上例子很多。基本都是使用302重定向实现的...

起名字什么的太麻烦了
29分钟前
3
0
HDFS-原理

1. 写操作

叶枫啦啦
今天
2
0
聊聊elasticsearch的MembershipAction

序 本文主要研究一下elasticsearch的MembershipAction MembershipAction elasticsearch-6.7.1/server/src/main/java/org/elasticsearch/discovery/zen/MembershipAction.java public class M......

go4it
今天
3
0
Redis集群

Redis cluster tutorial Redis集群提供一种方式自动将数据分布在多个Redis节点上。 Redis Cluster provides a way to run a Redis installation where data is automatically sharded acros......

OSC首席混子
今天
3
0
AWS codecommit 触发jenkins工作

在gitlab和github上面都有直接发送webhook的配置,但是在AWS上面是没有的直接配置webhook触发jenkins构建的设置的。 通过查看AWS多个service的官方文档,找到了解决方案,方案如下: (1)在c...

守护-创造
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部