Java 字符串

Java String是最广泛使用的类之一。Java String类定义在java.lang包中。

Java String

  • 基本上,字符串是字符序列,但它不是原始类型。
  • 当我们在Java中创建字符串时,实际上创建了一个String类型的对象。
  • String是不可变对象,这意味着一旦创建就无法更改。
  • String是Java中唯一支持运算符重载的类。我们可以使用+运算符连接两个字符串。例如"a"+"b"="ab"
  • Java提供了两个用于字符串操作的有用类 – StringBufferStringBuilder

让我们继续学习Java String类的更多信息。

创建字符串的不同方法

在Java中创建字符串对象的方法有很多,以下是一些流行的方法。

  1. 使用字符串字面值

    这是创建字符串的最常见方式。在这种情况下,字符串字面值用双引号括起来。

    String str = "abc"; 
    

    当我们使用双引号创建一个字符串时,JVM会查找字符串池,看看是否已经存储了具有相同值的其他字符串。如果找到了,它就会返回对该字符串对象的引用,否则它会创建一个新的字符串对象,并将其存储在字符串池中。

  2. 使用 new 关键字

    我们可以使用 new 操作符创建 String 对象,就像创建任何普通的 Java 类一样。String 类中有多个构造函数,可以从字符数组、字节数组、StringBuffer 和 StringBuilder 获取字符串。

    String str  =  new String("abc");
    char[] a = {'a', 'b', 'c'};
    String str2  =  new String(a);
    

Java String 比较

String 类提供了 equals()equalsIgnoreCase() 方法来比较两个字符串。这些方法比较字符串的值,检查两个字符串是否相等。如果两个字符串相等,则返回 true,否则返回 false

package com.journaldev.string.examples;

/**
 * Java String Example
 * 
 * @author pankaj
 *
 */
public class StringEqualExample {

	public static void main(String[] args) {
		//创建两个字符串对象
		String s1 = "abc";
		String s2 = "abc";
		String s3 = "def";
		String s4 = "ABC";
		
		System.out.println(s1.equals(s2));//true
		System.out.println(s2.equals(s3));//false
		
		System.out.println(s1.equals(s4));//false;
		System.out.println(s1.equalsIgnoreCase(s4));//true
	}

}

上述程序的输出为:

true
false
false
true

字符串类实现了Comparable接口,提供了compareTo()compareToIgnoreCase()方法,用于按字典顺序比较两个字符串。两个字符串都被转换为Unicode值进行比较,并返回一个整数值,该值可以大于、小于或等于零。如果字符串相等,则返回零,否则返回大于或小于零的值。

package com.journaldev.examples;

/**
 * Java String compareTo Example
 * 
 * @author pankaj
 *
 */
public class StringCompareToExample {

	public static void main(String[] args) {
		
		String a1 = "abc";
		String a2 = "abc";
		String a3 = "def";
		String a4 = "ABC";
		
		System.out.println(a1.compareTo(a2));//0
		System.out.println(a2.compareTo(a3));//less than 0
		System.out.println(a1.compareTo(a4));//greater than 0
		System.out.println(a1.compareToIgnoreCase(a4));//0
	}

}

以上程序的输出是:

0
-3
32
0

请在String compareTo example中更详细地阅读此内容。

Java字符串方法

