我一直在尝试了解一些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