`
paddy.w
  • 浏览: 505119 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

String的一点东西

    博客分类:
  • Java
JVM 
阅读更多
        关于String类的一点东西,算是对容易疏忽的地方进行一下总结。

        先看下面这个例子:
public class StringTest {

	public static void main(String[] args) {
		String a="a";
		String b="a";
		System.out.println(a==b);
		
		System.out.println("-------");
		String aa=new String("a");
		System.out.println(a==aa);
		
		System.out.println("-------");
		String aaa=new String("a");
		System.out.println(aa==aaa);
	}
}

        执行结果是:
true
-------
false
-------
false

        下面对执行结果做一下解释,也算是对String的一点总结。
       
        String经常和原生类型放在一起,因为它太常用了。但它是一个类。而它与其他类比较不同的地方在于它生成对象的方式。一种是直接用一个带引号的字符串,另一种就是通常的new。
        上面的例子中a==b返回的是true,==比较的始终是对象的地址,说明a和b指向了一样的对象。
        先看String a="a"。在内存的栈区有一个string pool,这条语句是在string pool中生成了一个值为"a"的字符串对象,并将其引用赋给了a。String b="a"执行时,JVM会在String pool中找是否有值为"a"的一个对象,如果有,则将其引用赋给b,如果没有则在String pool生成一个值为"a"的新对象并将其赋给b。这里由于string pool已经存在了"a",所以直接将其引用赋给了b,而不再创建新的对象。
        String aa=new String("a");这条语句实际上是先在string pool中查找是否存在值为"a"的对象,如果存在,那么在内存的堆区创建了一个值为"a"的对象,并将其引用赋给aa;如果不存在,则在string pool生成一个值为"a"的新对象,然后在堆区再创建一个值为"a"的新对象,并将其赋给aa。这个例子由于在string pool已经存在了值为"a"的对象,因此不再在这里面创建对象,而直接在堆区创建一个新对象,并将其引用给aa。
        a==aa仍然是比较地址。这里返回了false,原因是a指向的是位于栈区的值为"a"的对象,而aa指向的是位于堆区的值为"a"的对象。引用不同返回false。
        String aaa=new String("a");像上面分析的一样,虽然在string pool存在值为"a"的对象,但是仍然在堆区创建一个新的值为"a"的对象,引用赋给了aaa。
        aa==aaa,返回了false。因为aa和aaa指向的对象值都为"a",但是指向的却是位于堆区的两个不同的对象。因此返回false。

        PS:关于堆区和栈区,参见Java的堆和栈
分享到:
评论

相关推荐

    C#中String与string的区别分析

    首先,让我们明确一点:String和string实际上是指同一个东西,即System.String类。这个类是.NET Framework中的一个内置类型,用于表示不可变的字符序列。在C#中,"string"是"String"的别名,目的是为了提高代码的...

    关于C#字符处理一点小东西

    public static string FormatToHtml(string normalStr) { // 解码URL编码 normalStr = System.Web.HttpContext.Current.Server.UrlDecode(normalStr); // 对特殊HTML字符进行编码 normalStr = System.Web....

    Prototype源码浅析 String部分(三)之HTML字符串处理

        JSON处理 unfilterJSON | isJSON | evalJSON | parseJSON 脚本处理 ... 【乱入一句,有关JSON的一点东西,可以看看http://www.cnblogs.com/TomXu/archive/2012/01/11/2311956.html】 下面

    springmybatis

    1.Configuration.xml 是 mybatis 用来建立 sessionFactory 用的,里面主要包含了数据库连接相关东西,还有 java 类所对应的别名,比如 <typeAlias alias="User" type="com.yihaomen.mybatis.model.User"/> 这个别名...

    根据地址返回经纬度java版

    经度表示东西方向的位置,纬度表示南北方向的位置。在地理信息系统中,经纬度通常被用来表示具体位置。 **地址与经纬度的转换**通常包括两个操作: 1. **正向地理编码**:根据具体的地址获取其对应的经纬度坐标。 2...

    异步调用实例

    默认情况下,`await`会尝试在原始上下文(如UI线程)中恢复,但有时我们并不关心这一点,这时可以使用`ConfigureAwait(false)`来跳过上下文恢复,这可能会提高性能,特别是在服务器环境中。 通过以上介绍,我们...

    asp.net 去除viewstate第1/2页

    看下这段代码:生成了这么多的一段东西,这段东西对seo一点好处也没有。而我要做的就是去掉它,但有一点,去掉但不能让它原来的控件和内容都发生变化,比如说不能使用等等。所以我要做的仅仅是用另一种方式去保存...

    计算机、java、j2ee文献翻译

    在Java程序的基本组件中,最重要的一点是:一切都是对象,甚至是Java程序本身。你通过引用来操作对象。每种编程语言都有自己的数据操作方式。有时程序员必须时刻注意正在执行哪种类型的操作。你是在直接操作对象,...

    jalali:Jalali 转换器到 AD,反之亦然

    您可以使用任何字符和任何我都不知道的东西在它们之间进行拆分。 特点 定义 是 年 米 月 d 日 默认值:年y/m/d 您可以更改和查看格式,如下所示: let x = Jalali(); x.format; // default format: y/m/d x....

    积分java源码-match-block:[ABANDONED]模式匹配块作为值

    )来实现这一点。 让我们看看这如何有用。 Scala 中的偏函数 考虑以下 Scala 代码(直接从 REPL 会话粘贴): scala > def foo ( a : String , b : String ) = try { | a.toInt / b.toInt | } catch { | case ex : ...

    达内 coreJava 习题答案

    //此处用 continue也可以,只是效率低一点 System.out.print(" "+k+"X"+j+"="+j*k); } System.out.println(); } } } 6、输出所有的水仙花数,把谓水仙花数是指一个数3位数,其各各位数字立方和等于其本身,...

    .NET平台上的文件抽取框架toxy.zip

    .pub, .shw, .sldprt, pubx, vsdxToxyMetadata如何使用ToxyToxy的使用真的是极其简单,这里一点都不夸张,请看下面的例子:1234ParserContext context = new ParserContext("test.xlsx");ISpreadsheetParser parser ...

    Delphi最新三层源码

    讲点实际的东西。我最讨厌空讲道理。网上讲道理的太多了,不喜欢举例子。 大多数文章中都或多或少的讲到了三层架构。表示层,业务层,数据层。又把业务层再细分,分为外观服务层,主业务服务,及数据库库服务层。 ...

    huepy:出色地在终端中打印

    支持的东西 支持以下样式 支持以下颜色 支持以下标签 安装 您可以使用pip安装hue ,如下所示: pip install huepy 或使用easy_install : easy_install huepy 用法 首先,导入Hue必须提供的所有内容,如下所示:...

    memcached1

    上网baidu了很多东西,几乎都差不多,而且基于java的说的很少,所有只有在研究了各个其他语言类的应用后再来尝试在java上进行简单的操作应用。先从memcached上进行说明,memcached的最新版是采用c语言进行开发和...

    动码生成器

    1.我首先只生成了1个表的简单3层架构代码,(表不是很复杂,7个字段),把这些3个文件好好看一下,代码其实很简单,虽然很长,也是以前学过的,但是要明白3个类之间的关系,看完了,我才大概了解了一点什么是所谓的3...

    iOS中nil、Nil、NULL、NSNull详解

    ObjC 里面的几个空值符号经常会差点把我搞死,这些基础的东西一点要弄清楚才行,以提高码农的基本素质。 nil nil 是 ObjC 对象的字面空值,对应 id 类型的对象,或者使用 @interface 声明的 ObjC 对象。 例如: ...

    Pic2Ascii:android图片转字符串

    这么好玩的东西,为啥就没有大佬做呢,原因可能有两个,一是真的难,二是出力不讨好,难以达到最终效果,一番尝试后,技术问题都解决了,但并没有达到电脑端美感,手机屏幕还是太小了。。 这是电脑端的静态图 这是...

    二十三种设计模式【PDF版】

    以下类比可以帮助说明这一点。 小说家和剧本作家很少从头开始设计剧情。他们总是沿袭一些业已存在的模式,像“悲剧性英雄”模式(《麦克白》、《哈姆雷特》 等)或“浪漫小说”模式(存在着无数浪漫小说)。同样地,面向...

    javascript中的 object 和 function小结

    于是乎简单整理了下面的一些概念性的东西,方便学习和理解,会结合一点 java面向对象的知识加以说明。 先了解几个概念: 1.首先 Object 在 ECMAScripe 中是指什么,在 ECMAScripe 中有5种简单数据类型:Undefined,...

Global site tag (gtag.js) - Google Analytics