Java中String的概念与应用

引言:

        在Java编程语言中,String(字符串)是一个非常重要且广泛使用的类。String类代表不可变的字符序列,它提供了一系列方法来操作字符串。本文将详细描述Java中String的概念、特性以及在实际开发中的应用。

一、String类的声明与初始化

在Java中,可以通过以下两种方式来声明和初始化String对象:

  1. 使用字符串字面值直接初始化
    String str1 = "Hello, Java!";
  2. 使用new关键字构造String对象:
    String str2 = new String("Hello, Java!");

无论使用哪种方式,我们都可以对String对象进行各种操作。

二、String的不可变性

        String类的一个重要特点就是不可变性,即一旦创建了String对象,就无法再修改它的值。这是因为String类是使用字符数组来存储字符串的,而数组的长度是固定的。如果需要修改字符串,实际上是创建一个新的String对象。

例如:

String str = "Hello";
str = str + ", Java!";

上述代码中,实际上创建了两个String对象,分别是"Hello"和"Hello, Java!"。这种不可变性的特点使得String对象在多线程环境下是安全的。

三、String对象的比较

        String对象的比较可以通过==运算符和equals()方法进行。这两种比较方式有一些不同之处。

1、==运算符

        用于比较两个String对象的引用是否相等,即它们是否指向同一个内存地址。当两个String对象使用==运算符进行比较时,比较的是它们的引用地址。

2、equals()方法

        用于比较两个String对象的内容是否相等。该方法会比较字符串的每一个字符,如果字符序列完全相同,则返回true;否则返回false

示例代码如下:

public class StringComparisonExample {
    public static void main(String[] args) {
        String str1 = "hello";
        String str2 = "hello";
        String str3 = new String("hello");

        // 使用==运算符进行比较
        System.out.println(str1 == str2); // 输出:true,因为str1和str2引用了同一个字符串常量池中的对象
        System.out.println(str1 == str3); // 输出:false,因为str3是通过new关键字创建的新对象

        // 使用equals()方法进行比较
        System.out.println(str1.equals(str2)); // 输出:true,因为字符串内容相同
        System.out.println(str1.equals(str3)); // 输出:true,因为字符串内容相同
    }
}

        在上面的示例中,我们创建了三个String对象:str1和str2直接赋值为相同的"hello"字符串,而str3使用new关键字创建了一个新的对象。然后我们使用==运算符和equals()方法进行比较。

        使用==运算符比较str1和str2时返回true,因为它们引用了同一个字符串常量池中的对象。而比较str1和str3时返回false,因为str3是通过new关键字创建的新对象。

        使用equals()方法比较str1和str2时返回true,因为它们的内容完全相同。比较str1和str3时也返回true,因为字符串内容相同,equals()方法比较的是字符串的内容。

        需要注意的是,在使用equals()方法比较之前,需要确保对象不为null,否则会抛出NullPointerException异常。

3、int compareTo(String s) 方法:按照字典序进行比较

        与equals不同的是,equals返回的是boolean类型,而compareTo返回的是int类型。具体比较方式:
        1. 先按照字典次序大小比较,如果出现不等的字符,直接返回这两个字符的大小差值
        2. 如果前k个字符相等(k为两个字符长度最小值),返回值两个字符串长度差值

public static void main(String[] args) {
    String s1 = new String("abc");
    String s2 = new String("ac");
    String s3 = new String("abc");
    String s4 = new String("abcdef");
    System.out.println(s1.compareTo(s2)); // 不同输出字符差值-1
    System.out.println(s1.compareTo(s3)); // 相同输出 0
    System.out.println(s1.compareTo(s4)); // 前k个字符完全相同,输出长度差值 -3
}


4. int compareToIgnoreCase(String str) 方法

        与compareTo方式相同,但是忽略大小写比较

public static void main(String[] args) {
    String s1 = new String("abc");
    String s2 = new String("ac");
    String s3 = new String("ABc");
    String s4 = new String("abcdef");
    System.out.println(s1.compareToIgnoreCase(s2)); // 不同输出字符差值-1
    System.out.println(s1.compareToIgnoreCase(s3)); // 相同输出 0
    System.out.println(s1.compareToIgnoreCase(s4)); // 前k个字符完全相同,输出长度差值 -3
}

四、字符串查找

字符串查找可以使用以下方法:

1、int indexOf(int ch)

返回指定字符在字符串中第一次出现处的索引。如果不存在该字符,则返回-1。

2、int indexOf(int ch, int fromIndex)

从指定的索引位置开始,返回指定字符在字符串中第一次出现处的索引。如果不存在该字符,则返回-1。

3、int indexOf(String str)

返回指定子字符串在字符串中第一次出现处的索引。如果不存在该字符串,则返回-1。

4、int indexOf(String str, int fromIndex)

从指定的索引位置开始,返回指定子字符串在字符串中第一次出现处的索引。如果不存在该字符串,则返回-1。

