`
renyanwei
  • 浏览: 70108 次
  • 性别: 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中,==永远是比较两个引用是否指向同一个对象的,看到上图,答案不用再揭晓了吧

本人初学,可能表达能力不是很好,多以就多画了几个图来表示,呵呵 大牛看了不要见效哈,有什么错误尽管指出,小弟感激不尽,困了,先睡了

38
13
分享到:
评论
70 楼 LD_21 2011-01-02  

69 楼 zhaoyta 2008-12-02  
lovefish 写道

terryang 写道
实在是抱歉,把标题看成了Spring。不错,挺清晰的!  呵呵 我也是

我也看成spring了
68 楼 carlos 2008-11-24  
忽悠人的?

想表达什么?


67 楼 rabbitbug 2008-11-24  
全都是false的
即便是池里没有"abc"
但既然用了new String("abc");
与s2="abc"也是指向不同的
66 楼 renyanwei 2008-11-21  
kcruci 写道

javaoldboy 写道晕了,难道没有人把这段代码跑一遍?         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); 输出结果都是false!所以实际上还是三个对象!同意

javaoldboy 写道

晕了,难道没有人把这段代码跑一遍?
         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);

输出结果都是false!
所以实际上还是三个对象!


哭了,大哥们  咱们观点一样你嗷嗷叫的干啥啊
65 楼 javaoldboy 2008-11-21  
晕了,难道没有人把这段代码跑一遍?
         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);

输出结果都是false!
所以实际上还是三个对象!
64 楼 daoyongyu 2008-11-21  
赞一下,楼主写的很清晰。
63 楼 logictic 2008-11-19  
我看了,我更清楚了
62 楼 Suxinf 2008-11-19  
基础牢固啊
61 楼 jesse_zzj 2008-11-18  
LZ用图像把String详细的操作描述了 很名目
60 楼 kph2005 2008-10-27  
讲得很好,清晰易懂.
59 楼 星光闪烁 2008-10-25  
分析的很好,这种拗口的String操作确实要用图来说明才说的清楚
58 楼 snsnx 2008-10-25  
如果是讨论字符串,肯定离不开==和equals()方法,s.equals(s1)能够相等,是因为String重写了Object的equals()方法,
    public boolean equals(Object anObject) {
	if (this == anObject) {
	    return true;
	}
	if (anObject instanceof String) {
	    String anotherString = (String)anObject;
	    int n = count;
	    if (n == anotherString.count) {
		char v1[] = value;
		char v2[] = anotherString.value;
		int i = offset;
		int j = anotherString.offset;
		while (n-- != 0) {
		    if (v1[i++] != v2[j++])
			return false;
		}
		return true;
	    }
	}
	return false;
    }
这是String的equals()方法,而
    public boolean equals(Object obj) {
	return (this == obj);
    }
这是Object的equals方法,比较String的时候,equals()方法不仅在两个对象相同时返回true,而且在对象不相同,但内容相同时也会返回true。
57 楼 alhbdk 2008-10-24  
抱歉,犯了个低级错误,忘记了优先级,我说怎么结果这么奇怪。
56 楼 renyanwei 2008-10-24  
alhbdk 写道

但是把程序改成这样,楼主怎么解释呢?
public class Main {

/**
* @param args
*/
public static void main(String[] args) {

String s  = new String("abc");
String s1 = "abc";
String s4 = "abc";
String s2 = new String("abc");

String s3 = s;



System.out.println("1 s == s1 :"+s == s1);
System.out.println("2 s1 == s2 :  "+s1 == s2);
System.out.println("3 s == s2 :  "+s == s2);
System.out.println("4 s == s3 : "+s == s3);
System.out.println("5 s4 == s1 : "+s4 == s1);
System.out.println("6 s1 == abc : "+s1 == "abc");



}

}


这位哥们儿,首先哈,撇还这道题我们看一个问题,你这个程序有没有毛病,你用了一连串的输出一句
System.out.println("1 s == s1 :"+s == s1);

大哥,编程语言是先进行+运算的哈, 你这么加来加去再比较如果相等我就真要晕死了
你不妨把输出语句变一下先执行比较再连接看看
System.out.println("1 s == s1 :"+(s == s1));
55 楼 alhbdk 2008-10-24  
但是把程序改成这样,楼主怎么解释呢?
public class Main {

/**
* @param args
*/
public static void main(String[] args) {

String s  = new String("abc");
String s1 = "abc";
String s4 = "abc";
String s2 = new String("abc");

String s3 = s;



System.out.println("1 s == s1 :"+s == s1);
System.out.println("2 s1 == s2 :  "+s1 == s2);
System.out.println("3 s == s2 :  "+s == s2);
System.out.println("4 s == s3 : "+s == s3);
System.out.println("5 s4 == s1 : "+s4 == s1);
System.out.println("6 s1 == abc : "+s1 == "abc");



}

}


54 楼 夜行者 2008-10-24  
不错啊,赞一个
53 楼 waterli 2008-10-24  
很不错,谢谢。
52 楼 shaoyx 2008-10-24  
lovefish 写道

terryang 写道实在是抱歉,把标题看成了Spring。不错,挺清晰的!  呵呵 我也是

我也是哎 ^_^
51 楼 lovefish 2008-10-23  
terryang 写道

实在是抱歉,把标题看成了Spring。不错,挺清晰的!

  呵呵 我也是

相关推荐

    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 不允许...

    Struts原理、开发及项目实施

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

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

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

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

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

    C#数据结构

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

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

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

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

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

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

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

    DBX260中文说明书

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

    C#微软培训资料

    第二章 运行环境 全面了解.NET.12 2.1 .NET 结构.12 2.2 公用语言运行时环境与公用语言规范.13 2.3 开 发 工 具 .17 2.4 小 结 .19 第三章 编写第一个应用程序 .20 3.1 Welcome 程序 .20 3.2 代 码 分 ...

    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 ...

    Tcl_TK编程权威指南pdf

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

    超爽的自学课件(java)

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

    mfc可视化计算器编程

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

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

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

    软件工程工资管理系统

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

Global site tag (gtag.js) - Google Analytics