Java字符串类
在本教程中,我们将学习Java中的String,它是Java中最重要且使用最广泛的类之一。
Java字符串
Java中的String是字符序列,由驻留在java.lang包中的String类表示。
每当我们在Java中创建String时,都会将其创建为String类的对象。 String类提供了许多构造函数和方法来创建和操作字符串,在本文和后续文章中,我们将介绍一些最常用的String方法的应用。
用Java创建字符串
由于Java中的每个字符串都是String类的一个实例,因此当然可以使用new运算符创建一个新的String。除此之外,还可以通过将字符串文字分配给String实例来创建String。
因此,有两种方法可以创建String
使用字符串文字
使用新关键字
使用字符串文字创建Java String
创建字符串的最直接方法是将String文字分配给String的实例,例如
String str = "Hello";
在这种情况下," Hello"是字符串文字;用双引号引起来的一系列字符。每当Java编译器在代码中遇到字符串文字时,编译器都会使用其值创建一个String对象。
关于使用字符串文字创建字符串的一个有趣的观点是,对于字符串文字,JVM可能仅在内存中创建单个实例。这意味着,如果有多个具有相同值的字符串文字,它们都指向内存中的同一String引用。
为此,Java使用称为常量字符串池的结构。使用字符串文字创建字符串时,JVM会在此字符串池中查找以查找池中是否已存在具有相同值的字符串。如果已经存在这样的字符串,则创建的字符串也将引用相同的字符串,否则将创建一个新的字符串对象并将其存储在字符串池中。
例如,如果两个字符串的创建如下:
String str1 = “Hello”; String str2 = “Hello”;
使用下图说明如何将这些值存储在字符串池中。
我们也可以使用Java程序进行验证。在示例中,使用字符串文字创建了两个字符串,然后使用等号" =="运算符比较了它们的引用。
public class StringLiteral { public static void main(String[] args) { String str1 = "Hello"; String str2 = "Hello"; // checking if memory reference is same if(str1 == str2){ System.out.println("str1 and str2 are pointing to same memory reference"); }else{ System.out.println("str1 and str2 are not pointing to same memory reference"); } } }
输出:
str1 and str2 are pointing to same memory reference
使用新关键字创建字符串
我们还可以使用new运算符创建String实例。在String类中,有十三种构造函数,可让我们使用不同的来源(例如char数组,byte数组,StringBuffer,StringBuilder等)提供字符串的初始值。
String str = new String(); // empty character sequence String str1 = new String("Hello"); char[] helloArray = { 'H', 'e', 'l', 'l', 'o'}; String str2 = new String(helloArray);
请注意,即使使用两个字符串具有相同的值将它们作为单独的对象存储在内存中时,使用new运算符创建String时,实例也不会像String常量那样共享。
public class StringLiteral { public static void main(String[] args) { String str1 = new String("Hello"); String str2 = new String("Hello"); // checking if memory reference is same if(str1 == str2){ System.out.println("str1 and str2 are pointing to same memory reference"); }else{ System.out.println("str1 and str2 are not pointing to same memory reference"); } } }
输出:
str1 and str2 are not pointing to same memory reference
如我们所见,即使使用new运算符创建的两个String对象的值相同,现在也不会共享引用。
使用重载运算符的字符串连接
尽管String类具有用于连接String的concat()方法,但是通常使用+或者+ =运算符来连接String。
这两个运算符+和+ =在Java中已重载以使用String。
例如
String str = "Hello" + " " + "World"; System.out.println(str); // Output -- Hello World
String str1 = "Hello"; String str2 = "World"; str1 += " " + str2; System.out.println(str1); // prints Hello World
这里要注意的是String类是不可变的,这意味着一旦创建了String对象,就无法更改它。当我们使用诸如串联的String修改方法时,实际发生的情况是创建并返回了包含操作结果的新String。
要了解有关为什么Java中String不可变的更多信息,请查看这篇文章为什么Java中String不可变
如果经常修改字符串,则应考虑使用StringBuffer或者StringBuilder类,它们是String类的可变变体。
创建格式化的字符串
在String类中,有一个静态方法format()返回格式化的String。与仅使用String类的format()方法进行打印的printf不同,我们可以获得一个可以重用的String。
public class StringLiteral { public static void main(String[] args) { float rate = 5.5f; int duration = 3; double amount = 12000; String name = "Hyman"; String str = String.format("Amount of %6.2f " + "deposited at rate %2.1f " + "for the duration of %d years " + "by %s ", amount, rate, duration, name); System.out.println("Formatted String- " + str); } }
输出:
Formatted String- Amount of 12000.00 deposited at rate 5.5 for the duration of 3 years by Hyman
有关Java中的String的要点
我们创建的所有字符串都是Java中String类的实例。
可以使用String文字以及使用new运算符创建String实例。
每当Java编译器在代码中遇到字符串文字时,编译器都会使用其值创建一个String对象。
对于String文字,String对象存储在String池中。如果有多个具有相同值的String文字,它们将指向字符串池中的相同String引用。
使用新的运算符创建String实例时,即使值相同,也会创建单独的对象。
字符串连接可以使用" +"运算符完成,该运算符对String重载。由于字符串是String类的对象,因此使用相等运算符(==)比较两个字符串会比较它们的内存引用。要比较两个字符串的内容,应使用.equals()或者.equalsIgnoreCase()方法。
一旦构造了String,则Java中的String类是不可变的,该字符串的内容无法修改。
如果使用任何String修改方法(例如串联),则会创建并返回一个包含操作结果的新String。
String类在Java中定义为final,这意味着String类无法扩展。
Java String类方法
这是String类中方法的列表,以及可以使用这些方法的功能。
字符串的长度–要获取字符串的长度,可以使用String类的length()方法。参见此后的示例Java String length()方法及示例
比较两个字符串–要比较Java中的两个字符串,可以使用String类的equals(),equalsIgnoreCase(),compareTo()和compareToIgnoreCase()方法。要将一个String的区域与另一个String的指定区域进行比较,可以使用regionMatches()方法。参见本文后的示例-比较Java中的两个字符串– equals,compareTo()方法
在另一个字符串中搜索字符串–要在字符串中搜索子字符串,可以使用indexOf(),lastIndexOf(),contains()方法。请参阅本文中的示例-Java中的另一个字符串中的搜索字符串– indexOf,lastIndexOf包含方法
获取字符串的子字符串–要获取原始字符串的一部分,可以使用Java String类的substring()方法。请参见此后的示例Java String – substring()方法示例
从字符串获取特定字符–要通过索引获取字符串的特定字符,可以在Java中使用String类的charAt()方法。参见此后Java字符串charAt()方法中的示例
从字符串中删除空格–要删除开头和结尾的空格,请删除单词之间的空格,可以使用trim(),strip()和replaceAll()方法。参见本文后的示例-从Java中的字符串中删除空格– trim(),strip()
更改字符串的大小写–可以使用toLowerCase()和toUpperCase()方法将字符串的大小写更改为小写或者大写。参见此后Java字符串toLowerCase()和toUpperCase()方法中的示例
检查String是否为null,为空或者仅包含空格–可以使用isEmpty()或者isBlank()方法完成。请参阅本文中的示例-检查Java中的字符串是否为空或者空
intern()方法–返回字符串对象的规范表示形式。在此后Java String intern()方法中了解更多
split()方法–用于在给定正则表达式的匹配项周围拆分字符串。在此后Java字符串Split()方法中阅读更多内容
join()方法–用于使用指定的分隔符将传递的字符串连接在一起。在本博文中阅读更多内容Java String join()方法