I’m having a minor issue with Java String comparisons.
I’ve written a class which takes in a String and parses it into a custom tree type. I’ve written a toString class which then converts this tree back to a String again. As part of my unit tests I’m just checking that the String generated by the toString method is the same as the String that was parsed in the first place.
Here is my simple test with a few printouts so that we can see whats going on.
final String exp1 = "(a|b)";
final String exp2 = "((a|b)|c)";
final Node tree1 = Reader.parseExpression2(exp1);
final Node tree2 = Reader.parseExpression2(exp2);
final String t1 = tree1.toString();
final String t2 = tree2.toString();
System.out.println(":" + exp1 + ":" + t1 + ":");
System.out.println(":" + exp2 + ":" + t2 + ":");
System.out.println(exp1.compareToIgnoreCase(t1));
System.out.println(exp2.compareToIgnoreCase(t2));
System.out.println(exp1.equals(t1));
System.out.println(exp2.equals(t2));
Has the following output; (NB “:” – are used as delineators so I can ensure theres no extra whitespace)
:(a|b):(a|b):
:((a|b)|c):((a|b)|c):
-1
-1
false
false
Based on manually comparing the strings exp1 and exp2 to t1 and t2 respectively, they are exactly the same. But for some reason Java is insisting they are different.
This isn’t the obvious mistake of using == instead of .equals() but I’m stumped as to why two seemingly identical strings are different. Any help would be much appreciated 🙂
Does one of your strings have a null character within it? These might not be visible when you use
System.out.println(...).For example, consider this class:
When I ran this on Linux it gave me the following output:
(I also ran it on Windows, but the null character showed up as a space.)