5、int lastIndexOf(int ch)

返回指定字符在字符串中最后一次出现处的索引。如果不存在该字符,则返回-1。

6、int lastIndexOf(int ch, int fromIndex)

从指定的索引位置开始,返回指定字符在字符串中最后一次出现处的索引。如果不存在该字符,则返回-1。

7、int lastIndexOf(String str)

返回指定子字符串在字符串中最后一次出现处的索引。如果不存在该子字符串,则返回-1。

8、int lastIndexOf(String str, int fromIndex)

从指定的索引位置开始,返回指定子字符串在字符串中最后一次出现处的索引。如果不存在该子字符串,则返回-1。

9、boolean contains(CharSequence s)

判断字符串是否包含指定的子字符串。如果包含,返回true;否则返回false。

10、char charAt(int index)

返回index位置上字符,如果index为负数或者越界,抛出 IndexOutOfBoundsException异常

示例代码如下:

public class StringSearchExample {
    public static void main(String[] args) {
        String str1 = "hello world";
        String str2 = "world";
        String str3 = "Java";
        
        // 使用 indexOf 方法查找字符和字符串
        System.out.println(str1.indexOf('l')); // 输出:2,因为第一个 'l' 的索引为 2
        System.out.println(str1.indexOf('z')); // 输出:-1,因为字符串中不存在字符 'z'
        System.out.println(str1.indexOf(str2)); // 输出:6,因为字符串 "world" 在字符串中的索引为 6
        System.out.println(str1.indexOf(str2, 7)); // 输出:-1,因为从索引 7 开始向后,字符串中不存在 "world"
        
        // 使用 lastIndexOf 方法查找字符和字符串
        System.out.println(str1.lastIndexOf('l')); // 输出:9,因为最后一个 'l' 的索引为 9
        System.out.println(str1.lastIndexOf('z')); // 输出:-1,因为字符串中不存在字符 'z'
        System.out.println(str1.lastIndexOf(str2)); // 输出:6,因为字符串 "world" 在字符串中的最后一个索引为 6
        System.out.println(str1.lastIndexOf(str2, 7)); // 输出:6,因为从索引 7 开始向前,最后一个 "world" 的索引为 6
        
        // 使用 contains 方法查找是否包含指定子字符串
        System.out.println(str1.contains(str3)); // 输出:false,因为字符串 "hello world" 中不包含子字符串 "Java"
        System.out.println(str1.contains(str2)); // 输出:true,因为字符串 "hello world" 中包含子字符串 "world"
    }
}

        在上述示例中,我们演示了如何使用Java提供的字符串查找方法。使用indexOf方法和lastIndexOf方法可以在字符串中查找指定的字符或子字符串,分别返回第一次出现和最后一次出现的索引位置。使用contains方法可以判断一个字符串是否包含指定的子字符串。

五、字符串转化

1、数值和字符串转化

将数值转为字符串:可以使用 String 类的静态方法 valueOf() 或数值类型对应的 toString() 方法。

int number = 123;
String str1 = String.valueOf(number);
String str2 = Integer.toString(number);
System.out.println(str1); // 输出: "123"
System.out.println(str2); // 输出: "123"

2、将字符串转为数值

可以使用 IntegerDoubleFloat 等包装类的 parseInt()parseDouble()parseFloat() 等静态方法来实现。

String str = "456";
int intValue = Integer.parseInt(str);
double doubleValue = Double.parseDouble(str);
System.out.println(intValue); // 输出: 456
System.out.println(doubleValue); // 输出: 456.0

3、大小写转换

将字符串转为大写:使用 toUpperCase() 方法。

String str = "hello world";
String uppercase = str.toUpperCase();
System.out.println(uppercase); // 输出: "HELLO WORLD"

将字符串转为小写:使用 toLowerCase() 方法。

String str = "HELLO WORLD";
String lowercase = str.toLowerCase();
System.out.println(lowercase); // 输出: "hello world"

4、字符串转数组

将字符串转为字符数组:使用 toCharArray() 方法。

String str = "Hello World";
char[] charArray = str.toCharArray();
System.out.println(charArray); // 输出: [H, e, l, l, o,  , W, o, r, l, d]

5、格式化

字符串格式化:可以使用 String 类的 format() 方法进行字符串格式化操作。它使用类似于 C 语言中的 printf 的格式化语法。

public static void main(String[] args) {
String s = String.format("%d-%d-%d", 2019, 9,14);
System.out.println(s);// 输出: 2019-9-14
}

六、字符串替换

对于字符串替换操作,可以使用 replace() 方法来实现。这个方法接受两个参数,第一个参数是要被替换的字符序列(可以是单个字符或字符串),第二个参数是用来替换的新字符序列(可以是单个字符或字符串)。

下面是一个简单的Java示例:

