Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
那里';这是Java字符串方法中的一个概念错误_Java_String_Ocpjp - Fatal编程技术网

那里';这是Java字符串方法中的一个概念错误

那里';这是Java字符串方法中的一个概念错误,java,string,ocpjp,Java,String,Ocpjp,在这里,我训练我的OCP并测试一些字符串行为 当我得到这个: System.out.println("a".substring(0) == "a".substring(0)); // true System.out.println("a".substring(0) == "aa".substring(1)); // false 我有些怀疑。我知道该方法返回的是什么: return (beginIndex == 0) ? this : new String(value

在这里,我训练我的OCP并测试一些字符串行为

当我得到这个:

    System.out.println("a".substring(0) == "a".substring(0));  // true

    System.out.println("a".substring(0) == "aa".substring(1)); // false
我有些怀疑。我知道该方法返回的是什么:

    return (beginIndex == 0) ? this : new String(value, beginIndex, subLen);

但是,这个编译器规则有一个概念上的错误,或者没问题?

您使用了错误的相等运算符。您想要的是
.equals
,而不是
=
。您正在使用的方法调用返回的字符串是否为相同的字符串对象是一个实现细节;您希望
.equals
比较它们的内容。

您使用了错误的相等运算符。您想要的是
.equals
,而不是
=
。您正在使用的方法调用返回的字符串是否为相同的字符串对象是一个实现细节;您希望
.equals
比较它们的内容。

在第一种情况下
子字符串
返回
this
,而
this==this
按预期返回true。

在第二种情况下,
子字符串
返回一个新对象,因此
=
返回false,因为您正在比较不同的对象。

在第一种情况下
子字符串
返回
,而
此==此
按预期返回true。


在第二种情况下,
子字符串
返回一个新对象,因此
=
返回false,因为您正在比较不同的对象。

可能重复的Don't。OCPJP需要对Java实现有一些特别的了解。不可能重复。OCPJP需要对Java实现有一些特别的了解。实际上,您是对的。但在本例中,我希望运算符“==”使用substring()方法返回false,因为它知道它使用“new”运算符返回字符串实例。我只是不明白为什么只有在参数beginIndex==0的情况下才这样。例如,为什么返回带有“this”的静态上下文而不是新字符串(this.value)?@user3220398
s.substring(0)
只返回
s
,因此运行时只返回与
s
相同的引用。这并不意味着它一定会。你不能指望它。但它可能会。这是一个永远不要将
==
字符串一起使用的原因,即使你认为你可以知道它何时会返回一个不同的引用。@ajb我现在很满意。我知道,不管如何实现,只要使用得当,该方法运行良好。我可能会使用“a”==“a”,但我确信这是真的,因为在那个运行时this==this。但我永远不会用它。实际上你是对的。但在本例中,我希望运算符“==”使用substring()方法返回false,因为它知道它使用“new”运算符返回字符串实例。我只是不明白为什么只有在参数beginIndex==0的情况下才这样。例如,为什么返回带有“this”的静态上下文而不是新字符串(this.value)?@user3220398
s.substring(0)
只返回
s
,因此运行时只返回与
s
相同的引用。这并不意味着它一定会。你不能指望它。但它可能会。这是一个永远不要将
==
字符串一起使用的原因,即使你认为你可以知道它何时会返回一个不同的引用。@ajb我现在很满意。我知道,不管如何实现,只要使用得当,该方法运行良好。我可能会使用“a”==“a”,但我确信这是真的,因为在那个运行时this==this。但我永远不会用它。@user3220398为什么?为什么子字符串是这样实现的?@user3220398如果
beginIndex
为0,则
substring
的结果是原始字符串,因此子字符串不创建新字符串,而是返回
this
。这在CPU和内存方面效率更高。我不确定我是否理解你为什么认为这是一个问题。关于性能,没关系。关于这个概念,这就是我的意思,如果用户不知道语言的实现,这个行为有一个例外,一个单独的案例。顺便说一下,静态上下文“this”并不总是指向相同的内存堆,好吗?@user3220398
substring
不保证返回相同或不同的字符串实例。因此当前的实现很好,返回一个新字符串也很好。@assylas有趣的是,
subString()
的javadocs说返回了一个新字符串。。。因此,似乎返回
这个
可能只是一个性能优化,因为您不应该假设返回了相同的字符串。@user3220398为什么?为什么子字符串是这样实现的?@user3220398如果
beginIndex
为0,则
substring
的结果是原始字符串,因此子字符串不创建新字符串,而是返回
this
。这在CPU和内存方面效率更高。我不确定我是否理解你为什么认为这是一个问题。关于性能,没关系。关于这个概念,这就是我的意思,如果用户不知道语言的实现,这个行为有一个例外,一个单独的案例。顺便说一下,静态上下文“this”并不总是指向相同的内存堆,好吗?@user3220398
substring
不保证返回相同或不同的字符串实例。因此当前的实现很好,返回一个新字符串也很好。@assylas有趣的是,
subString()
的javadocs说返回了一个新字符串。。。因此,返回
这个
可能只是一个性能优化,因为您不应该假设返回相同的字符串。