Java字符串

时间:2020-02-23 14:34:34  来源:igfitidea点击:

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