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 ...
随机推荐
- ant gradle curl等工具原理以及使用记录
1.ant是早一些的java 项目配置管理工具. 2.gradle是比maven还新的项目配置管理工具. 3.curl可以方便进行网络测试.curl可以方便用来http请求测试,支持各种命令,从这个角 ...
- 2017-2018 ACM-ICPC, NEERC, Northern Subregional Contest
A. Auxiliary Project 完全背包. #include<stdio.h> #include<iostream> #include<string.h> ...
- # Do—Now——团队冲刺博客_总结篇
Do-Now--团队冲刺博客_总结篇 目录 博客链接 作者 1. 第一篇(领航篇) @仇夏 2. 第二篇 @侯泽洋 3. 第三篇 @仇夏 4. 第四篇 @周亚杰 5. 第五篇 @唐才铭 6. 第六篇 ...
- Echarts跟随容器自适应大小问题
窗口大小改变市echarts图表常常会溢出,这时候会很难看,于是查看文档和百度下后,有如下解决方案: var myChart = echarts.init(document.getElementByI ...
- HttpHandler和ashx使用Session 出现未初始化异常
原因: HttpHandler和ashx要实现IRequiresSessionState接口才能访问Session信息 接口IRequiresSessionState: 指定目标 HTTP 处理程序需 ...
- 51nod 1617 奇偶数组
传送门 回来看一眼51nod,发现自己掉到rank4了,赶紧切道题回rank3. 一眼不会做,这种东西应该慢慢找规律吧……然后看到数据范围其实比较小,应该是单次log的,那是不是可以分治啊. #inc ...
- centos6.5安装ganglia-gmond
安装过程借鉴许多博客,最后得出没有出错的流程. 一.安装依赖包: yum -y install gccglibc glibc-common rrdtool rrdtool-devel apr apr- ...
- __x__(44)0910第六天__表单
form表单: form必须属性:action,指定一个服务器地址. 若希望表单中的数据发送给服务器,必须设置name属性. 用户填写的信息,将会追加在url地址?后面,以查询字符串的形式发送给服务器 ...
- vue_简介_渐进式 js 框架_内置指令_自定义指令_自定义插件
vue 尤雨溪 华裔 Google 工程师 遵循 MVVM 模式 编码简洁,体积小,运行效率高,适合 移动 / PC 端 开发 动态构建用户界面: 异步获取后台数据,展现到页面 渐进式 js 框架 渐 ...
- Red hat查找命令所属的rpm包
当安装命令软件包时,很多时候命令名不一定就是软件包的名字 如scp命令,其命令名就和软件包名字不一样,直接安装会失败: #yum install scp .... Trying other mirro ...