最近看到了不少文章
[1]都在讨论字符串之间比较的问题,问题的讨论似乎可以更深入一些。请看以下代码:
我一直都以为以上的四个布尔表达失的结果都应该是false,然后事实上只有最后两个是false。对于String这样的引用类型,"=="操作符自然是比较两个操作数是否引用同一个对象,在C#中,由于"=="运算符被重载了,使用"=="实际上是调用了Equals方法,因此需要将string进行显式类型转换为object后再进行操作。正是因为这个结论在我的脑袋中是十分的清晰,所以当我面对着这四个布尔表达式毫不犹豫的得出了全是false的答案。但是,我只意识到了操作符的本质,却忘了考虑操作数本身。事实上,t1、t2和t3是三个不同的变量,但是它们都引用了同一个对象。因此,第一和第二个布尔表达式得到的结果为true是理所当然的事情了。为什么三者会引用同一个对象呢?下面将会做说明。而t5使用了new关键字并调用了类构造方法,在堆中构造了一个新的对象,t5与t1引用了不同的对象,结果为false,这个也是显而易见的。那么为什么t4和t1之间的引用比较会是false呢?
如果要彻底理解这几个问题,首先就要明确Compile Time和Run Time的区别了。在Java中,会有一个Literal Pool,而C#,则会有一个HashTable来对字符串常量的进行维护和优化,当表达式将一个字符串常量的引用赋给一个变量的时候,如果该字符串常量在Literal Pool已经存在,则不会分配内存以创建新的对象,而是直接将已创建的字符串常量的引用赋给这个变量,如果字符串常量在Literal Pool中是不存在的,则会先创建该字符串对象。这些工作是在Compile Time完成的。所以对于String t3 = "ab" + "cd"这个表达式,由于操作符"+"的操作数是两个常量,那么"+"的操作在Compile Time就可以完成,并且经过优化后,不会创建新的字符串对象,而是引用已经存在于Literal Pool中的"abcd"。而对于String t4 = ta + tb这个表达式,由于操作数是两个变量,而变量的内容在Run Time是有可能发生变化的,Compiler并不能在Compile Time确定t4的内容,因此t4引用的并不是存在于Literal Pool中的"abcd"。
这样的解释会不会更好一点呢?请各位多多指教。//Bow
分享到:
相关推荐
本文实例为大家分享了python实现字符串加密成纯数字的具体代码,供大家参考,具体内容如下 说明: 该加密算法仅仅是做一个简单的加密,安全性就不谈了,哈哈. 算法流程: 1.字符串以utf8编码成字节数组 2.把每一个...
字符串比较是另一个关键点,`equals()`方法用于比较字符串内容是否相等,注意与`==`的区别,后者比较的是对象的引用。`compareTo()`和`compareToIgnoreCase()`可以按照字典顺序比较字符串。 总的来说,Java字符串...
"C语言字符串格式化详解" C语言字符串格式化是指使用printf、scanf等函数对字符串进行格式化处理的技术。字符串格式化是C语言编程中非常重要的一部分,正确地使用字符串格式化可以提高代码的可读性和可维护性。 在...
标题中的“浅谈Java字符串Java开发Java经验技巧共11页”表明这是一份关于Java编程,特别是关于Java字符串处理的深度技术文档。在Java中,字符串是编程中经常遇到的基本数据类型,对于任何Java开发者来说,理解和掌握...
列举并解释了C语言提供的各种字符串处理函数,包括创建、修改、比较和查找等功能。 21.6. 字符串遍历 探讨了如何遍历字符串中的每一个字符,包括使用指针和迭代器的方式。 21.7. 再谈strxxx() 与_mbsxxx() 解释了...
字符串的解析: 输入:一个字符串, 如“sinx+x*exp(-x)”,对其进行解析,解析成相应的函数。 确定x的值(可以用户指定,或直接自定,如x=pi/6)
`expr` 是一个用于执行算术、比较和字符串操作的命令。对于字符串长度的计算,可以使用 `${#string}` 或 `expr length $string`。当字符串包含空格时,需要用双引号括起来。`expr` 的索引命令如 `expr index $...
在Python编程语言中,字符串是数据类型之一,用于存储文本信息。本文将深入探讨字符串的分片与索引以及常用的一些字符串方法。 首先,我们来看字符串的分片和索引。在Python中,通过索引我们可以访问字符串中的单个...
### JavaScript 转换日期字符串为 Date 日期对象的方法 在 JavaScript 开发中,处理日期是非常常见的需求之一。很多时候,我们需要将用户输入或其他来源得到的日期字符串转换为 `Date` 对象,以便进行进一步的计算...
在Java编程语言中,字符串(String)、字符数组(char[])和列表(List)是三种常见的数据结构,它们之间可以通过不同的方法进行相互转换。本文将深入探讨如何在这些数据类型间进行转换,以便更好地理解和应用。 1....
在处理Web开发中的字符串拼接任务时,我们经常需要将多个字符串片段合并为一个完整的字符串。在JavaScript中,原生的字符串拼接方式,尤其是使用加号(+)操作符,常常会导致性能问题,尤其是在循环中拼接大量字符串...
此外,对于字符串的比较,`==`检查的是两个对象是否指向同一个内存位置,而`equals()`方法则比较两个字符串的内容是否相等。如果两个`String`对象包含相同的字符序列,即使它们不是同一个实例,`equals()`也会返回`...
Java 中字符串数组、字符串、整形之间的转换 在 Java 编程中,字符串数组、字符串、整形之间的转换是非常重要的操作。今天,我们将详细介绍这些转换的实现方法。 字符串数组转字符串 在 Java 中,将字符串数组...
浅谈java字符串比较到底应该用==还是equals Java 中的字符串比较是一个非常重要的主题,在实际项目中,正确地比较字符串是非常关键的。在 Java 中,有两种方式来比较字符串,一种是使用 "==" 运算符,另一种是使用 ...
谈到加密算法,“字符串加密解密”项目可能采用了多种常见的加密算法。例如,对称加密算法如AES(高级加密标准)和DES(数据加密标准),它们的加密和解密使用相同的密钥,具有速度快、效率高的特点,适合处理大量...
学习python字符串方法的使用,对书中列举的每种方法都做一个试用,将结果记录,方便以后查询。 (1) s.capitalize() ;功能:返回字符串的的副本,并将首字母大写。使用如下: >>> s = 'wwwwww' >>> scap = s....
ES6 模板字符串是JavaScript语言的一个重要更新,它提供了一种更加方便和灵活的方式来创建和操作字符串。模板字符串以反引号(`)包裹,允许我们在字符串中直接嵌入变量和表达式,大大简化了字符串拼接的操作。 在...
您可能感兴趣的文章:python实现忽略大小写对字符串列表排序的方法python字符串排序方法浅谈Python 字符串格式化输出(format/printf)Python字符串格式化输出方法分析简单讲解Python中的字符串与字符串的输入输出...
本文主要探讨了三种不同的字符串连接方式,并对其性能进行了比较。这三种方法包括:直接使用连接符`+`、通过数组的`join`方法以及利用对象属性进行连接。 1. **直接使用连接符"+"**: 这是最直观且易于理解的方式...
在JavaScript中,数字和字符串之间的转化是常见的操作,特别是在处理用户输入或动态计算时。本文主要探讨了在JS中如何将字符串转化为数字以及数字转化为字符串的方法。 首先,我们来看字符串转数字的几种方法: 1....