Java字符串
Java String是使用最广泛的类之一。
Java String类在java.lang
包中定义。
Java字符串
基本上,字符串是一个字符序列,但不是原始类型。
当我们在java中创建一个字符串时,它实际上会创建一个String类型的对象。
字符串是不可变的对象,这意味着一旦创建它就不能更改。
字符串是Java中唯一支持运算符重载的类。
我们可以使用+运算符连接两个字符串。
例如"" a" +" b" =" ab""。Java为String操作提供了两个有用的类– StringBuffer和StringBuilder。
让我们继续学习有关Java String类的更多信息。
创建字符串的不同方法
在Java中创建字符串对象的方法有很多,下面列出了一些流行的方法。
- 使用字符串文字这是创建字符串的最常见方法。
在这种情况下,字符串文字用双引号引起来。
当我们使用双引号创建String时,JVM会在String池中查找是否以相同的值存储了其他String。
如果找到,它将仅返回对该String对象的引用,否则它将创建一个具有给定值的新String对象并将其存储在String池中。
- 使用new关键字我们可以使用new运算符来创建String对象,就像任何普通的java类一样。
String类中有几种构造函数可用于从char数组,字节数组,StringBuffer和StringBuilder中获取String。
Java字符串比较
字符串类提供equals()
和equalsIgnoreCase()
方法来比较两个字符串。
这些方法比较字符串的值以检查两个字符串是否相等。
如果两个字符串相等,则返回" true",否则返回" false"。
String str = "abc";
上面程序的输出是:
String str = new String("abc"); char[] a = {'a', 'b', 'c'}; String str2 = new String(a);
字符串类实现Comparable接口,该接口提供compareTo()和compareToIgnoreCase()方法,并且按字典顺序比较两个字符串。
这两个字符串都转换为Unicode值以进行比较,并返回一个可以大于,小于或者等于零的整数值。
如果字符串相等,则返回零,否则返回大于或者小于零。
package com.theitroad.string.examples; /** * Java String Example * * @author hyman * */ public class StringEqualExample { public static void main(String[] args) { //creating two string object 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
请在String compareTo示例中详细阅读。
Java字符串方法
让我们通过示例程序来了解一些流行的String类方法。
split()Java字符串split()方法用于使用给定的表达式拆分字符串。
split()方法有两种变体。split(String regex)
:此方法使用给定的regex表达式拆分字符串并返回字符串数组。split(String regex,int limit)
:该方法使用给定的regex表达式拆分字符串并返回字符串数组,但array的元素受指定的限制。
如果指定的限制为2,则该方法返回大小为2的数组。
package com.theitroad.examples; /** * Java String compareTo Example * * @author hyman * */ 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
- contains(CharSequence s)Java String contains()方法检查字符串是否包含指定的字符序列。
如果string包含指定的字符序列,则此方法返回true,否则返回false。
上面程序的输出是:
length()Java String length()方法返回字符串的长度。
replace()Java字符串replace()方法用于将字符串的特定部分替换为其他字符串。
replace()方法有四个变体。replace(char oldChar,char newChar)
:此方法用字符串中的newChar替换所有出现的oldChar。替换(CharSequence目标,CharSequence替换):此方法用字符串中的替换文字替换每个目标文字。
replaceAll(String regex,String replace)
:该方法用指定的regex替换所有出现的与指定regex匹配的子字符串。replaceFirst(String regex,String replacement):此方法用字符串中的指定替换项替换与指定regex匹配的子字符串的首次出现。
package com.theitroad.examples; /** * Java String split example * * @author hyman * */ public class StringSplitExample { public static void main(String[] args) { String s = "a/b/c/d"; String[] a1 = s.split("/"); System.out.println("split string using only regex:"); for (String string : a1) { System.out.println(string); } System.out.println("split string using regex with limit:"); String[] a2 = s.split("/", 2); for (String string : a2) { System.out.println(string); } } }
上面程序的输出是:
split string using only regex: a b c d split string using regex with limit: a b/c/d
format()Java Sting format()方法用于格式化字符串。
java String format()方法有两种变体。
format(Locale l,String format,Object…args):此方法使用指定的语言环境,字符串格式和参数来格式化字符串。format(String format,Object…args)
:此方法使用指定的字符串格式和参数格式化字符串。
package com.theitroad.examples; /** * Java String contains() Example * * @author hyman * */ 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
- substring()此方法根据指定的索引返回字符串的一部分。
字符串串联
字符串连接是Java中非常基本的操作。
可以使用" +"运算符或者使用"concat()"方法来连接字符串。
package com.theitroad.examples; /** * Java String length * * @author hyman * */ 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 } }
上面程序的输出是:
package com.theitroad.examples; /** * Java String replace * * @author hyman * */ 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("After Replacing l with m :"); System.out.println(s); //replaceAll(String regex, String replacement) String s1 = "Hello theitroad, Hello hyman"; s1 = s1.replaceAll("Hello", "Hi"); System.out.println("After Replacing :"); System.out.println(s1); //replaceFirst(String regex, String replacement) String s2 = "Hello guys, Hello world"; s2 = s2.replaceFirst("Hello", "Hi"); System.out.println("After Replacing :"); System.out.println(s2); } }
Java字符串池
内存管理是任何编程语言中最重要的方面。
Java中使用字符串的情况下的内存管理与任何其他类都有些不同。
为了使Java的内存使用效率更高,JVM为字符串引入了一个特殊的存储区域,称为字符串常量池。
当我们创建字符串文字时,它会检查字符串池中是否已经存在相同的字符串。
如果存在,它将返回字符串池中现有字符串的引用。
让我们看下面的示例程序。
After Replacing l with m : Hemmo Wormd After Replacing : Hi theitroad, Hi hyman After Replacing : Hi guys, Hello world
上面程序的输出是:
package com.theitroad.examples; import java.util.Locale; /** * Java String format * * @author hyman * */ public class StringFormatExample { public static void main(String[] args) { String s = "theitroad.local"; //%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)); } }
字符串intern()方法
当我们使用字符串文字创建字符串时,将在字符串池中创建该字符串,但是如果我们使用与字符串池中存在的相同值的new关键字创建一个字符串,该怎么办?我们可以将字符串从堆内存移动到字符串池吗?
为此使用了intern()方法,它返回字符串对象的规范表示形式。
当我们对使用new关键字创建的字符串对象调用intern()方法时,它将检查池中是否已经存在具有相同值的String?
如果是,则它从池中返回该String对象的引用。
如果不是,那么它将在池中创建一个具有相同内容的新String并返回引用。
This is theitroad.local 3.140000
检查这篇文章,以了解有关Java String intern方法的更多信息。
字符串不变性的好处
String是不可变类的一些好处是:
字符串常量池,因此节省了内存。
安全性无法更改。
线程安全
类加载安全
Java 8字符串join()
Java 8的String类中添加了一个新的静态方法join()。
此方法返回一个新的String,该字符串由CharSequence元素的副本与指定定界符的副本组成。
让我们看一个示例以轻松理解它。
package com.theitroad.examples; /** * Java String substring * */ public class StringSubStringExample { public static void main(String[] args) { String s = "This is theitroad.local"; s = s.substring(8,18); System.out.println(s); } }
输出:Hello World 2019
Java 9字符串方法
Java 9发行版的String类中添加了两个方法。
它们是– codePoints()和chars()。
这两个方法都返回IntStream对象,我们可以在该对象上执行一些操作。
让我们快速看一下这些方法。
package com.theitroad.examples; /** * Java String concatenation * * @author hyman * */ public class StringConcatExample { public static void main(String[] args) { String s1 = "Hello"; String s2 = "World"; String s3 = s1 + s2; //using + operator System.out.println("Using + operator: "); System.out.println(s3); //using concat method System.out.println("Using concat method: "); System.out.println(s1.concat(s2)); } }
输出:
Using + operator: HelloWorld Using concat method: HelloWorld
Java 11字符串类新方法
Java 11版本中的String类中添加了许多新方法。
isBlank()–如果字符串为空或者仅包含空格代码点,则返回true,否则返回false。
lines()–返回从该字符串中提取的行流,以行终止符分隔。
strip(),stripLeading(),stripTrailing()–用于从字符串中删除开头和结尾的空格。
repeat()–返回一个字符串,该字符串的值是重复给定次数的此字符串的串联。
让我们看一下这些方法的示例程序。
package com.theitroad.examples; /** * Java String Pool Example * */ public class StringPoolExample { public static void main(String[] args) { String a = "abc"; String b = "abc"; String c = "def"; //same reference if (a==b) { System.out.println("Both string refer to the same object"); } //different reference 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