字符串广泛应用 在 Java 编程中,在 Java 中字符串属于对象,Java 提供了 String 类来创建和操作字符串 当对字符串进行修改的时候,需要使用 StringBuffer 和 StringBuilder 类 和 String 类不同的是,StringBuffer 和 StringBuilder 类的对象能够被多次的修改,并且不产生新的未使用对象。 StringBuilder 类在 Java 5 中被提出,它和 StringBuffer 之间的最大不同在于 StringBuilder 的方法不是线程安全的,不能同步访问 由于 StringBuilder 相较于 StringBuffer 有速度优势,所以多数情况下建议使用 StringBuilder 类。然而在应用程序要求线程安全的情况下,则必须使用 StringBuffer 类
String
创建字符串
创建字符串最简单的方式如下:
String greeting = "一缕清风";
在代码中遇到字符串常量时,这里的值是 “一缕清风“,编译器会使用该值创建一个 String 对象。
和其它对象一样,可以使用关键字和构造方法来创建 String 对象
String 类有 11 种构造方法,这些方法提供不同的参数来初始化字符串,比如提供一个字符数组参数:
public class StringDemo {public static void main(String args[]) {String dataString1 = "abcdef";char[] dataArray = { 'a', 'b', 'c', 'd', 'e', 'f' };String dataString2 = new String(dataArray);System.out.println(dataString1);System.out.println(dataString2);}}/** 以上实例编译运行结果如下:* abcdef* abcdef*/
⚠️注意: String 类是不可改变的,所以你一旦创建了 String 对象,那它的值就无法改变了(详看笔记部分解析)
如果需要对字符串做很多修改,那么应该选择使用 StringBuffer & StringBuilder 类
字符串长度
用于获取有关对象的信息的方法称为访问器方法。
String 类的一个访问器方法是 length() 方法,它返回字符串对象包含的字符数。
下面的代码执行后,len 变量等于 14:
public class StringDemo {public static void main(String args[]) {String str = "www.runoob.com";int len = str.length();System.out.println("菜鸟教程网址长度 : " + len);}}/*以上实例编译运行结果如下:菜鸟教程网址长度 : 14*/
连接字符串
String 类提供了连接两个字符串的方法:
string1.concat(string2);
返回 string2 连接 string1 的新字符串。也可以对字符串常量使用 concat() 方法,如:
"我的名字是 ".concat("Runoob");
更常用的是使用’+’操作符来连接字符串,如:
"Hello," + " runoob" + "!"
结果如下:
"Hello, runoob!"
下面是一个例子:
public class StringDemo {
public static void main(String args[]) {
String string1 = "菜鸟教程网址:";
System.out.println("1、" + string1 + "www.runoob.com");
}
}
/*
以上实例编译运行结果如下:
1、菜鸟教程网址:www.runoob.com
*/
创建格式化字符串
我们知道输出格式化数字可以使用 printf() 和 format() 方法。
String 类使用静态方法 format() 返回一个String 对象而不是 PrintStream 对象。
String 类的静态方法 format() 能用来创建可复用的格式化字符串,而不仅仅是用于一次打印输出。
如下所示:
System.out.printf("浮点型变量的值为 " +
"%f, 整型变量的值为 " +
" %d, 字符串变量的值为 " +
"is %s", floatVar, intVar, stringVar);
你也可以这样写
String fs;
fs = String.format("浮点型变量的值为 " +
"%f, 整型变量的值为 " +
" %d, 字符串变量的值为 " +
" %s", floatVar, intVar, stringVar);
String对象共享
因为String对象是不可变的,所以它们可以被共享
public class StringDemo {
public static void main(String args[]) {
String a = "abc";
String b = "abc";
System.out.println(a == b );
System.out.println(a.equals(b));
System.out.println(a.hashCode());
System.out.println(b.hashCode());
}
}
/*
true
true
96354
96354
*/
字符串的常量池

