今天不知道怎么看了下string的==的问题,本身我觉得我这个水平去判断几个字符串相等还能出问题?呵呵,真的出了大问题,根本原因在于对java字节码的不了解。

首先,==运算符比较的是两个变量所指向的对象内存地址是否相同,相同则为true,不同则为false,因此问题变为分析字符串的内存地址是否相同;

(1)堆中的字符串对象和字符串常量池中的字符串

String s1 = "a";
String s2 = new String("a");
System.out.println(s1==s2);

结果为:false

原因:s1这种声明方式会在字符串常量池中新增一个“a”字符串对象,s2的声明方式则会在堆中创建一个"a"字符串对象;因此它们的内存地址并不同。

(2)堆中的两个字符串对象

String s1 = new String("a");
String s2 = new String("a");
System.out.println(s1==s2);

结果为:false

原因:两个不同对象的内存地址肯定不同。

(3)两个常量池中的字符串

String s1 = "a";
String s2 = "a";
System.out.println(s1==s2);

结果为:true

原因:字符串常量池的设计是这样:当往常量池中添加字符串时会先去判断是否已经有了此字符串,判断的方式为equals;因此s1、s2是引用的同一个字符串,内存地址相同。

(4)string.intern()方法

String s1 = "a";
String s2 = new String("a").intern();
System.out.println(s1==s2);

结果为:true

原因:intern方法会将字符串对象放入到常量池中,因此同(4)。

(5)变量和字符串相加

String s1 = "a";
String s2 = "b";
String s3 = "ab";
String s4 = s1+s2;
System.out.println(s3==s4);

结果为:false

原因:当对变量而不是字符串进行相加时,由于只知道字符串引用不知道具体的字符串值,jvm实际上是用StringBuilder的append方法完成的加操作,然后通过toString方法返回字符串的值,toString方法如下:

public String toString() {
// Create a copy, don't share the array
return new String(value, 0, count);
}

因此,原因同(1)。

情况还有就不列举了,只要去看java字节码就能明白为什么是这种情况,说到底,这些除了能帮助人理解java内存模型,其他什么用都没有,哦不,还能装逼。

java中String字符串的==解析的更多相关文章

  1. JAVA中String(字符串)课堂总结

    一:Java编译器中关于字符串自动优化 例子一: 源代码: public class StringPool { public static void main(String args[]) { Str ...

  2. Java中String字符串常量池总结

    最近到广州某建站互联网公司面试,当时面试官问假设有两个字符串String a="abc",String b = "abc";问输出a==b是true还是fals ...

  3. Java中String字符串常量池

    首先看一个例子,通过这个例子更能快速理解String常量池 public static void main(String[] args) { String a = "ab"; St ...

  4. java中String字符串

    一.定义String字符串 String字符串和char字符不同,char使用单引号,只能表示一个字符,字符串就是一段文本.String是个类.这个类使用final修饰,所以这个类是不可以继承扩充和修 ...

  5. java中String字符串的替换函数:replace与replaceAll的区别

    例如有如下x的字符串 String x = "[kllkklk\\kk\\kllkk]";要将里面的“kk”替换为++,可以使用两种方法得到相同的结果 replace(CharSe ...

  6. Java中String字符串toString()、String.valueOf()、String强转、+ ""的区别

    Object#toString(): Object object = getObject(); System.out.println(object.toString()); 在这种使用方法中,因为ja ...

  7. JAVA中String字符串比较equals()和equalsIgnoreCase()的区别

    标签: equals和equalsIgnoreC 2012-11-11 16:03 65644人阅读 评论(0) 收藏 举报  分类: JAVA(3)  1.使用equals( )方法比较两个字符串是 ...

  8. Java中的字符串操作(比较String,StringBuiler和StringBuffer)

    一.前言 刚开始学习Java时,作为只会C语言的小白,就为其中的字符串操作而感到震撼.相比之下,C语言在字节数组中保存一个结尾的\0去表示字符串,想实现字符串拼接,还需要调用strcpy库函数或者自己 ...

  9. Java中的字符串常量池

    ava中字符串对象创建有两种形式,一种为字面量形式,如String str = "droid";,另一种就是使用new这种标准的构造对象的方法,如String str = new ...

随机推荐

  1. C# ENUM 字符串输出功能

    public enum MeasurementType { Each, [DisplayText("Lineal Metres")] LinealMetre, [DisplayTe ...

  2. Pycharm 2018.2.1最新版破解到2099年图解教程

    我破解后的效果图 安装我就不说了 工具解压在随便一个目录(文末有下载百度网盘链接)在 Pycharm安装目录的\bin目录下找到 pycharm.exe.vmoptions 和 pycharm64.e ...

  3. SSH(Spring Struts2 Hibernate)框架整合(注解版)

    案例描述:使用SSH整合框架实现部门的添加功能 工程: Maven 数据库:Oracle 框架:Spring Struts2  Hibernate 案例架构: 1.依赖jar包 pom.xml < ...

  4. python飞机大战代码

    import pygame from pygame.locals import * from pygame.sprite import Sprite import random import time ...

  5. vue_过渡_动画

    过渡效果 <style> .xxxx-enter-active,         // 显示过渡 .xxxx-leave-active {        // 隐藏过渡 transitio ...

  6. SSM的 日常错误 之 mybatis

    HTTP Status 500 - Request processing failed; nested exception is org.mybatis.spring.MyBatisSystemExc ...

  7. ElasticSeaarch 遇到的问题 (-)

    1 elasticSearch 不能通过ip访问 智只能通过localhost访问,或者在外网部署的时候不能访问: elasticsearch.yml文件 中将下面的配置去掉注释符,  network ...

  8. monkey Test 环境配置

    Android Monkey压力测试学习笔记 步骤:下载SDK -> 解压进入SDK Manager下载系统 -> 配置环境变量 -> 创建虚拟设备或连接真机 -> 进入命令模 ...

  9. BZOJ 1053 - 反素数ant - [数论+DFS][HAOI2007]

    题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1053 题解: 可以证明,$1 \sim N$ 中最大的反质数,就是 $1 \sim N$ ...

  10. flask微服务框架的初步接触

    测试2个关联的系统接口时,经常会遇到被测试系统或被测app的处理内部处理流程会依赖另一个系统的接口返回结果,这时,常用的做法就是写一个模拟测试桩,用作返回请求时的结果.java可以用servicele ...