java中String字符串的==解析
今天不知道怎么看了下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字符串的==解析的更多相关文章
- JAVA中String(字符串)课堂总结
一:Java编译器中关于字符串自动优化 例子一: 源代码: public class StringPool { public static void main(String args[]) { Str ...
- Java中String字符串常量池总结
最近到广州某建站互联网公司面试,当时面试官问假设有两个字符串String a="abc",String b = "abc";问输出a==b是true还是fals ...
- Java中String字符串常量池
首先看一个例子,通过这个例子更能快速理解String常量池 public static void main(String[] args) { String a = "ab"; St ...
- java中String字符串
一.定义String字符串 String字符串和char字符不同,char使用单引号,只能表示一个字符,字符串就是一段文本.String是个类.这个类使用final修饰,所以这个类是不可以继承扩充和修 ...
- java中String字符串的替换函数:replace与replaceAll的区别
例如有如下x的字符串 String x = "[kllkklk\\kk\\kllkk]";要将里面的“kk”替换为++,可以使用两种方法得到相同的结果 replace(CharSe ...
- Java中String字符串toString()、String.valueOf()、String强转、+ ""的区别
Object#toString(): Object object = getObject(); System.out.println(object.toString()); 在这种使用方法中,因为ja ...
- JAVA中String字符串比较equals()和equalsIgnoreCase()的区别
标签: equals和equalsIgnoreC 2012-11-11 16:03 65644人阅读 评论(0) 收藏 举报 分类: JAVA(3) 1.使用equals( )方法比较两个字符串是 ...
- Java中的字符串操作(比较String,StringBuiler和StringBuffer)
一.前言 刚开始学习Java时,作为只会C语言的小白,就为其中的字符串操作而感到震撼.相比之下,C语言在字节数组中保存一个结尾的\0去表示字符串,想实现字符串拼接,还需要调用strcpy库函数或者自己 ...
- Java中的字符串常量池
ava中字符串对象创建有两种形式,一种为字面量形式,如String str = "droid";,另一种就是使用new这种标准的构造对象的方法,如String str = new ...
随机推荐
- C# ENUM 字符串输出功能
public enum MeasurementType { Each, [DisplayText("Lineal Metres")] LinealMetre, [DisplayTe ...
- Pycharm 2018.2.1最新版破解到2099年图解教程
我破解后的效果图 安装我就不说了 工具解压在随便一个目录(文末有下载百度网盘链接)在 Pycharm安装目录的\bin目录下找到 pycharm.exe.vmoptions 和 pycharm64.e ...
- SSH(Spring Struts2 Hibernate)框架整合(注解版)
案例描述:使用SSH整合框架实现部门的添加功能 工程: Maven 数据库:Oracle 框架:Spring Struts2 Hibernate 案例架构: 1.依赖jar包 pom.xml < ...
- python飞机大战代码
import pygame from pygame.locals import * from pygame.sprite import Sprite import random import time ...
- vue_过渡_动画
过渡效果 <style> .xxxx-enter-active, // 显示过渡 .xxxx-leave-active { // 隐藏过渡 transitio ...
- SSM的 日常错误 之 mybatis
HTTP Status 500 - Request processing failed; nested exception is org.mybatis.spring.MyBatisSystemExc ...
- ElasticSeaarch 遇到的问题 (-)
1 elasticSearch 不能通过ip访问 智只能通过localhost访问,或者在外网部署的时候不能访问: elasticsearch.yml文件 中将下面的配置去掉注释符, network ...
- monkey Test 环境配置
Android Monkey压力测试学习笔记 步骤:下载SDK -> 解压进入SDK Manager下载系统 -> 配置环境变量 -> 创建虚拟设备或连接真机 -> 进入命令模 ...
- BZOJ 1053 - 反素数ant - [数论+DFS][HAOI2007]
题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1053 题解: 可以证明,$1 \sim N$ 中最大的反质数,就是 $1 \sim N$ ...
- flask微服务框架的初步接触
测试2个关联的系统接口时,经常会遇到被测试系统或被测app的处理内部处理流程会依赖另一个系统的接口返回结果,这时,常用的做法就是写一个模拟测试桩,用作返回请求时的结果.java可以用servicele ...