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 方法完成的。执行此方法时必须遵循以下规则:

  1. 自反 - 如果将 A 与 A 进行比较,return true
  2. 对称 - 如果 A 等于 B,则 B 必须等于 A
  3. 传递性 - 如果 A 等于 B 且 B 等于 C,则 A 必须等于 C
  4. 如果将 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

希望对您有所帮助。