关于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的堆和栈
分享到:
相关推荐
首先,让我们明确一点:String和string实际上是指同一个东西,即System.String类。这个类是.NET Framework中的一个内置类型,用于表示不可变的字符序列。在C#中,"string"是"String"的别名,目的是为了提高代码的...
public static string FormatToHtml(string normalStr) { // 解码URL编码 normalStr = System.Web.HttpContext.Current.Server.UrlDecode(normalStr); // 对特殊HTML字符进行编码 normalStr = System.Web....
JSON处理 unfilterJSON | isJSON | evalJSON | parseJSON 脚本处理 ... 【乱入一句,有关JSON的一点东西,可以看看http://www.cnblogs.com/TomXu/archive/2012/01/11/2311956.html】 下面
1.Configuration.xml 是 mybatis 用来建立 sessionFactory 用的,里面主要包含了数据库连接相关东西,还有 java 类所对应的别名,比如 <typeAlias alias="User" type="com.yihaomen.mybatis.model.User"/> 这个别名...
经度表示东西方向的位置,纬度表示南北方向的位置。在地理信息系统中,经纬度通常被用来表示具体位置。 **地址与经纬度的转换**通常包括两个操作: 1. **正向地理编码**:根据具体的地址获取其对应的经纬度坐标。 2...
默认情况下,`await`会尝试在原始上下文(如UI线程)中恢复,但有时我们并不关心这一点,这时可以使用`ConfigureAwait(false)`来跳过上下文恢复,这可能会提高性能,特别是在服务器环境中。 通过以上介绍,我们...
看下这段代码:生成了这么多的一段东西,这段东西对seo一点好处也没有。而我要做的就是去掉它,但有一点,去掉但不能让它原来的控件和内容都发生变化,比如说不能使用等等。所以我要做的仅仅是用另一种方式去保存...
在Java程序的基本组件中,最重要的一点是:一切都是对象,甚至是Java程序本身。你通过引用来操作对象。每种编程语言都有自己的数据操作方式。有时程序员必须时刻注意正在执行哪种类型的操作。你是在直接操作对象,...
您可以使用任何字符和任何我都不知道的东西在它们之间进行拆分。 特点 定义 是 年 米 月 d 日 默认值:年y/m/d 您可以更改和查看格式,如下所示: let x = Jalali(); x.format; // default format: y/m/d x....
)来实现这一点。 让我们看看这如何有用。 Scala 中的偏函数 考虑以下 Scala 代码(直接从 REPL 会话粘贴): scala > def foo ( a : String , b : String ) = try { | a.toInt / b.toInt | } catch { | case ex : ...
//此处用 continue也可以,只是效率低一点 System.out.print(" "+k+"X"+j+"="+j*k); } System.out.println(); } } } 6、输出所有的水仙花数,把谓水仙花数是指一个数3位数,其各各位数字立方和等于其本身,...
.pub, .shw, .sldprt, pubx, vsdxToxyMetadata如何使用ToxyToxy的使用真的是极其简单,这里一点都不夸张,请看下面的例子:1234ParserContext context = new ParserContext("test.xlsx");ISpreadsheetParser parser ...
讲点实际的东西。我最讨厌空讲道理。网上讲道理的太多了,不喜欢举例子。 大多数文章中都或多或少的讲到了三层架构。表示层,业务层,数据层。又把业务层再细分,分为外观服务层,主业务服务,及数据库库服务层。 ...
支持的东西 支持以下样式 支持以下颜色 支持以下标签 安装 您可以使用pip安装hue ,如下所示: pip install huepy 或使用easy_install : easy_install huepy 用法 首先,导入Hue必须提供的所有内容,如下所示:...
上网baidu了很多东西,几乎都差不多,而且基于java的说的很少,所有只有在研究了各个其他语言类的应用后再来尝试在java上进行简单的操作应用。先从memcached上进行说明,memcached的最新版是采用c语言进行开发和...
1.我首先只生成了1个表的简单3层架构代码,(表不是很复杂,7个字段),把这些3个文件好好看一下,代码其实很简单,虽然很长,也是以前学过的,但是要明白3个类之间的关系,看完了,我才大概了解了一点什么是所谓的3...
ObjC 里面的几个空值符号经常会差点把我搞死,这些基础的东西一点要弄清楚才行,以提高码农的基本素质。 nil nil 是 ObjC 对象的字面空值,对应 id 类型的对象,或者使用 @interface 声明的 ObjC 对象。 例如: ...
这么好玩的东西,为啥就没有大佬做呢,原因可能有两个,一是真的难,二是出力不讨好,难以达到最终效果,一番尝试后,技术问题都解决了,但并没有达到电脑端美感,手机屏幕还是太小了。。 这是电脑端的静态图 这是...
以下类比可以帮助说明这一点。 小说家和剧本作家很少从头开始设计剧情。他们总是沿袭一些业已存在的模式,像“悲剧性英雄”模式(《麦克白》、《哈姆雷特》 等)或“浪漫小说”模式(存在着无数浪漫小说)。同样地,面向...
于是乎简单整理了下面的一些概念性的东西,方便学习和理解,会结合一点 java面向对象的知识加以说明。 先了解几个概念: 1.首先 Object 在 ECMAScripe 中是指什么,在 ECMAScripe 中有5种简单数据类型:Undefined,...