String originalString = "Hello, World! Hello, Java!";
String newString = originalString.replace("Hello", "Hi");
System.out.println(newString);  // 输出: "Hi, World! Hi, Java!"

在上面的示例中,原始字符串中的所有"Hello"都被替换为"Hi"。

        需要注意的是,replace() 方法返回一个新的字符串,原始字符串保持不变。如果你需要对原始字符串进行替换操作,可以直接将结果赋值给原始字符串变量。

七、字符串拆分

1、split()方法接受一个参数:String[] split(String regex)

        使用split()方法来将字符串拆分为子串,split()方法接受一个正则表达式作为参数,用以描述拆分字符串的规则。拆分后的子串将被放入一个字符串数组中返回。

以下是一个简单的示例,演示了如何使用split()方法将一个句子按照空格拆分成单词:

String sentence = "The quick brown fox";
String[] words = sentence.split(" "); // 使用空格作为分割符
for (String word : words) {
    System.out.println(word);
}

运行上述代码将输出如下内容:

The
quick
brown
fox

        如果要按照其他规则进行拆分,可以根据具体需要在split()方法中使用不同的正则表达式。例如,如果要按照逗号进行拆分,可以使用split(",")

        需要注意的是,split()方法返回的是一个字符串数组,你可以对其进行操作或遍历其中的元素以获取拆分后的子串。

2、split()方法接受两个个参数:String[] split(String regex, int limit)

  split()方法可以接受两个参数,第一个参数是用于拆分字符串的正则表达式,第二个参数是限制拆分后的子串数量的上限。这个参数限制了拆分后所得到的字符串数组的长度。

下面是split()方法带有两个参数的简单示例:

String str = "apple,banana,grape,orange";
String[] parts = str.split(",", 2); // 使用逗号作为分隔符,限制拆分出两段
for (String part : parts) {
    System.out.println(part);
}

在这个示例中,拆分的结果将会受到第二个参数的限制,只拆分出两段字符串:

apple
banana,grape,orange

这个功能在需要控制拆分后子串数量的场景中非常有用。

八、 字符串截取

   substring()方法来截取字符串的子串,它可以根据指定的索引位置来提取子串。substring()方法有两种重载形式:

1、substring(int beginIndex)

从指定的开始索引位置开始,提取到字符串的末尾。

2、substring(int beginIndex, int endIndex)

从指定的开始索引位置开始,提取到指定的结束索引位置(不包括结束索引位置对应的字符)。

以下是使用substring()方法截取字符串的示例:

String str = "Hello, World!";
String substr1 = str.substring(7); // 从索引位置7开始截取到末尾
String substr2 = str.substring(7, 12); // 从索引位置7开始截取到索引位置12(不包括12)
System.out.println(substr1); // 输出:World!
System.out.println(substr2); // 输出:World

        需要注意的是,在Java中,字符串的索引位置从0开始。例如,第一个字符的索引是0,第二个字符的索引是1,依此类推。

        另外,当传入的索引位置超出了字符串的范围时,将会抛出IndexOutOfBoundsException异常。因此,在实际使用时,请确保传入的索引值是有效的。

九、其他操作方法

   trim()方法被用于删除字符串的首尾空格。它返回一个新的字符串,去除了原始字符串首尾的空格。

以下是使用trim()方法去除字符串首尾空格的示例:

String str = "   Hello, World!   ";
String trimmedStr = str.trim();
System.out.println(trimmedStr); // 输出:Hello, World!

        在这个示例中,原始字符串" Hello, World! "trim()方法处理后,生成了一个新的字符串"Hello, World!",其中的首尾空格被删除了。

        需要注意的是,trim()方法仅会删除字符串首尾的空格,而不会删除字符串内部的空格。例如," Hello, World! "的首尾空格会被删除,但字符串内部的空格是保留的。

        

十、String与StringBuilder/StringBuffer的比较

        在大量的字符串拼接操作中,使用String的不可变性会导致频繁创建新的String对象,从而消耗大量的内存和系统资源。为了解决这个问题,Java还提供了StringBuilderStringBuffer两个类,它们都提供了可变的字符串操作。

       StringBuilderStringBuffer的用法基本相似,但StringBuilder的性能更好,因为它是非线程安全的,而StringBuffer是线程安全的。因此,在单线程环境下,我们通常使用StringBuilder类。

总结:
        String类是Java语言中非常重要且常用的类之一,它提供了许多方法来操作字符串。虽然String对象是不可变的,但我们可以通过使用StringBuilder或StringBuffer来实现可变的字符串操作。在实际应用中,根据需求选择合适的字符串操作方式,可以提高代码的效率和性能。

        希望本篇博客能够对Java中String的概念和应用有一个清晰的了解,以便在开发过程中更好地利用和操作字符串。如果您有任何问题或建议,欢迎留言交流!

你可能感兴趣的:(JavaSE入门,java,开发语言)