让我们详细了解一些常用的字符串类方法,并附有示例程序。

  1. split()

    Java String split() 方法用于使用给定表达式拆分字符串。split() 方法有两种变体。

    • split(String regex): 此方法使用给定的正则表达式拆分字符串,并返回字符串数组。
    • split(String regex, int limit): 此方法使用给定的正则表达式拆分字符串,并返回字符串数组,但数组元素受指定限制限制。如果指定的限制为 2,则该方法返回一个大小为 2 的数组。
    package com.journaldev.examples;
    
    /**
     * Java String split 示例
     * 
     * @author pankaj
     *
     */
    public class StringSplitExample {
    
    	public static void main(String[] args) {
    		
    		String s = "a/b/c/d";
    		String[] a1 = s.split("/");
    		System.out.println("只使用正则表达式拆分的字符串:");
    		for (String string : a1) {
    			System.out.println(string);
    		}
    		System.out.println("使用带限制的正则表达式拆分的字符串:");
    		String[] a2 = s.split("/", 2);
    		for (String string : a2) {
    			System.out.println(string);
    		}
    	}
    
    }
    

    上述程序的输出为:

    只使用正则表达式拆分的字符串:
    a
    b
    c
    d
    使用带限制的正则表达式拆分的字符串:
    a
    b/c/d
    
  2. contains(CharSequence s)

    Java String contains() 方法检查字符串是否包含指定的字符序列。如果字符串包含指定的字符序列,则此方法返回true,否则返回false。

    package com.journaldev.examples;
    
    /**
     * Java String contains() 示例
     * 
     * @author pankaj
     *
     */
    public class StringContainsExample {
    
    	public static void main(String[] args) {
    		String s = "Hello World";
    		
    		System.out.println(s.contains("W"));//true
    		System.out.println(s.contains("X"));//false
    	}
    
    }
    

    上述程序的输出为:

    true
    false
    
  3. length()

    Java String length()方法返回字符串的长度。

    package com.journaldev.examples;
    
    /**
     * Java String length
     * 
     * @author pankaj
     *
     */
    public class StringLengthExample {
    
    	public static void main(String[] args) {
    		
    		String s1 = "abc";
    		String s2 = "abcdef";
    		String s3 = "abcdefghi";
    		
    		System.out.println(s1.length());//3
    		System.out.println(s2.length());//6
    		System.out.println(s3.length());//9
    
    	}
    
    }
    
  4. replace()

    Java String replace() 方法用于将字符串的特定部分替换为其他字符串。replace() 方法有四个变体。

    • replace(char oldChar, char newChar):此方法将字符串中所有出现的旧字符替换为新字符。
    • replace(CharSequence target, CharSequence replacement):此方法将字符串中的每个目标字面值替换为替换字面值。
    • replaceAll(String regex, String replacement):此方法将字符串中与指定正则表达式匹配的所有子字符串的出现替换为指定的替换字符串。
    • replaceFirst(String regex, String replacement):此方法将字符串中与指定正则表达式匹配的第一个子字符串的出现替换为指定的替换字符串。
    package com.journaldev.examples;
    
    /**
     * Java String replace
     * 
     * @author pankaj
     *
     */
    public class StringReplaceExample {
    
    	public static void main(String[] args) {
    		
    		//replace(char oldChar,  char newChar)
    		String s = "Hello World";
    		s = s.replace('l', 'm');
    		System.out.println("替换 l 为 m 后:");
    		System.out.println(s);
    		
    		//replaceAll(String regex, String replacement)
    		String s1 = "Hello journaldev, Hello pankaj";
    		s1 = s1.replaceAll("Hello", "Hi");
    		System.out.println("替换后:");
    		System.out.println(s1);
    		
    		//replaceFirst(String regex, String replacement) 
    		String s2 = "Hello guys, Hello world";
    		s2 = s2.replaceFirst("Hello", "Hi");
    		System.out.println("替换后:");
    		System.out.println(s2);
    
    	}
    
    }
    

    上述程序的输出为:

    替换 l 为 m 后:
    Hemmo Wormd
    替换后:
    Hi journaldev, Hi pankaj
    替换后:
    Hi guys, Hello world
    
  5. format()

    Java Sting format()方法用于格式化字符串。Java String format()方法有两个变体。

    • format(Locale l, String format, Object… args): 此方法使用指定的区域设置、字符串格式和参数来格式化字符串。
    • format(String format, Object… args): 此方法使用指定的字符串格式和参数来格式化字符串。
    package com.journaldev.examples;
    
    import java.util.Locale;
    
    /**
     * Java String format
     * 
     * @author pankaj
     *
     */
    public class StringFormatExample {
    
    	public static void main(String[] args) {
    		
    		String s = "journaldev.com";
    		// %s is used to append the string
    		System.out.println(String.format("This is %s", s));
    		
    		//using locale as Locale.US
    		System.out.println(String.format(Locale.US, "%f", 3.14));
    	}
    }
    

    以上程序的输出为:

    This is journaldev.com
    3.140000
    
  6. substring()

    此方法根据指定的索引返回字符串的一部分。

    package com.journaldev.examples;
    
    /**
     * Java String substring
     *
     */
    public class StringSubStringExample {
    
    	public static void main(String[] args) {
    		
    		String s = "This is journaldev.com";
    		s = s.substring(8,18);
    		System.out.println(s);
    	}
    }
    

字符串连接

字符串连接是Java中非常基本的操作。可以通过使用“+”运算符或使用concat()方法来进行字符串连接。

package com.journaldev.examples;

/**
 * Java String concatenation
 * 
 * @author pankaj
 *
 */
public class StringConcatExample {

	public static void main(String[] args) {
		
		String s1 = "Hello";
		String s2 = "World";
		String s3 = s1 + s2;
		//使用+运算符
		System.out.println("Using + operator: ");
		System.out.println(s3);
		
		//使用concat方法
		System.out.println("Using concat method: ");
		System.out.println(s1.concat(s2));

	}

}

上面程序的输出是:

Using + operator: 
HelloWorld
Using concat method: 
HelloWorld

查看此文章以获取有关Java中字符串连接的更多信息:Java中的字符串连接

Java字符串池

内存管理是任何编程语言中最重要的方面。在Java中,字符串的内存管理与任何其他类有些不同。为了使Java更加内存高效,JVM引入了一个特殊的内存区域,称为字符串常量池。当我们创建一个字符串字面量时,它会检查字符串池中是否已经存在相同的字符串。如果存在,则返回字符串池中现有字符串的引用。让我们看一下下面的示例程序。

