字符串详解

150 阅读4分钟

1. String概述

java.lang.String类代表字符串,java程序中所有字符串文字都为该类对象。

String name = "liang";

String类特点:字符串的内容是不会改变的,它的对象在创建后不能进行修改。

//下列代码总共产生三个字符串
String name = "zhangsan";
String age = "18";
System.out.println(name + age);//字符串拼接会产生一个新的字符串
//下列代码总共产生两个字符串
String name = "zhangsan";
name = "lisi";//创建一个新的字符串,然后再赋值给变量

2. 创建String对象的两种方式

创建String对象两种方式:直接赋值new

2.1 直接赋值

String name = "liang";

当使用双引号直接赋值时,系统会检查该字符串在字符串常量池中是否存在:

  • 不存在:在常量池中创建一个常量"liang"
  • 存在:复用

2.2 new

方法名说明
public String()创建一个空白字符串对象,不含有任何内容
public String(char[] chs)根据字符数组的内容,来创建字符串对象
public String(byte[] bys)根据字节数组的内容,来创建字符串对象
public String(String original)根据传入的字符串,来创建字符串对象

使用new创建对象时:String name = new String("liang");

  1. 代码加载编译时,会在常量池中创建常量。
  2. 在调用new时,会在堆中创建String对象,并引用常量池中的字符串对象,并返回String对象引用。

使用new创建明显多创建了一个对象,多此一举,会占用更多的内存,所以一般建议使用直接量的方式创建字符串。

3. 字符串的比较

3.1 == 比较原理

3.1.1 == 比较基本数据类型

基本数据类型比较的是数据值

int a = 1;
int b = 1;
System.out.println(a == b);//true

3.1.2 == 比较引用数据类型

引用数据类型比较的是地址值

String name1 = new String("zhangsan");
String name2 = new String("zhangsan");
System.out.println(name1 == name2);//false

3.1.3 == 比较字符串的几种情况:

String name1 = "zhangsan";
String name2 = "zhangsan";
System.out.println(name1 == name2);//true,串池中同一个字符串常量
String name1 = "zhangsan";
String name2 = "lisi";
System.out.println(name1 == name2);//false
String name1 = new String("zhangsan");//记录的是堆中地址
String name2 = "zhangsan";//记录的是串池中地址
System.out.println(name1 == name2);//false
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个字符串");
String str1 = sc.next();//abc 方法底层是new出来的
String str2 = "abc";
System.out.println(str1 == str2);//false

3.2 对字符串内容进行比较

public boolean equals(String s) :比较两个字符串内容是否相同、区分大小写。

public boolean equalsIgnoreCase(String anotherString):忽略大小写(英文)的比较。

4. StringBuilder

4.1 概述

概述: StringBuilder 可以看成是一个容器,创建之后里面的内容是可变的

作用: 提高字符串的操作效率。在拼接字符串和反转字符串的时候会使用到。

注:打印StringBuilder对象时。打印的是属性值而不是地址值,因为StringBuilder对其做了处理。

4.2 常用方法

构造方法:

方法名说明
public StringBuilder()创建一个空白字符串对象,不含有任何内容
public StringBuilder(String str)根据字符串的内容,来创建可变字符串对象

成员方法:

方法名说明
public StringBuilder append(任意类型)添加数据,并返回对象本身
public StringBuilder reverse()反转容器中的内容
public int length()返回长度(字符出现的个数)
public String toString()通过toString()就可以实现把StringBuilder转换为String

StringBuilder的使用:

//1.创建对象
StringBuilder sb = new StringBuilder();
//2.添加字符串,链式编程
sb.append("a").append("b").append("c").append("dd");
System.out.println(sb);//abcdd
//3.再把StringBuilder变回字符串
String str = sb.toString();
System.out.println(str);//abcdd

StringBuilder拼接字符串:

StringBuilder sb = new StringBuilder();
sb.append("[");

for (int i = 0; i < arr.length; i++) {
    if(i == arr.length - 1){
        sb.append(arr[i]);
    }else{
        sb.append(arr[i]).append(", ");
    }
}
sb.append("]");

String str = sb.toString();
System.out.println(str);

5. StringJoiner

5.1 概述

概述: StringJoiner跟StringBuilder一样,也可以看成是一个容器,创建之后里面的内容是可变的。JDK8出现的。

作用: 提高字符串的操作效率,而且代码编写特别简洁。

5.2 常用方法

构造方法:

方法名说明
public StringJoiner(间隔符号)创建一个StringJoiner对象,指定拼接的间隔符号
public StringJoiner(间隔符号, 开始符号, 结束符号)创建一个StringJoiner对象,指定拼接的间隔符号、开始符号、结束符号

成员方法:

方法名说明
public StringJoiner add(添加的内容)添加数据,并返回对象本身
public int length()返回长度(字符出现的个数)
public String toString()返回一个字符串

StringJoiner的使用:

//1.创建一个对象,指定间隔符号
StringJoiner sj = new StringJoiner("-");
//2.添加元素
sj.add("a").add("b").add("c");
//3.打印结果
System.out.println(sj);//a-b-c

StringJoiner拼接字符串:

//1.创建对象
StringJoiner sj = new StringJoiner(", ","[","]");
//2.添加元素
sj.add("a").add("b").add("c");
int len = sj.length();
System.out.println(len);//9
//3.打印
System.out.println(sj);//[a, b, c]
String str = sj.toString();
System.out.println(str);//[a, b, c]