java——String的那边破事
经典的先看下面一段代码,请问最终创建几个对象,分别在哪里?
String s0 = new String("luoliang.me");
String s1 = "luoliang.me";
String s2 = new String("luoliang.me");
想要回答这个问题,先得搞清楚new String()以及String pool的,下面我慢慢来说下。
在java中所有的字符串都会保存在一个叫String pool字符串池里面,这里面的字符串都是有String类独立维护,过程是先判断存在这个字符串不,如果存在就不用创建,否则就在里面创建一个。
那new String("luoliang.me")这个呢,看到new关键字说明会创建对象,先回去字符串池找是否存在,不存在创建,完毕后会在堆中创建这个对象,记住这个对象也是字符串“luoliang.me”的,到这里大家差不多都知道了,那看下面:
String s0 = new String("luoliang.me");执行这句后,系统中会存在2个对象,一个是字符串池的"luoliang.me",另外一个是堆中的new String("luoliang.me"),最后把s0指向这个对象。
String s1 = "luoliang.me"; 执行这句话之后系统中不会增加对象,不变,原因是s1直接指向了字符串池的"luoliang.me"。
String s2 = new String("luoliang.me");执行这句之后,系统中增加一个对象,原因是在字符串池中已经存在"luoliang.me"这个不用创建,直接在堆里创建一个对象,并把s2指向这个对象。
最后总结执行3句之后:系统中存在3个对象,一个是在字符串池中,另外2个是在堆中。
下面接着来看看:
System.out.println(s0 == s1);
System.out.println(s0 == s2);
System.out.println(s1 == s2);
这个应该是比较简单了,在基本类型里面==直接比较的是其值,但是对象的话比较的是引用,就是地址的意思。下面我画一张图表示之前的代码在内存的情况:

看到这个图片,相信就知道那3个输出是什么了!都是false
这样说可能还有人不信,那么我们可以使用String的intern()方法(表示其字符串池中字符串的地址)来比较,看下面:
System.out.println(s0 == s0.intern());
System.out.println(s0.intern() == s1);
System.out.println(s0.intern() == s2.intern());
System.out.println(s1 == s2.intern());
输出是:
false
true
true
true
- 下面我们来看看更有趣的,可能很多人想不到会是这样的结果。
String luoliang = "luoliang";
String luo = "luo";
String liang = "liang";
System.out.println(luoliang == "luo" + "liang");
System.out.println(luoliang == "luo" + liang);
System.out.println("luoliang" == luo + liang);问下输出的结果是什么,答案是:
- 问下输出的结果是什么,答案是:
true
false至于为什么吗,字面值常量相加等于直接相加然后在字符串池存储,而字面值跟变量相加堆在堆生成一个对象,这样可想而知地址是怎么样的了!
这次先到这里。坚持记录点点滴滴!
参考:http://www.luoliang.me/index.php/archives/ProgrammingLanguage/35.html
java——String的那边破事的更多相关文章
- 谁还不知道Java String的那点事
String是我们平时接触最多的一种数据类型之一,不同语言有自己内部的实现,今日一起看下Java中String的内部实现. 常问问题 面试中常被提及的String问题 String为什么是Final的 ...
- Java你可能不知道的事(3)HashMap
概述 HashMap对于做Java的小伙伴来说太熟悉了.估计你们每天都在使用它.它为什么叫做HashMap?它的内部是怎么实现的呢?为什么我们使用的时候很多情况都是用String作为它的key呢?带着 ...
- java你可能不知道的事(2)--堆和栈
在java语言的学习和使用当中你可能已经了解或者知道堆和栈,但是你可能没有完全的理解它们.今天我们就一起来学习堆.栈的特点以及它们的区别.认识了这个之后,你可能对java有更深的理解. Java堆内存 ...
- java你可能不知道的事(2)--堆和栈<转>
在java语言的学习和使用当中你可能已经了解或者知道堆和栈,但是你可能没有完全的理解它们.今天我们就一起来学习堆.栈的特点以及它们的区别.认识了这个之后,你可能对java有更深的理解. Java堆内存 ...
- JAVA String、StringBuffer、StringBuilder类解读
JAVA String.StringBuffer.StringBuilder类解读 字符串广泛应用 在 Java 编程中,在 Java 中字符串属于对象,Java 提供了 String 类来创建和操作 ...
- 从Java String实例来理解ANSI、Unicode、BMP、UTF等编码概念
转(http://www.codeceo.com/article/java-string-ansi-unicode-bmp-utf.html#0-tsina-1-10971-397232819ff9a ...
- Java String.split()小点
java String.split(); 别的不说,单说其中一个问题,这个函数去切分空字符串时,得到的结果: public static void main(String[] args) {// St ...
- Java总结篇系列:Java String
String作为Java中最常用的引用类型,相对来说基本上都比较熟悉,无论在平时的编码过程中还是在笔试面试中,String都很受到青睐,然而,在使用String过程中,又有较多需要注意的细节之处. 1 ...
- java String.split()函数的用法分析
java String.split()函数的用法分析 栏目:Java基础 作者:admin 日期:2015-04-06 评论:0 点击: 3,195 次 在java.lang包中有String.spl ...
随机推荐
- Android中数据库的操作流程详解
Android中数据库的操作方法: 1.Android平台提供了一个数据库辅助类来创建或打开数据库. 这个辅助类继承自SQLiteOpenHelper类.继承和扩展SQLiteOpenHelper类主 ...
- mybatisnet轻量级ORM框架
https://code.google.com/p/mybatisnet/source/checkout http://blog.csdn.net/arvinstudy/article/details ...
- uva 103 Stacking Boxes(DAG)
题目连接:103 - Stacking Boxes 题目大意:有n个w维立体, 输出立体互相嵌套的层数的最大值, 并输出嵌套方式, 可嵌套的要求是外层立体的w条边可以分别对应大于内层立体. 解题思路: ...
- C-Free 您不能使用调试解决方案
什么时候C-Free 当您调试 找不到gdb.exe解决方案 http://www.programarts.com/ C-Free 官方网站 下载Mingw或者其他编译器 版权声明:本文博主原创文章. ...
- 为何与0xff进行与运算
为何与0xff进行与运算 在剖析该问题前请看如下代码 public static String bytes2HexString(byte[] b) { String ret = "" ...
- JAVA Stop The World 第八节
JAVA Stop The World 第八节 小伙伴还记得上一篇中我们留下的一个问题吗?什么是停顿类型!经过上几章的学习,我们知道垃圾回收首先是要经过标记的.对象被标记后就会根据不同的区域采用不同的 ...
- Eclipse --Type /com.xx.app/gen already exists but is not a source folde解决方案
两种解决方案: Two actions, first: 1.Right click on the project and go to "Properties" 2.Select & ...
- 对原生js的一些小尝试
意图仿造JQ操作以及弄个个人工具箱,不断完善中,代码均为个人摸索,所以肯定会有不少不足的地方,希望读者们能提出来. var xzhUtils = { //-----DOM对象添加类----- //-- ...
- Thinkphp的页面判断
目前在做的系统中,涉及到了前端页面的判断,比如性别在数据库中存储为0或1,而页面显示应该为“男”或“女”,这里就需要用到页面判断. 比如, <volist name="st" ...
- 【Chromium中文文档】进程模型
进程模型 转载请注明出处:https://ahangchen.gitbooks.io/chromium_doc_zh/content/zh//General_Architecture/Process_ ...