String的一些蹊跷
字符串不属于基本类型,但是可以像基本类型一样,直接通过字面量赋值,当然也可以通过new来生成一个字符串对象。不过通过字面量赋值的方式和new的方式生成字符串有本质的区别:

通过字面量赋值创建字符串时,会优先在常量池中查找是否已经存在相同的字符串,倘若已经存在,栈中的引用直接指向该字符串;倘若不存在,则在常量池中生成一个字符串,再将栈中的引用指向该字符串。而通过new的方式创建字符串时,就直接在堆中生成一个字符串的对象(备注,JDK 7 以后,HotSpot 已将常量池从永久代转移到了堆中。),栈中的引用指向该对象。对于堆中的字符串对象,可以通过 intern() 方法来将字符串添加的常量池中,并返回指向该常量的引用。
Q:下列程序的输出结果:
String s1 = “abc”;  pool中生成值,s1的地址是pool值的地址
final String s2 = “a”;对于final字段,编译期直接进行了常量替换,而对于非final字段则是在运行期进行赋值处理的。
final String s3 = “bc”;对于final字段,编译期直接进行了常量替换,而对于非final字段则是在运行期进行赋值处理的。
String s4 = s2 + s3;JAVA1.6之后常量字符串的“+”操作,编译阶段直接会合成为一个字符串。
String s5="bc";
String s6=s2 + s5;
System.out.println(s1 == s4);true,因为final变量在编译后会直接替换成对应的值,所以实际上等于s4="a"+"bc",而这种情况下,编译器会直接合并为s4="abc",所以最终s1==s4。
System.out.println(s1 == s6);false,因为s5是运行时赋值,所以实际上是使用StringBuilder.append来完成"a"+s5的,会生成不同的对象。
String的一些蹊跷的更多相关文章
- Spring JdbcTemplate的queryForList(String sql , Class<T> elementType)易错使用--转载
		原文地址: http://blog.csdn.net/will_awoke/article/details/12617383 一直用ORM,今天用JdbcTemplate再次抑郁了一次. 首先看下这个 ... 
- Spring JdbcTemplate的queryForList(String sql , Class<T> elementType)返回非映射实体类的解决方法
		Spring JdbcTemplate的queryForList(String sql , Class<T> elementType)易错使用 一直用ORM,今天用JdbcTemplate ... 
- Torch-RNN运行过程中的坑 [2](Lua的string sub函数,读取中文失败,乱码?)
		0.踩坑背景 仍然是torch-rnn/LanguageModel.lua文件中的一些问题,仍然是这个狗血的LM:encode_string函数: function LM:encode_string( ... 
- 【手记】小心在where中使用NEWID()的大坑  【手记】解决启动SQL Server Management Studio 17时报Cannot find one of more components...的问题  【C#】组件分享:FormDragger窗体拖拽器  【手记】注意BinaryWriter写string的小坑——会在string前加上长度前缀length-prefixed
		[手记]小心在where中使用NEWID()的大坑 这个表达式: ABS(CHECKSUM(NEWID())) % 3 --把GUID弄成正整数,然后取模 是随机返回0.1.2这三个数,不可能返回其它 ... 
- Javascript中的string类型使用UTF-16编码
		2019独角兽企业重金招聘Python工程师标准>>> 在JavaScript中,所有的string类型(或者被称为DOMString)都是使用UTF-16编码的. MDN DOMS ... 
- 透过WinDBG的视角看String
		摘要 : 最近在博客园里面看到有人在讨论 C# String的一些特性. 大部分情况下是从CODING的角度来讨论String. 本人觉得非常好奇, 在运行时态, String是如何与这些特性联系上的 ... 
- JavaScript String对象
		本编主要介绍String 字符串对象. 目录 1. 介绍:阐述 String 对象的说明以及定义方式. 2. 实例属性:介绍 String 对象的实例属性: length. 3. 实例方法:介绍 St ... 
- ElasticSearch 5学习(9)——映射和分析(string类型废弃)
		在ElasticSearch中,存入文档的内容类似于传统数据每个字段一样,都会有一个指定的属性,为了能够把日期字段处理成日期,把数字字段处理成数字,把字符串字段处理成字符串值,Elasticsearc ... 
- [C#] string 与 String,大 S 与小 S 之间没有什么不可言说的秘密
		string 与 String,大 S 与小 S 之间没有什么不可言说的秘密 目录 小写 string 与大写 String 声明与初始化 string string 的不可变性 正则 string ... 
随机推荐
- 随鼠标移动的div
			<html> <head> <style type='text/css'> #d{ border:1px solid green; width:90px; heig ... 
- 360双击ctrl搜索可能会与firefox快捷键冲突
			最近使用火狐浏览器时有好几次要在网页上的对话框输入文字时出现问题,按下字母键直接跳出了firefox菜单选项,用鼠标重新定位到输入位置再打还是不行,照样会弹出菜单提示,如下图,这可能是有什么快捷键冲突 ... 
- Constructing Roads (MST)
			Constructing Roads Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u ... 
- HDU 3998 Sequence(经典问题,最长上升子序列)
			题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3998 解题报告:求一个数列的最长上升子序列,并求像这样长的不相交的子序列最多有多少个. 我用的是最简单 ... 
- Google Chrome浏览器调试入门————转载只为自己查看方便
			Google Chrome浏览器调试 作为Web开发人员,我为什么喜欢Google Chrome浏览器 [原文地址:http://www.cnblogs.com/QLeelulu/archive/20 ... 
- PHP 上传文件和读取文件崎岖路
			今天php上传文件和读取文件没有搞出来,全靠后来大神来帮忙,总结一下:主要涉及到一下几个方面,在ubuntu下mkdir文件夹的时候要注意权限问题,一般情况下php是以一个较低的权限去执行的,所以如果 ... 
- Matlab实现线性回归和逻辑回归: Linear Regression & Logistic Regression
			原文:http://blog.csdn.net/abcjennifer/article/details/7732417 本文为Maching Learning 栏目补充内容,为上几章中所提到单参数线性 ... 
- ASP注入靶机
			ASP: <% Dim Db,MyDbPath dim conn '可修改设置一:========================定义数据库类别,1为SQL数据库,0为Access数据库 ... 
- 最长公共子串 NYOJ 36
			http://acm.nyist.net/JudgeOnline/problem.php?pid=36 最长公共子序列 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 ... 
- 【Hibernate】Hibernate系列3之配置文件详解
			配置文件详解 3.1.配置文件 连接池性能优化:http://www.cnblogs.com/xdp-gacl/p/4002804.html 
