Java: 捕获字符串的最后一个字母
Java: catching last letter of string
我正在尝试显示一个名称和一个区域,其中名称的最后一个字母等于该区域的最后一个字母。以下是我不太正确的尝试:
static void oneLine(String name, String region,
int area, long pop, long gdp)
{
if (name.substring(name.length() - 1) == name.substring(region.length()-1))
{
System.out.println(name+" "+region);
}
}
使用 equals(Object anObject) 方法而不是使用 ==
运算符
if (name.substring(name.length() - 1).equals(region.substring(region.length()-1))){
System.out.println(name+" "+region);
}
有关详细信息,请参阅 Why would you use String.Equals over ==。
两件事:
你在平等的两边得到 name.substring
if (name.substring(name.length() - 1) == name.substring(region.length()-1))
// ↑ name again!!!
切勿将字符串与 Java
中的 ==
进行比较
if (name.substring(name.length() - 1).equals(region.substring(region.length()-1)))
我建议不要创建一个字符长的子字符串。
if (name.charAt(name.length() - 1) == region.charAt(region.length() - 1)) {
System.out.println(name + " " + region);
}
编辑
我不知道为什么人们决定投反对票,但我会添加一个解释,为什么我建议不要创建一个字符长的子字符串。
if (name.substring(name.length() - 1).equals(region.substring(region.length()-1))
substring
始终创建一个新的 String 对象。所以这里创建了两个新的 String 对象(一个用于两个字符串的最后一个字符)只是为了相等比较而创建的。它们立即有资格进行下一次可能的垃圾收集,因为它们以后不会被使用。
substring方法的相关部分return (beginIndex == 0) ? this : new String(value, beginIndex, subLen)
if (name.charAt(name.length() - 1) == region.charAt(region.length() - 1))
charAt
returns 对该位置字符的引用。所以相等比较是在那个字符串实例的一个字符上完成的。
charAt方法的相关部分return value[index]
(值为String实例中的char值[])。
首先,您在条件的两边都使用了名称。而是使用:
if (name.endsWith(region.substring(region.length()-1))) { ... }
其次,如果您将 ==
与 String
一起使用,则您使用的是身份。这意味着如果您使用相同的物理 String
对象,这只会导致 true 。所以:
new String("Something") == new String("Something") // Evaluates to false
解决这个问题的方法是使用等值。这是通过使用 equals
方法完成的。执行此方法时必须遵循以下规则:
- 自反 - 如果将 A 与 A 进行比较,return true
- 对称 - 如果 A 等于 B,则 B 必须等于 A
- 传递性 - 如果 A 等于 B 且 B 等于 C,则 A 必须等于 C
- 如果将 A 与 null 进行比较,则始终 return 为假。
String
class 以这种方式实现,它会检查字符是否相同。所以:
new String("Something").equals(new String("Something")) // Evaluates to true
// BUT
new String("Something").equals(new String("something")) // Evaluates to false - due to case sensitivity.
// SO
new String("Something").equalsIgnoreCase(new String("something")) // Evaluates to true
希望对您有所帮助。
我正在尝试显示一个名称和一个区域,其中名称的最后一个字母等于该区域的最后一个字母。以下是我不太正确的尝试:
static void oneLine(String name, String region,
int area, long pop, long gdp)
{
if (name.substring(name.length() - 1) == name.substring(region.length()-1))
{
System.out.println(name+" "+region);
}
}
使用 equals(Object anObject) 方法而不是使用 ==
运算符
if (name.substring(name.length() - 1).equals(region.substring(region.length()-1))){
System.out.println(name+" "+region);
}
有关详细信息,请参阅 Why would you use String.Equals over ==。
两件事:
你在平等的两边得到
name.substring
if (name.substring(name.length() - 1) == name.substring(region.length()-1)) // ↑ name again!!!
切勿将字符串与
Java
中的
==
进行比较
if (name.substring(name.length() - 1).equals(region.substring(region.length()-1)))
我建议不要创建一个字符长的子字符串。
if (name.charAt(name.length() - 1) == region.charAt(region.length() - 1)) {
System.out.println(name + " " + region);
}
编辑
我不知道为什么人们决定投反对票,但我会添加一个解释,为什么我建议不要创建一个字符长的子字符串。
if (name.substring(name.length() - 1).equals(region.substring(region.length()-1))
substring
始终创建一个新的 String 对象。所以这里创建了两个新的 String 对象(一个用于两个字符串的最后一个字符)只是为了相等比较而创建的。它们立即有资格进行下一次可能的垃圾收集,因为它们以后不会被使用。
substring方法的相关部分return (beginIndex == 0) ? this : new String(value, beginIndex, subLen)
if (name.charAt(name.length() - 1) == region.charAt(region.length() - 1))
charAt
returns 对该位置字符的引用。所以相等比较是在那个字符串实例的一个字符上完成的。
charAt方法的相关部分return value[index]
(值为String实例中的char值[])。
首先,您在条件的两边都使用了名称。而是使用:
if (name.endsWith(region.substring(region.length()-1))) { ... }
其次,如果您将 ==
与 String
一起使用,则您使用的是身份。这意味着如果您使用相同的物理 String
对象,这只会导致 true 。所以:
new String("Something") == new String("Something") // Evaluates to false
解决这个问题的方法是使用等值。这是通过使用 equals
方法完成的。执行此方法时必须遵循以下规则:
- 自反 - 如果将 A 与 A 进行比较,return true
- 对称 - 如果 A 等于 B,则 B 必须等于 A
- 传递性 - 如果 A 等于 B 且 B 等于 C,则 A 必须等于 C
- 如果将 A 与 null 进行比较,则始终 return 为假。
String
class 以这种方式实现,它会检查字符是否相同。所以:
new String("Something").equals(new String("Something")) // Evaluates to true
// BUT
new String("Something").equals(new String("something")) // Evaluates to false - due to case sensitivity.
// SO
new String("Something").equalsIgnoreCase(new String("something")) // Evaluates to true
希望对您有所帮助。