`
lifx
  • 浏览: 5761 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

【转】清晰了解String操作

阅读更多

为了清晰了解String的操作,我们来看一段再经典不过的程序 

class StringTest 

{
	public static void main(String[] args) 

	{

		String s=new String("abc");

		String s1="abc";

		String s2=new String("abc");

		System.out.println(s==s1);

		System.out.println(s1==s2);

		System.out.println(s==s2);

	}

}

 

     大伙儿都知道内存中有两块儿存储区域,分别是栈和堆,加上JAVA字符串是由字符串池管理的,所以,我们的内存可以这样划分:



程序开始前所有区域都是空的,现在我们执行第一条语句

 

String s=new String("abc");

 

     JAVA执行流程是这样的。首先判断字符串池里有没有值为"abc"的对象,由于这行语句实在程序第一句,字符串池是空的,所以,它会现在字符串池里构造一个值为"abc"的对象,然后执行new语句后,再把“abc”拷贝到堆里面,关于一个new String构造方法解释

API 写道
换句话说,新创建的字符串是该参数字符串的副本

   

   然后s再指向这个对象,如图:

所以说,执行完这一行代码后生成了两个对象,一个是在字符串池里,一个是在堆里

 

   然后看第二句:

String s1="abc";

    

     执行到这一句时又产生了几个对象?答案是一个也没产生!

     执行是这样的,当程序看到"abc"后,会先到字符串池里找看有没有"abc",由于执行完第一行语句后字符串池里已经有"abc"了就不再创建,注意这里并没有new的操作,而是直接常量赋值,所以s1会直接指向这个"abc"而不会在堆里产生新的对象,如图


程序接着往下走

String s2=new String("abc");

   

      这次又产生了几个对象?一个!

    程序还是会现在字符串池里找"abc",发现有,就不再字符串池里产生新的对象了,接着执行new操作,记着,在JAVA中,只要出现new操作,一定会有新的对象产生,不管这个对象是否存在多少次,所以它又会在堆里生成一个内容为"abc"的对象,如图

 

    好了,只剩下比较了,注意这里是用的是==,在JAVA中,==永远是比较两个引用是否指向同一个对象的,看到上图,答案不用再揭晓了吧 。

 

转自:http://renyanwei.iteye.com/blog/255105

分享到:
评论

相关推荐

    android开发音乐盒的实验报告.doc

    为了符合更多人的喜欢,设计的界面要清晰、美观、大方、并且操作方便。所以我设计 的界面也一定要清晰、美观、大方、并且操作方便。 2、模块分析 (1)在layout文件中增加一个歌词的界面songwords.xml并画好界面,...

    XQuery权威指南(简码·扫描版)

     17.1 xs:string类型  17.2 创建字符串  17.3 比较字符串  17.4 子字符串  17.5 得到字符串的长度  17.6 字符串连接和拆分  17.7 操作字符串  17.8 空白符和字符串  17.9 国际化考虑 第18章 正则式  18.1...

    java面试题

    答:String是不可变的对象,每次对String类型进行改变都相当于产生了一个新的对象,StringBuffer是可变的字符序列,所以如果要经常改变某个字符串的话建议使用StringBuffer。 list、set、map问题? 答:set 不允许...

    传智播客扫地僧视频讲义源码

    09_指针学习思路应用清晰起来 10_指针强化3和指针强化4思想讲解 11_字符串的基本操作 12_数组中括号与指针关系和数组名常量指针分析 13_字符串一级指针内存模型_传智扫地僧 14_字符串copy函数技术推演 15_字符串copy...

    mfc可视化计算器编程

    首先编写程序需要对Windows程序的消息处理机制(Message Handle)有个比较清晰的了解。Windows的程序都是通过消息来传送数据,有不需要用户参与的系统消息,比如异常处理等。还有用户消息,比如鼠标的单击,双击,...

    net学习笔记及其他代码应用

    优点: 分工明确,条理清晰,易于调试,而且具有可扩展性。 缺点: 增加成本。 12.在下面的例子里 using System; class A { public A() { PrintFields(); } public virtual void PrintFields(){} } ...

    DBX260中文说明书

    了解 DriveRack复杂的程序能力的第一步,就是要知道包括其组成成分在内的因素,以定义一个完整的“程序"。一个独立的程序是由几个编辑层组成的。最初进入一个程序时,会处于“程序"方式层。此层为用户提供了当前...

    十天学会ASP.net--我认为ASP.NET比ASP难很多,希望大家做好准备

    十天学会系列教程会清晰的写出各种方法,让大家能少一点坎坷。在ASP里面,大家几乎都是使用VB,数据库嘛,也无非是SQL和ACCESS。在ASP.NET里面,数据库还是这两个但是常用的语言多了一个C#,也是微软推荐的语言,为...

    Struts原理、开发及项目实施

    /* 取得用户请求,做相应数据库操作,略 */ } } FormBean的产生是为了提供数据给ActionBean,在ActionBean中可以取得FormBean中封装的数据,经相应的逻辑处理后,调用业务...

    C#数据结构

    思考问题的过程中,我们可以了解解决问题的方法常常不只一个。运用先前解决 问题的经验,来解决更复杂更深入的问题,是提高程序设计水平的最有效途径。 数据结构正是前人在思索问题的过程中所想出的解决方法。一般而...

    成绩统计系统C课程设计.docx

    2、查询学生总分分数段统计信息 为了快速了解学生成绩的整体情况,其中查询学生总分分数段的统计信息是一个便捷的查询方式,能够为使用者快速达到其需求信息。 三 概要设计 1、建立一个Student类,用于存取学生的...

    C#微软培训资料

    第六章 类 型 转 换 .48 6.1 隐式类型转换 .48 6.2 显式类型转换 .53 6.3 小 结 .56 第七章 表 达 式 .58 7.1 操 作 符 .58 7.2 算术操作符和算术表达式.59 7.3 赋值操作符和赋值表达式.64 7.4 关系...

    Tcl_TK编程权威指南pdf

    Tcl的C函数库拥有清晰的接口而且便于使用。该函数库实现了基本的解释器,它有一套实现变量、流程控制和过程的核心脚本命令,而且还有一组用来存取操作系统服务以运行其他程序、存取文件系统和使用网络套接字的命令。...

    一起动手编写Android图片加载框架

    通过开发这个框架,我们可以进一步深入了解Android中的Bitmap操作、LruCache、LruDiskCache,让我们以后与Bitmap打交道能够更加得心应手。若对Bitmap的大小计算及inSampleSize计算还不太熟悉,请参考这里:高效加载...

    Java优化编程(第2版)

    8.1.2 ejb技术体系具有清晰的架构层次 8.1.3 ejb与传统bean相比的性能优势 8.2 ejb的类型 8.2.1 ejb的生命周期 8.2.2 三种ejb的特点与适用场合 8.2.3 本地ejb与远程ejb的性能比较 8.2.4 有状态会话ejb与httpsession ...

    超爽的自学课件(java)

    同时也会讲述String(字串)类的概念,它用一种不同的方式解决了同样的问题。 <br>(13) 第13章:创建窗口和程序片 Java配套提供了“抽象Windows工具包”(AWT)。这实际是一系列类的集合,能以一种可移植的...

    软件课程设计 试验报告 代码 演示

    特别是对于贪心算法,不但让我对其有了更进一步的了解,而且使我能够更好的掌握在分析问题时,首先对问题的解决算法进行分析的能力。 3基础题_9.约瑟环问题(使用数组存放人员编号) 3.1 需求分析: 本题主要是要求...

    软件工程工资管理系统

    该公司是一家刚刚成立的公司,总体人员比较少,有正式员工20人,人员结构比较简单,学历比较高,基本拥有大专以上学历,部门划分也很清晰,而且人员的流动性不高,所以公司目前对工资管理的要求不高。因此,针对该...

Global site tag (gtag.js) - Google Analytics