java中字符串的存储
在java中,不同的字符串赋值方法,其所在的地址可能不同也就导致,两个字符串的值看似相等可是在s1==s2操作时,其结果返回的却是false
例:
String s1 = "Programming";
String s2 = new String("Programming");
String s5 = "Program" + "ming";
System.out.println(s1 == s2); //返回值为false
System.out.println(s1 == s5);//返回值为true
其原因就与java中内存分配的机制有关:而当一个字符串被定义时,会先到常量池中寻找,如果常量池中有这个字符串,则地址直接指向常量池中字符串,如常量池中不存在则将其放入到常量池中;
关于java的内存分配机制:
https://www.cnblogs.com/dingyingsi/p/3760730.html
http://blog.csdn.net/tutngfei1129287460/article/details/7383480
例:
//常量池中本来就不含有jva字符,所以new的jva会放入常量池,属于同一个对象,返回true 先new一个SringBuffer对象,此时单独开辟一个区域,然后调用append方法
//拼接字符串(相当于对字符串的拼接而不是new的对象了),将拼接完成的字符串放入常量池,此时new出来的对象就是需要放入常量池的,返回true
String s1 = new StringBuilder("j").append("va").toString();
System.out.println(s1.intern()==s1);//true //常量池中本身就有字符串java所以返回的并不是同一个字符串 s2.intern()返回常量池中的
//java s2为new的字符所以不相等返回false
String s2 = new StringBuilder("ja").append("va").toString();
System.out.println(s2.intern()==s2);//false //返回false因为new出来的对象单独开辟一块区域放在java堆中,与常量池中的不同和
String s3 = new StringBuilder("Programming").toString();
System.out.println(s3.intern()==s3);//false
public static void main(String[] args){
String s1 = "Programming";
String s2 = new String("Programming");
String s3 = "Program";
String s4 = "ming";
String s5 = "Program" + "ming";
String s6 = s3 + s4;
String s7 = new StringBuilder("Programming").toString();
String s8 = new StringBuilder("Program").append("ming").toString();
System.out.println(s1 == s2); //false s1被赋予字符串Programming后发现常量池中并没有这一字符串,就将其
//放入常量池
System.out.println(s1 == s5);//true //字符串的+操作其本质是创建了StringBuilder对象进行append操作,
//然后将拼接后的StringBuilder对象用toString方法处理成String对象,s5拼接完成后发现常量池中已经有字符串Programming
//所以s5直接取常量池中的字符串所以返回true
System.out.println(s1 == s6);//false 这个暂时没搞懂
System.out.println(s1 == s5.intern());//true
System.out.println(s1 == s6.intern());//true
System.out.println(s2 == s2.intern());//false 因为s2 new了一个字符串对象,在堆中单独开辟一块区域,并不是常量池
//中对象 所以返回false
System.out.println(s7.intern()==s7);//false //返回false因为new出来的对象单独开辟一块区域放在java堆中,与常量池中的不同
System.out.println(s8.intern()==s8);///false 这个单独执行时是true 放在这里一起执行是false,个人推测
//是因为常量池中已经存在字符串Programming,而s8是new出来的,他拼接完成之后,其地址与常量池中字符串的地址
//不同,返回false
}
java中字符串的存储的更多相关文章
- 三张图彻底了解Java中字符串的不变性
转载: 三张图彻底了解Java中字符串的不变性 定义一个字符串 String s = "abcd"; s中保存了string对象的引用.下面的箭头可以理解为"存储他的引用 ...
- Java中字符串string的数据类型
Java中字符串string的数据类型 时间:2017-07-03 08:01:47 YuanMxy 原文:https://blog.csdn.net/YuanMxy/article/details/ ...
- java中字符串的非空判断
问题如下:在java 中 字符串为null 如何判断String str;if(str==null) ??str.equal("null") ?? 答:我觉得应该搞清楚字符串对象和 ...
- java中字符串String 转 int(转)
java中字符串String 转 int String -> int s="12345"; int i; 第一种方法:i=Integer.parseInt(s); 第二种方法 ...
- 【转】Java中字符串中子串的查找共有四种方法(indexof())
原文网址:http://wfly2004.blog.163.com/blog/static/1176427201032692927349/ Java中字符串中子串的查找共有四种方法,如下:1.int ...
- Java中字符串中子串的查找共有四种方法(indexof())
Java中字符串中子串的查找共有四种方法(indexof()) Java中字符串中子串的查找共有四种方法,如下:1.int indexOf(String str) :返回第一次出现的指定子字符串在此字 ...
- JAVA中字符串函数subString的用法小结
本篇文章主要是对JAVA中字符串函数subString的用法进行了详细的介绍,需要的朋友可以过来参考下,希望对大家有所帮助 String str; str=str.substring(int begi ...
- Java中字符串的一些常见方法
1.Java中字符串的一些常见方法 /** * */ package com.you.model; /** * @author Administrator * @date 2014-02-24 */ ...
- Java中字符串indexof() 的使用方法
Java中字符串中子串的查找共有四种方法(indexof())indexOf 方法返回一个整数值,指出 String 对象内子字符串的开始位置.如果没有找到子字符串,则返回-1.如果 startind ...
随机推荐
- MySQL 索引 视图 触发器 存储过程 函数
1.索引 索引相当于图书的目录,可以帮助用户快速的找到需要的内容. 数据库利用各种各样的快速定位技术,能够大大提高查询效率.特别是当数据量非常大,查询涉及多个表时,使用索引往往能使查询速度加快成千上万 ...
- php程序员应该掌握的技能包
作为一名web开发者来说,不论是php还是java web,就我目前掌握的知识来说,个人认为应该掌握以下几个方面的内容 1 基础的编程语言,这个好像是废话 2 软件设计的思想,如面向对象.mvc.各种 ...
- Alex and broken contest CodeForces - 877A
/* Name: Copyright: Author: Date: 2018/5/2 10:45:16 Description: 要求出现一个朋友的名字,仅一次 */ #include <ios ...
- ThinkPHP中的find和select的区别
ThinkPHP作为PHP中应用广泛又好用的框架,能比较快速的开发MVC架构的管理系统,获得了大量的应用.但是在ThinkPHP中select()和find()方法有什么区别呢? 事实上find()返 ...
- 滑雪(经典DP思想)
个人心得:思想还是不够,开始自己写但是不知道如何记录长度,也不太知道状态的转移,后面看了百度, 发现人人为我我为人人就是一步一步推导, 而递归思想就要求学会记录和找到边界条件,这一题中的话就是用递归, ...
- bzoj 3709: [PA2014]Bohater 贪心
题目: 在一款电脑游戏中,你需要打败\(n\)只怪物(从\(1\)到\(n\)编号).为了打败第\(i\)只怪物,你需要消耗\(d_i\)点生命值,但怪物死后会掉落血药,使你恢复\(a_i\)点生命值 ...
- Real-Time Rendering (2) - 变换和矩阵(Transforms and Matrics)
http://blog.csdn.net/silangquan/article/details/9970673 提要 在图形的计算中,比如旋转.缩放.平移.投影等操作,矩阵都扮演着极其重要的角色,它是 ...
- 洛谷P4721 【模板】分治 FFT(分治FFT)
传送门 多项式求逆的解法看这里 我们考虑用分治 假设现在已经求出了$[l,mid]$的答案,要计算他们对$[mid+1,r]$的答案的影响 那么对右边部分的点$f_x$的影响就是$f_x+=\sum_ ...
- div+css制作带箭头提示框效果图(原创文章)
一直都在看站友们的作品,今天也来给大家分享一个小的效果,第一次发还有点小紧张呢,语言表达能力不是很好,还请见谅…^ 先来个简单点的吧,上效果图 刚开始在网上看到效果图的时候感觉好神奇,当我试着写出来的 ...
- 自己写的highcharts级联(点击事件)
$.fn.extend({ Zhu: function (option) { var id = $(this).attr("id"); $('#' + id).highcharts ...