/**
* 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 浅谈的更多相关文章

  1. 【推荐】JAVA基础◆浅谈3DES加密解密

    国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...

  2. C++ string (浅谈)

    浅谈string <string> typedef basic_string<char> string; 本篇主要内容是简单地介绍 string类 在竞赛方面较实用的一些功能, ...

  3. Java中Integer和String浅谈

    Java中的基本数据类型有八种:int.char.boolean.byte.long.double.float.short.Java作为一种面向对象的编程语言,数据在Java中也是一种对象.我们用基本 ...

  4. Java:浅谈InputStream的close方法

    原则:最好在任何时候使用InputStream或者OutputStream的时候,在finally中调用close()方法,显式关闭. 一个典型的示例 InputStream in = null; t ...

  5. 【JAVA】浅谈java内部类

    一.什么是内部类? 到底什么是内部类呢?通俗的讲,就是在类内部定义的类,包括定义在一个类的方法外面.方法里面或者代码块中. 二.为什么要使用内部类? 为什么我们要不走寻常路,把一个类定义在另一个类的内 ...

  6. 【JAVA】浅谈java枚举类

    一.什么情况下使用枚举类? 有的时候一个类的对象是有限且固定的,这种情况下我们使用枚举类就比较方便? 二.为什么不用静态常量来替代枚举类呢? public static final int SEASO ...

  7. java - 异常浅谈

    java提供异常处理机制中,可以分为RuntimeException和checked Exception两种. RuntimeException 是运行时异常,是程序本身无法解决的.例如,对于一个用户 ...

  8. 通过Java代码浅谈HTTP协议

    最近刚看了http协议,想写点东西加深一下理解,如果哪儿写错了,请指正. 1 介绍 HTTP是Hyper Text Transfer Protocol(超文本传输协议)的缩写.它的发展是万维网协会(W ...

  9. java序列化浅谈

    首先大家进来第一个疑问肯定是"什么是序列化?为什么要使用序列化?怎么实现一个简单的序列化案例?" 1.序列化就是把对象以一种规范的二进制形式存在内存中,另一边以反序列化方式获取: ...

随机推荐

  1. 编程实现改变win7主题

    一  : 解析问题 1. Windows 7 主题在:%windir%\Resources\Themes  : 2: 我们通过shell 命令  (这个是msdn中提到的) rundll32.exe ...

  2. Classical Inheritance in JavaScript

    JavaScript is a class-free, object-oriented language, and as such, it uses prototypal inheritance in ...

  3. java 学习笔记4

    (1)      线程的强制运行 先看线程强制运行的实例 ,再解释程序中是如何让程序强制运行的 public class ThreadTest1 implementsRunnable { public ...

  4. ArcEngine中使用上下左右键移动地图

    转自愿文ArcEngine中使用上下左右键移动地图 因项目需要,需对mapcontrol控件响应上下左右键,从网上找的方法都一样,都值提到了需要设置axMapControl1的KeyIntercept ...

  5. CentOS源码安装搭建LNMP全过程(包括nginx,mysql,php,svn)【转】

    转自:http://blog.csdn.net/yanzi1225627/article/details/49123659 服务器环境为:CentOS6.5 64位 目标:搭建LNMP(Linux + ...

  6. notepad++下载Subversion插件,显示intalltion of subversion failed

    notepad++安卓subversion的插件不成功,是因为我们下载TortoiseSVN客户端的版本跟subversion的版本不兼容 一.背景: 在新浪云平台上开发微信公众账号,因为要使用SVN ...

  7. android开发:@SuppressLint( NewApi )

    这个是android带的lint工具提示的,lint官方的说法是 Improving Your Code with lint,应该是帮助提升代码的 ,如果不想用的话,可以右键点工程,然后在androi ...

  8. Android开发_SharedPreferences

    SharedPreferences是Android平台上一个轻量级的存储类,主要是保存一些常用的配置比如窗口状态,一般在Activity中 重载窗口状态onSaveInstanceState保存一般使 ...

  9. 最简单的基于FFMPEG的视频编码器(YUV编码为H.264)

    本文介绍一个最简单的基于FFMPEG的视频编码器.该编码器实现了YUV420P的像素数据编码为H.264的压缩编码数据.编码器代码十分简单,可是每一行代码都非常重要,适合好好研究一下.弄清楚了本代码也 ...

  10. locale------- linux字符集

    查看当前系统字符集 [root@server1 ~]# locale LANG=zh_CN.UTF-8LC_CTYPE="zh_CN.UTF-8"LC_NUMERIC=" ...