String慢的原因
Java中没有内置String类型,而是在Java的类库中提供了一个基类,当直接使用String拼接字符串时,String会先创建一个StringBuilder实例,然后调用append()方法来实现拼接。当拼接较多时,就会产生大量的实例,占用内存,导致效率降低
统计字符个数
import java.util.Scanner;
/**
* StringDemo
*/
public class StringDemo {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个字符串数据");
String s = sc.nextLine();
int bigCount = 0;
int smallCount = 0;
int numberCount = 0;
for (int i = 0; i < s.length(); i++) {
char ch = s.charAt(i);
if (ch >= 'A' && ch <= 'Z') {
bigCount++;
} else if (ch >= 'a' && ch <= 'z') {
smallCount++;
} else if (ch >= '0' && ch <= '9') {
numberCount++;
} else {
System.out.println("该字符" + ch + ":为非法字符");
}
}
System.out.println("大写字符个数为:"+bigCount);
System.out.println("小写字符个数为:"+smallCount);
System.out.println("数字字符个数为:"+numberCount);
sc.close();
}
}
String 方法
下面是 String 类支持的方法,更多详细,参看 Java String API 文档
StringBuilder 方法

String str = new StringBuilder("Hello Word,").append("Ken").append("今天吃饭了吗?").toString();
System.out.println(str + " ——— 长度:" + str.length()); // Hello Word,Ken今天吃饭了吗? ——— 长度:21
StringBuffer 方法
public class Test {
public static void main(String args[]) {
StringBuffer sBuffer = new StringBuffer("一缕清风教程:");
sBuffer.append("www");
sBuffer.append(".ken");
sBuffer.append(".com");
System.out.println(sBuffer);
}
}
/*
* 以上实例编译运行结果如下: 一缕清风教程:www.ken.com
*/
class Test {
public static void main(String[] args) {
StringBuffer a = new StringBuffer("Apple");
StringBuffer b = new StringBuffer("Google");
a.delete(1, 3);
a.append(b);
System.out.println(a); // AleGoogle
}
}
以下是 StringBuffer 类支持的主要方法:
| 序号 | 方法描述 |
|---|---|
| 1 | public StringBuffer append(String s) 将指定的字符串追加到此字符序列 |
| 2 | public StringBuffer reverse() 将此字符序列用其反转形式取代 |
| 3 | public delete(int start, int end) 移除此序列的子字符串中的字符 |
| 4 | public insert(int offset, int i) 将 int 参数的字符串表示形式插入此序列中 |
| 5 | replace(int start, int end, String str) 使用给定 String 中的字符替换此序列的子字符串中的字符 |
下面的列表里的方法和 String 类的方法类似:
| 序号 | 方法描述 |
|---|---|
| 1 | int capacity() 返回当前容量 |
| 2 | char charAt(int index) 返回此序列中指定索引处的 char 值 |
| 3 | void ensureCapacity(int minimumCapacity) 确保容量至少等于指定的最小值 |
| 4 | void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin) 将字符从此序列复制到目标字符数组 dst |
| 5 | int indexOf(String str) 返回第一次出现的指定子字符串在该字符串中的索引 |
| 6 | int indexOf(String str, int fromIndex) 从指定的索引处开始,返回第一次出现的指定子字符串在该字符串中的索引 |
| 7 | int lastIndexOf(String str) 返回最右边出现的指定子字符串在此字符串中的索引 |
| 8 | int lastIndexOf(String str, int fromIndex) 返回 String 对象中子字符串最后出现的位置 |
| 9 | int length() 返回长度(字符数) |
| 10 | void setCharAt(int index, char ch) 将给定索引处的字符设置为 ch |
| 11 | void setLength(int newLength) 设置字符序列的长度。 |
| 12 | CharSequence subSequence(int start, int end) 返回一个新的字符序列,该字符序列是此序列的子序列 |
| 13 | String substring(int start) 返回一个新的 String,它包含此字符序列当前所包含的字符子序列 |
| 14 | String substring(int start, int end) 返回一个新的 String,它包含此序列当前所包含的字符子序列 |
| 15 | String toString() 返回此序列中数据的字符串表示形式 |
String、StringBuilder与StringBuffer之间区别
| String | StringBuilder | StringBuffer |
|---|---|---|
| String的值是不可变的 这就导致每次对String的操作都会生成新的String对象,不仅效率低下,而且浪费大量优先的内存空间 |
可变类,速度更快 | StringBuffer是可变类,和线程安全的字符串操作类,任何对它指向的字符串的操作都不会产生新的对象。每个StringBuffer对象都有一定的缓冲区容量,当字符串大小没有超过容量时,不会分配新的容量,当字符串大小超过容量时,会自动增加容量 |
| 不可变 | 可变 | 可变 |
| 线程不安全 | 线程安全 | |
| 单线程操作字符串 | 多线程操作字符串 |
