当前位置: 首页 > 面试题库 >

String.equals()如何工作

谈禄
2023-03-14
问题内容

我一直在尝试了解一些API方法的工作方式

下面是java.lang.String类的equals方法的摘要

有人可以告诉我代码实际上是如何比较两个字符串的。我得到了计数的重要性,但是偏移量的含义是什么。这些变量如何获得价值?

就像我创建一个String一样。这些是如何初始化的。

详细的逐行描述,以及如何以及何时初始化实例变量,值,计数,偏移量等?

 public boolean equals(Object anObject) {
  1014           if (this == anObject) {
  1015               return true;
  1016           }
  1017           if (anObject instanceof String) {
  1018               String anotherString = (String)anObject;
  1019               int n = count;
  1020               if (n == anotherString.count) {
  1021                   char v1[] = value;
  1022                   char v2[] = anotherString.value;
  1023                   int i = offset;
  1024                   int j = anotherString.offset;
  1025                   while (n-- != 0) {
  1026                       if (v1[i++] != v2[j++])
  1027                           return false;
  1028                   }
  1029                   return true;
  1030               }
  1031           }
  1032           return false;
  1033       }

问题答案:

逻辑上

while (n-- != 0) {
if (v1[i++] != v2[j++])
    return false;
}

是相同的

for (int i = 0; i < n; i++) {
    if (v1[i] != v2[j])
        return false;
    }
}

我不确定为什么JVM设计人员会这样做。也许使用while循环比使用for循环可以提高性能。在我看来,它看起来很像C,所以也许写这个的人在c中有背景。

Offset用于定位字符串在char数组中的起始位置。内部字符串存储为char数组。这是value

if (v1[i++] != v2[j++])
    return false;

检查字符串的基础char数组中的字符。

并逐行

如果引用指向同一个对象,则必须等于

1014           if (this == anObject) {
1015               return true;
1016           }

如果对象是字符串,则检查它们是否相等

1017           if (anObject instanceof String) {

强制将传入的参数转换为String。

1018               String anotherString = (String)anObject;

记住this.string的长度

1019               int n = count;

如果两个字符串的长度匹配

1020               if (n == anotherString.count) {

获取一个字符数组(值是此数组)

1021                   char v1[] = value;
1022                   char v2[] = anotherString.value;

找出字符串在此数组中的开始位置

1023                   int i = offset;
1024                   int j = anotherString.offset;

遍历char数组。如果值不同,则返回false

1025                   while (n-- != 0) {
1026                       if (v1[i++] != v2[j++])
1027                           return false;
1028                   }

其他所有事情都必须是真的

1029                   return true;
1030               }
1031           }

如果不是String类型,则它们不能等于

1032           return false;
1033       }

要了解偏移量和值,请查看String类

/** The value is used for character storage. */
private final char value[];

/** The offset is the first index of the storage that is used. */
private final int offset;

/** The count is the number of characters in the String. */
private final int count;

构造函数初始化这些变量。默认的构造函数代码如下。对于其他构造函数,您应该会看到类似的内容。

/**
  * Initializes a newly created {@code String} object so that it represents
  * an empty character sequence.  Note that use of this constructor is
  * unnecessary since Strings are immutable.
  */
 public String() {
    this.offset = 0;
    this.count = 0;
    this.value = new char[0];
 }

这是一个很好的链接



 类似资料:
  • 问题内容: 我最近在最近的回答中使用以下内容收到了反对意见: 由于使用“ yoda条件”而给出了下票。我要求进一步解释,但未提供任何解释。我更喜欢这种风格以避免可能。 这是不良的编码风格吗?如果是这样,为什么? 问题答案: Bill Pugh在Devoxx2011上问了这个问题。我和比尔在一起,现在更喜欢。 Java传统的基础是我们尽早发现错误。NPE非常普遍。我们希望尽快将这些空值路由出去。 如

  • 在上面的代码中,我根据天气与否计算每个指数,每个指数都是=到零。然而,它总是在foreach循环中运行false,在for循环中运行true。有人能解释一下幕后发生了什么让这一切发生吗? 我不是按顺序运行它们,它们都是为了演示目的。

  • 问题内容: 我对如何使用动作监听器和实现它们有一个想法,但是我想知道是否有人可以告诉我他们如何监听事件?有某种轮询机制吗? 问题答案: 动作侦听器使用观察者模式注册事件,主事件循环会将它们注册的所有事件通知它们。所以不,这不是轮询(拉)机制,而是相反的(推)回调。这是“不给我们打电话,我们给您打电话”编程的一个例子。因为代码中的所有内容都在单个线程(事件循环)上运行,所以您不必担心不同事件之间的同

  • 问题内容: 我试图了解Collections.binarySearch如何在Java中工作。我不太明白我得到的输出。 此代码的输出为-1。 当按此顺序插入元素时 结果是0。我认为如果找不到该元素,则结果为负数。有人可以澄清我收到的输出吗? 问题答案: 您的数据必须根据给定的比较器进行排序,以使二进制搜索能够按预期工作。(如果不是,则行为是不确定的。) 在进行此调用之前,必须根据指定的比较器(通过方

  • 问题内容: 我正在尝试了解linux syscallsched_setaffinity()的工作方式。这是我在这里提出的问题的后续。 我有本指南,该指南说明了如何使用syscall并有一个非常简洁(工作!)的示例。 因此,我下载了Linux 2.6.27.19 内核源代码。 我对包含该系统调用的行进行了“ grep”操作,得到了91个结果。没有希望。 最终,我试图了解内核如何 为特定内核 (或处理

  • 问题内容: 我刚刚了解到。它用于动态加载扩展的驱动程序。然后我们得到使用方法的连接。 那么整个事情如何运作? DriverManager类如何知道如何在不使用实际驱动程序的类名的情况下获取连接。 我们也可以将Class.forName()用于自定义应用程序…如果通过示例进行解释,我将非常高兴。 问题答案: 只需加载一个类,包括运行其静态初始化程序,如下所示: 您正在谈论的所有其余过程都是特定于JD