package com.journaldev.examples;

/**
 * Java String Pool Example
 * 
 */
public class StringPoolExample {

	public static void main(String[] args) {
		
		String a = "abc";
		String b = "abc";
		String c = "def";
		
		//相同引用
		if (a==b) {
			System.out.println("Both string refer to the same object");
		}
		
		//不同引用
		if (a==c) {
			System.out.println("Both strings refer to the same object");
		}else {
			System.out.println("Both strings refer to the different object");
		}

	}

}

上述程序的输出是:

Both string refer to the same object
Both strings refer to the different object

查看此文章以了解更多关于Java字符串池的信息。

String intern()方法

当我们使用字符串字面量创建字符串时,它将在字符串池中创建,但是如果我们使用相同值的new关键字创建字符串会发生什么?我们能把字符串从堆内存移到字符串池中吗?为此,使用intern()方法,并返回字符串对象的规范表示。当我们在使用new关键字创建的字符串对象上调用intern()方法时,它会检查池中是否已经有了相同值的字符串?如果是,则从池中返回该字符串对象的引用。如果没有,则在池中创建具有相同内容的新字符串,并返回引用。

package com.journaldev.examples;

/**
 * Java String intern
 * 
 * @author pankaj
 *
 */
public class StringInternExample {

	public static void main(String[] args) {
		
		String s1 = "pankaj";
		String s2 = "pankaj";
		String s3 = new String("pankaj");
		
		System.out.println(s1==s2);//true
		System.out.println(s2==s3);//false
		
		String s4 = s3.intern();
		System.out.println(s1==s4);//true

	}

}

查看此帖以了解有关Java字符串intern方法的更多信息。

字符串不可变性的好处

字符串不可变类的一些好处是:

  1. 字符串常量池,因此节省内存。
  2. 安全性,因为它无法更改。
  3. 线程安全
  4. 类加载安全

查看此帖以了解有关字符串不可变性的好处的更多信息。

Java 8字符串join()

A new static method join() has been added in String class in Java 8. This method returns a new String composed of copies of the CharSequence elements joined together with a copy of the specified delimiter. Let’s look at an example to understand it easily.

List<String> words = Arrays.asList(new String[]{"Hello", "World", "2019"});
String msg = String.join(" ", words);
System.out.println(msg);

输出: Hello World 2019

Java 9字符串方法

在Java 9版本中,字符串类中添加了两种方法。 它们是 – codePoints()和chars()。 这两种方法都返回IntStream对象,我们可以在其上执行一些操作。 让我们快速查看这些方法。

String s = "abc";

s.codePoints().forEach(x -> System.out.println(x));

s.chars().forEach(x -> System.out.println(x));

输出:

97
98
99
97
98
99

Java 11 String Class New Methods

Java 11版本中的String类新增了许多方法。

  • isBlank() – 如果字符串为空或仅包含空白代码点,则返回true,否则返回false。
  • lines() – 返回从该字符串中提取的行的流,以行终止符分隔。
  • strip(), stripLeading(), stripTrailing() – 用于从字符串中删除前导和尾随空格。
  • repeat() – 返回一个字符串,其值是给定次数重复此字符串的串联。

让我们看一个关于这些方法的示例程序。

package com.journaldev.strings;

import java.util.List;
import java.util.stream.Collectors;

/**
 * JDK 11 New Functions in String class
 * 
 * @author pankaj
 *
 */
public class JDK11StringFunctions {

	public static void main(String[] args) {
		// isBlank()
		String s = "abc";
		System.out.println(s.isBlank());
		s = "";
		System.out.println(s.isBlank());

		// lines()
		String s1 = "Hi\nHello\rHowdy";
		System.out.println(s1);
		List lines = s1.lines().collect(Collectors.toList());
		System.out.println(lines);

		// strip(), stripLeading(), stripTrailing()
		String s2 = "  Java,  \tPython\t ";
		System.out.println("#" + s2 + "#");
		System.out.println("#" + s2.strip() + "#");
		System.out.println("#" + s2.stripLeading() + "#");
		System.out.println("#" + s2.stripTrailing() + "#");

		// repeat()
		String s3 = "Hello\n";
		System.out.println(s3.repeat(3));
		s3 = "Co";
		System.out.println(s3.repeat(2));

	}

}

输出:

false
true
Hi
Hello
Howdy
[Hi, Hello, Howdy]
#  Java,  	Python	 #
#Java,  	Python#
#Java,  	Python	 #
#  Java,  	Python#
Hello
Hello
Hello

CoCo

关于Java String类、它的方法和字符串操作示例就介绍到这里。

您可以从我们的GitHub存储库中查看更多字符串示例。

参考:API文档

Source:
https://www.digitalocean.com/community/tutorials/java-string