在面试中,我遇到了一个问题,需要写一个方法来检查相似单词而不考虑大小写。
我的回答是使用每对字符的ASCII值之差。但是回家后,当我查看String.class中的实际实现时,我感到困惑——为什么它要这样实现!
我尝试比较内置方法和我的自定义方法,如下所示-
public class EqualsIgnoreCase {
public static void main(String[] args) {
String str1 = "Srimant @$ Sahu 959s";
String str2 = "sriMaNt @$ sAhu 959s";
System.out.println("Avg millisecs with inbuilt () - " + averageOfTenForInbuilt(str1, str2));
System.out.println("\nAvg millisecs with custom () - " + averageOfTenForCustom(str1, str2));
}
public static int averageOfTenForInbuilt(String str1, String str2) {
int avg = 0;
for (int itr = 0; itr < 10; itr++) {
long start1 = System.currentTimeMillis();
for (int i = 0; i < 100000; i++) {
str1.equalsIgnoreCase(str2);
}
avg += System.currentTimeMillis() - start1;
}
return avg / 10;
}
public static int averageOfTenForCustom(String str1, String str2) {
int avg = 0;
for (int itr = 0; itr < 10; itr++) {
long start2 = System.currentTimeMillis();
for (int i = 0; i < 100000; i++) {
isEqualsIgnoreCase(str1, str2);
}
avg += System.currentTimeMillis() - start2;
}
return avg / 10;
}
public static boolean isEqualsIgnoreCase(String str1, String str2) {
int length = str1.length();
if (str2.length() != length) {
return false;
}
for (int i = 0; i < length; i++) {
char ch1 = str1.charAt(i);
char ch2 = str2.charAt(i);
int val = Math.abs(ch1 - ch2);
if (val != 0) {
if (isInAlphabetsRange(ch1, ch2)) {
if (val != 32) {
return false;
}
} else {
return false;
}
}
}
return true;
}
public static boolean isInAlphabetsRange(char ch1, char ch2) {
return (((ch1 <= 122 && ch1 >= 97) || (ch1 <= 90 && ch1 >= 65)) && ((ch2 <= 122 && ch2 >= 97) || (ch2 <= 90 && ch2 >= 65)));
}
}
输出-
使用内置()的平均毫秒数-14
使用自定义()的平均毫秒数-5
我发现内置方法效率低下,因为有许多检查和方法调用。这样的实现是否有任何特定原因?或者我的逻辑有什么问题吗?
非常感谢您的任何建议!
averageOfTenForCustom
,然后再调用averageOfTenForInbuilt
:由于 JVM 启动的原因,你的实际结果可能会有所不同。 - sp00m