一、Java 字符串比较

1、equals用法

String类覆盖了Object类的equals()方法,并提供了自己的实现,它根据它们的内容比较两个字符串的相等性。

equals() 方法用于将字符串与指定的对象比较。

语法


public boolean equals(Object anObject)


参数

  • anObject -- 与字符串进行比较的对象。

返回值

如果给定对象与字符串相等,则返回 true;否则返回 false。

示例:

比较两个字符串的相等性

String str1 = new String("Hello"); 
String str2 = new String("Hi"); 
String str3 = new String("Hello");

boolean b1,   b2;

b1  = str1.equals(str2); // false will be  assigned to b1 
b2  = str1.equals(str3); // true will be  assigned to b2

2、==用法

对于引用类型的变量来说,==比较的两个引用对象的地址是否相等。
==操作符总是比较内存中两个对象的引用。
str1 == str2和str1 == str3将返回false,因为str1,str2和str3是内存中三个不同String对象的引用。
对于基本类型变量来说,只能使用 == ,因为基本类型的变量没有方法。使用==比较是值比较。

二、比较

要根据字符的Unicode值比较两个字符串,请使用compareTo()方法。它的签名是

public int compareTo(String anotherString)

它返回一个整数,它可以是0(零),正整数或负整数。

该方法返回这两个字符的Unicode值之间的差异。

例如,“a”.compareTo(“b”)将返回-1。 Unicode的Unicode值为97,b为98。它返回差值97 - 98,它是-1。

以下是字符串比较的示例:

"abc".compareTo("abc") will  return  0
"abc".compareTo("xyz") will  return  -23  (value of  "a" -  "x") 
"xyz".compareTo("abc") will  return  23  (value of  "x" -  "a")

以下代码显示如何进行字符串比较。

public class Main {
  public static void main(String[] args) {
    String apple = new String("Apple");
    String orange = new String("Orange");
    System.out.println(apple.equals(orange));
    System.out.println(apple.equals(apple));
    System.out.println(apple == apple);
    System.out.println(apple == orange);
    System.out.println(apple.compareTo(apple));
    System.out.println(apple.compareTo(orange));
  }
}

上面的代码生成以下结果。

三、StringBuilder/StringBuffer

StringBuilder和StringBuffer是String类的伴随类。

它们表示一个可变的字符序列。

StringBuffer是线程安全的,StringBuilder不是线程安全的。

两个类都有相同的方法,除了StringBuffer中的所有方法都是同步的。

StringBuilder对象是可修改的字符串。 StringBuilder类包含四个构造函数:

StringBuilder()
StringBuilder(CharSequence seq)
StringBuilder(int capacity)
StringBuilder(String str)

no-args构造函数创建一个默认容量为16的空StringBuilder。

第二个构造函数使用CharSequence对象作为参数。

它创建一个StringBuilder对象,其内容与指定的CharSequence相同。

第三个构造函数使用int作为参数;它创建一个空的StringBuilder对象,其初始容量与指定的参数相同。

以下是创建StringBuilder对象的一些示例:

StringBuilder sb1  = new StringBuilder();
StringBuilder sb2  = new StringBuilder("Here is  the   content");
StringBuilder sb3  = new StringBuilder(200);

append()方法将文本添加到StringBuilder的结尾。它需要许多类型的参数。

insert()和delete()修改其内容。

1、长度和容量

StringBuilder类有两个属性:length和capacity。

它的长度是指其内容的长度,而其容量是指它可以容纳而不分配新的内存的最大字符数。

length()和capacity()方法分别返回其长度和容量。例如,

public class Main {
  public static void main(String[] args) {
    StringBuilder sb = new StringBuilder(200); // Capacity:200, length:0
    sb.append("Hello"); // Capacity:200, length:5
    int len = sb.length(); // len is assigned 5
    int capacity = sb.capacity(); // capacity is assigned 200

  }
}

2、转换为字符串

我们可以通过使用其toString()方法将StringBuilder的内容作为String。

public class Main {
  public static void main(String[] args) {
    // Create a String object
    String s1 = new String("Hello");

    // Create a StringBuilder from of the String object s1
    StringBuilder sb = new StringBuilder(s1);

    // Append " Java" to the StringBuilder"s content
    sb.append(" Java"); // Now, sb contains "Hello Java"

    // Get a String from the StringBuilder
    String s2 = sb.toString(); // s2 contains "Hello Java"

  }
}

