【问题标题】:There's a conceptual error in Java String methodJava String 方法中存在概念错误
【发布时间】:2014-05-07 18:14:52
【问题描述】:

在这里我正在训练我的 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);

但是,这个编译器规则存在概念性错误,还是没问题?

【问题讨论】:

标签: java string ocpjp


【解决方案1】:

在第一种情况下,substring 返回 thisthis == this 按预期返回 true。
在第二种情况下,substring 返回一个新对象,因此 == 返回 false,因为您正在比较不同的对象。

【讨论】:

  • @user3220398 为什么?为什么 substring 是这样实现的?
  • @user3220398 如果beginIndex 为0,则substring 的结果是原始字符串,因此子字符串不会创建新字符串,而是返回this。这在 CPU 和内存方面效率更高。我不确定我是否理解您为什么认为这是一个问题。
  • 关于性能没关系。关于这个概念,这就是我的意思,如果用户不知道语言的实现,这种行为有一个例外,一个单独的案例。所以顺便说一句,静态上下文“this”并不总是指向同一个内存堆,好吗?
  • @user3220398 substring 不保证返回相同或不同的字符串实例。所以当前的实现很好,返回一个新的字符串也很好。
  • @assylias 有趣的是,subString() 的 javadocs 说返回了一个新的字符串......所以看起来返回 this 可能只是一个性能优化,因为你不应该这样做假设你得到相同的字符串。
【解决方案2】:

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

【讨论】:

  • 实际上你是对的。但在这种情况下,我希望运算符“==”使用 substring() 方法返回 false,因为知道它返回一个带有“new”运算符的 String 实例。我只是不明白为什么只有在参数 beginIndex == 0 的情况下。为什么用“this”而不是 new String(this.value) 返回静态上下文?
  • @user3220398 s.substring(0) 只返回s,因此运行时可以只返回与s 相同的引用。这并不意味着它一定会。你不能指望它。但它可能。这就是从不==Strings 一起使用的原因之一,即使您认为您可以知道它何时会返回不同的引用。
  • @ajb 我现在已经很满意了。我知道但是已实施,该方法在正确使用的情况下运行良好。我可能使用 "a" == "a" ,但我确信这是真的,因为在运行时 this==this。但我永远不会使用它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-01-13
  • 1970-01-01
  • 2012-12-07
  • 2016-09-21
  • 2016-02-06
  • 2012-09-05
  • 2016-08-30
相关资源
最近更新 更多