为什么在 Java 中使用 HashMap 会失败?
Why does this fail using HashMap In Java?
import java.util.HashMap;
public class Main {
public static void main(String[] args) {
//Use inputs from https://pastebin.com/DMQ6xqKe and assign to s * t, as Whosebug limited character use
String s = "";
String t = "";
System.out.println(isAnagram(s, t));
}
public static boolean isAnagram(String s, String t) {
HashMap<Character, Integer> sMap = new HashMap<>();
HashMap<Character, Integer> tMap = new HashMap<>();
if(s.length() != t.length())
{
return false;
}
for(int i = 0; i < s.length(); i++)
{
if(sMap.containsKey(s.charAt(i)))
{
sMap.replace(s.charAt(i), sMap.get(s.charAt(i)) + 1);
}
else
{
sMap.put(s.charAt(i), 1);
}
}
for(int i = 0; i < t.length(); i++)
{
if(tMap.containsKey(t.charAt(i)))
{
tMap.replace(t.charAt(i), tMap.get(t.charAt(i)) + 1);
}
else
{
tMap.put(t.charAt(i), 1);
}
}
//FAILS BUT WHY!?!??!?
for(int i = 0; i < s.length(); i++)
{
System.out.println("outside " + sMap.get(s.charAt(i)) + " compared to " + tMap.get(s.charAt(i)));
if(sMap.get(s.charAt(i)) != tMap.get(s.charAt(i)))
{
System.out.println(sMap.get(s.charAt(i)) + " compared to " + tMap.get(s.charAt(i)));
return false;
}
}
//PASSES BUT PREVIOUS FAILS?!!?!??!
// if(!sMap.equals(tMap))
// {
// return false;
// }
return true;
}
}
此代码失败,但使用 .equals 的注释代码有效。我真的不明白。记录值,它们匹配但检查失败说不同的值。
== 运算符比较两个对象引用。 Object 类型的 equals 方法做同样的事情,但一些 类 用新功能覆盖该方法。例如,"x" == "x" 如果它们是不同的对象,则有可能失败。 "x".equals("x") 为真。
String x = "@";
String y = x;
x == y; // true, its the same reference.
希望这对您有所帮助?
是因为HashMap中equals方法的实现。在这个实现中
如果第一个映射中的每个 (key, value) 对等于第二个映射中的 (key, value) 对,则两个映射相等。在此实现中,如果两个键引用相同的对象并且两个值引用相同的对象,则两个键值对相等。这里是因为您的地图可能包含相同的键、值,但在不同的对象中它们不相等。
import java.util.HashMap;
public class Main {
public static void main(String[] args) {
//Use inputs from https://pastebin.com/DMQ6xqKe and assign to s * t, as Whosebug limited character use
String s = "";
String t = "";
System.out.println(isAnagram(s, t));
}
public static boolean isAnagram(String s, String t) {
HashMap<Character, Integer> sMap = new HashMap<>();
HashMap<Character, Integer> tMap = new HashMap<>();
if(s.length() != t.length())
{
return false;
}
for(int i = 0; i < s.length(); i++)
{
if(sMap.containsKey(s.charAt(i)))
{
sMap.replace(s.charAt(i), sMap.get(s.charAt(i)) + 1);
}
else
{
sMap.put(s.charAt(i), 1);
}
}
for(int i = 0; i < t.length(); i++)
{
if(tMap.containsKey(t.charAt(i)))
{
tMap.replace(t.charAt(i), tMap.get(t.charAt(i)) + 1);
}
else
{
tMap.put(t.charAt(i), 1);
}
}
//FAILS BUT WHY!?!??!?
for(int i = 0; i < s.length(); i++)
{
System.out.println("outside " + sMap.get(s.charAt(i)) + " compared to " + tMap.get(s.charAt(i)));
if(sMap.get(s.charAt(i)) != tMap.get(s.charAt(i)))
{
System.out.println(sMap.get(s.charAt(i)) + " compared to " + tMap.get(s.charAt(i)));
return false;
}
}
//PASSES BUT PREVIOUS FAILS?!!?!??!
// if(!sMap.equals(tMap))
// {
// return false;
// }
return true;
}
}
此代码失败,但使用 .equals 的注释代码有效。我真的不明白。记录值,它们匹配但检查失败说不同的值。
== 运算符比较两个对象引用。 Object 类型的 equals 方法做同样的事情,但一些 类 用新功能覆盖该方法。例如,"x" == "x" 如果它们是不同的对象,则有可能失败。 "x".equals("x") 为真。
String x = "@";
String y = x;
x == y; // true, its the same reference.
希望这对您有所帮助?
是因为HashMap中equals方法的实现。在这个实现中 如果第一个映射中的每个 (key, value) 对等于第二个映射中的 (key, value) 对,则两个映射相等。在此实现中,如果两个键引用相同的对象并且两个值引用相同的对象,则两个键值对相等。这里是因为您的地图可能包含相同的键、值,但在不同的对象中它们不相等。