StringBuilder有一个setLength()方法,它的新长度作为参数。如果新长度大于旧长度,则额外位置用空字符填充(空字符为\ u0000)。

如果新长度小于旧长度,则其内容将被截断以适应新长度。

public class Main {
  public static void main(String[] args) {
    // Length is 5
    StringBuilder sb = new StringBuilder("Hello");

    // Now the length is 7 with last two characters as null character "\u0000"
    sb.setLength(7);

    // Now the length is 2 and the content is "He"
    sb.setLength(2);

  }
}

例子

StringBuilder类有一个reverse()方法,它用相同的字符序列替换其内容,但顺序相反。

以下代码显示了StringBuilder类的一些方法的使用。

public class Main {
  public static void main(String[] args) {
    // Create an empty StringBuffer
    StringBuilder sb = new StringBuilder();
    printDetails(sb);

    // Append "good"
    sb.append("good");
    printDetails(sb);

    // Insert "Hi " in the beginning
    sb.insert(0, "Hi ");
    printDetails(sb);

    // Delete the first o
    sb.deleteCharAt(1);
    printDetails(sb);

    // Append "  be  with  you"
    sb.append(" be  with  you");
    printDetails(sb);

    // Set the length to 3
    sb.setLength(3);
    printDetails(sb);

    // Reverse the content
    sb.reverse();
    printDetails(sb);
  }

  public static void printDetails(StringBuilder sb) {
    System.out.println("Content: \"" + sb + "\"");
    System.out.println("Length: " + sb.length());
    System.out.println("Capacity: " + sb.capacity());

    // Print an empty line to separate results
    System.out.println();
  }
}

上面的代码生成以下结果。

java 字符串 斜线 java字符串equals_java 字符串 斜线

3、字符串连接运算符(+)

我们经常使用+运算符将字符串,原始类型值或对象连接到另一个字符串。

例如,

String str = "X" + "Y" + 12.56;

为了优化字符串连接操作,编译器用一个使用StringBuilder的语句替换字符串连接。

String str = new StringBuilder().append("X").append("Y").append(12.56).toString();

 四、Swtich用法

switch-expression使用String类型。如果switch-expression为null,则抛出NullPointerException。
case标签必须是字符串文字。我们不能在case标签中使用String变量。
以下是在switch语句中使用String的示例:

public class Main {
  public static void main(String[] args) {
    String status = "off";
    switch (status) {
    case "on":
      System.out.println("Turn on"); 
    case "off":
      System.out.println("Turn off");
      break;
    default:
      System.out.println("Unknown command");
      break;
    }
  }
}

五、字符串搜索

startsWith()检查字符串是否以指定的参数开头,而endsWith()检查字符串是否以指定的字符串参数结尾。两个方法都返回一个布尔值。

public class Main {
  public static void main(String[] args) {
    String str = "This is a test";

    // Test str, if it starts with "This"
    if (str.startsWith("This")) {
      System.out.println("String starts with  This");
    } else {
      System.out.println("String does  not  start with  This");
    }

    // Test str, if it ends with "program"
    if (str.endsWith("program")) {
      System.out.println("String ends  with  program");
    } else {
      System.out.println("String does  not  end  with  program");
    }

  }
}

我们可以使用indexOf()和lastIndexOf()方法获取另一个字符串中的字符或字符串的索引。例如:

public class Main {
  public static void main(String[] args) {
    String str = new String("Apple");

    int index = str.indexOf("p"); // index will have a value of 1
    System.out.println(index);
    
    index = str.indexOf("pl"); // index will have a value of 2
    System.out.println(index);
    index = str.lastIndexOf("p"); // index will have a value of 2
    System.out.println(index);
    
    index = str.lastIndexOf("pl"); // index will have a value of 2
    System.out.println(index);
    
    index = str.indexOf("k"); // index will have a value of -1
    System.out.println(index);
  }
}

indexOf()方法从字符串的开头开始搜索字符或字符串,并返回第一个匹配的索引。
lastIndexOf()方法从末尾匹配字符或字符串,并返回第一个匹配的索引。
如果在字符串中没有找到字符或字符串,这些方法返回-1。