java - String 浅谈
/**
* String s1 = "a";
* 编译器会先检查常量池中是否已经有"a":
* 如果没有,则在常量池先创建,后引用.
* 如果有,则直接引用;
* 所以执行该语句,会产生0个或1个对象.
* 这里,会创建1个对象.
*/
String s1 = "a";
/**
* String s2 = new String("a");
* 编译器先在堆中创建一个对象,然后去常量池中检查是否已有"a":
* 如果没有,则先在常量池创建,然后将堆中的引用指向常量池的对象;
* 如果有,则直接将堆中的引用指向常量池中的对象;
* 所以执行该语句,会产生1个或2个对象.
* 这里,会创建1个对象.
*/
String s2 = new String("a");
System.out.println(s1==s2); //false
以上代码,在jvm简单内存图可简述为:

而以上==比较的会是对象的地址,所以结果为false
另外:
String hello = "Hello", lo = "lo";
System.out.print((hello == "Hello") + " "); //true.
System.out.print((Other.hello == hello) + " "); //true.
System.out.print((spt.common.use.str.other.Other.hello == hello) + " "); //true.
//使用反编译器查看,发现编译器已将"Hel"+"lo"编译为Hello
System.out.print((hello == ("Hel"+"lo")) + " "); //true.
//将变量和字符串使用连接符连接,在运行期才会创建,存储在堆中.
System.out.print((hello == ("Hel"+lo)) + " "); //false.
//调用intern方法,首先会到字符串常量池中查找,若已有,则不再创建,直接将引用指向常量池的对象.
System.out.println(hello == ("Hel"+lo).intern()); String a = "a";
//两侧都会在运行期间在堆中创建对象.
System.out.println((a + "b") == (a + "b")); //false.
java - String 浅谈的更多相关文章
- 【推荐】JAVA基础◆浅谈3DES加密解密
国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...
- C++ string (浅谈)
浅谈string <string> typedef basic_string<char> string; 本篇主要内容是简单地介绍 string类 在竞赛方面较实用的一些功能, ...
- Java中Integer和String浅谈
Java中的基本数据类型有八种:int.char.boolean.byte.long.double.float.short.Java作为一种面向对象的编程语言,数据在Java中也是一种对象.我们用基本 ...
- Java:浅谈InputStream的close方法
原则:最好在任何时候使用InputStream或者OutputStream的时候,在finally中调用close()方法,显式关闭. 一个典型的示例 InputStream in = null; t ...
- 【JAVA】浅谈java内部类
一.什么是内部类? 到底什么是内部类呢?通俗的讲,就是在类内部定义的类,包括定义在一个类的方法外面.方法里面或者代码块中. 二.为什么要使用内部类? 为什么我们要不走寻常路,把一个类定义在另一个类的内 ...
- 【JAVA】浅谈java枚举类
一.什么情况下使用枚举类? 有的时候一个类的对象是有限且固定的,这种情况下我们使用枚举类就比较方便? 二.为什么不用静态常量来替代枚举类呢? public static final int SEASO ...
- java - 异常浅谈
java提供异常处理机制中,可以分为RuntimeException和checked Exception两种. RuntimeException 是运行时异常,是程序本身无法解决的.例如,对于一个用户 ...
- 通过Java代码浅谈HTTP协议
最近刚看了http协议,想写点东西加深一下理解,如果哪儿写错了,请指正. 1 介绍 HTTP是Hyper Text Transfer Protocol(超文本传输协议)的缩写.它的发展是万维网协会(W ...
- java序列化浅谈
首先大家进来第一个疑问肯定是"什么是序列化?为什么要使用序列化?怎么实现一个简单的序列化案例?" 1.序列化就是把对象以一种规范的二进制形式存在内存中,另一边以反序列化方式获取: ...
随机推荐
- 设置SharePoint2010列表的项目级权限
转:http://www.cfanz.cn/?c=article&a=read&id=24096 在SharePoint2010中我们经常会用到这样的权限设置,在一个列表中可以存储多个 ...
- android 获取设备唯一标识完美解决方案
/** * deviceID的组成为:渠道标志+识别符来源标志+hash后的终端识别符 * * 渠道标志为: * 1,andriod(a) * * 识别符来源标志: * 1, wifi mac地址(w ...
- Total Commander快捷键
(1)tab键---切换左.右两个大的窗口:
- Linux趣谈
要解释操作系统是如何工作的,首先可以用这几个关键字来简单地概括一下:冯诺依曼.堆栈机制和中断机制. 提到冯诺依曼很显然就是在说存储程序了,这大概是计算机能够运行最为基础的条件,属于基石级别的.它的基本 ...
- No valid host was found
set in nova.conf -> scheduler_default_filters=AllHostsFilter Tried without success.
- hdoj 1166 敌兵布阵【线段树求区间最大值+单点更新】
敌兵布阵 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...
- hdoj 1200 To and Fro
To and Fro Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total ...
- btrace 笔记
转载请注明原链接地址 http://www.cnblogs.com/dongxiao-yang/p/6134393.html btrace 是一个可以不用重启线上java业务查问题的神器,记一下自己折 ...
- 《Linux内核设计与实现》学习笔记之“Linux进程管理机制”
一.进程(或者称为“任务”)简介 进程是OS最基本的抽象之一,通常进程包括“可执行程序代码”,“其他资源”(如:打开的文件,挂起的信号,内核内部数据,处理器状态,地址空间,一个或多个执行线程等) 二. ...
- 在 VS14 上安装 Visual F# Power Tools
在 VS14 上安装 Visual F# Power Tools Visual F# Power Tools 眼下版本号 1.3,下载地址:http://visualstudiogallery.msd ...