Java学习笔记2:String类

在Java中没有内置的字符串类型,而是在标准Java库中提供了一个预定义类。String是一种引用数据类型,主要有以下常见的几种操作:

1. 字符串长度

在Java中,使用方法length求字符串的的长度,例如:

String a = "abcdef";
int len = a.length();//a为6

注意lengthlength()看起来相似,但是前者主要用于求解数组大小,例如:

String[] a = new String{"aa","bb","cc","dd","ee"};
int Len = a.length;//a为5

2.子串(substring)

substring方法可以在一个字符串中取其子串,需要两个参数。第一个参数为起始位置,第二个参数为终止位置的下一位。

下述代码将创建一个“Hel"字符:

String s = "Hello world!";
String subs = s.substring(0,3);

3. 拼接

  1. 与绝大部分语言类似,java支持使用+对字符串进行直接拼接,例如:
String first = "Hello";
String second = "World!";
String a = first + second;//a为"HelloWorld!"

String类型也可以和其他类型数据进行拼接,优先级与加法运算优先级相同,且计算结果为String类型:

int age = 19;
String s = "I'm ";
String a = s + age;//a为“I'm 19"
  1. 若需要进行多个字符串的拼接,可以使用方法join:
String a = String.join("I"," ","can"," ","do"," ","it",".");
//a为"I can do it."

4. 不可变字符串

Java 中不可以直接修改字符串中的字符,因此称String类对象为不可变字符串.

5. 检测字符串是否相等

可以直接使用equals方法判断两个字符串是否相等,如果相等则返回true,反之,则返回false:

s.equals(t);//判断字符串s和t是否相等

也可直接使用字符串字面量:

"Hello World!".equals(s);//判断字符串"Hello World!"和s是否相等

如果不区分大小写,则可以使用方法equalsIgnoreCase:

"Hello World!".equalsIgnoreCase("hello world!");//返回true

注意:与C++不同,java中一定不可以使用运算符==来检测两个字符串是否相等,这个运算符只能检测两个变量是否代表相同位置的字符串。

6.字符串比较

使用compareTo方法进行字符串比较,与C++中的strcmp完全类似。以s.compareTo(t)的返回值为例:

s >t

1

s=t

0

s<t

-1

以上比较为字典序比较,具体比较规则见百度百科

7. 空串和NULL串

空串""是长度为0的字符串,是一个java对象,表示长度为0的内容为空的字符串,用如下方法判断空串:

if(str.length()==0)

或者:

if(str.equals(""))

NULL为存放null的String变量,表示目前还没有任何对象与该变量关联,用如下方法检验:

if(str==null)

8.码点与代码单元

Java字符串由char值序列组成。char数据类型是一个采用utf-16编码表示Unicode码点的代码单元。大多数常用Unicode字符使用1个代码单元就可以表示,而辅助字符需要2个代码单元进行表示。

length方法返回采用UTF-16编码表示的给定字符串所需要的代码单元数量;codePointCount方法则返回实际的长度,即码点数量。如下:

String a = "Hello𝕗";
System.out.println(a.length());//代码单元数为7  最后一个字符占2个代码单元,为1个码点
System.out.println(a.codePointCount(0,a.length()));//码点个数为6

charAt方法将返回传入位置的代码单元;使用offsetBycodePointscodePointAt将得到得到传入位置的码点,例如:

char sec = a.charAt(2);//sec为'e'
int index1 = a.offsetByCodePoints(0,2);
int index2 = a.offsetByCodePoints(0,5);
int cp1 = a.codePointAt(index1);//cp1为'e'所对十进制编码108
int cp2 = a.codePointAt(index2);//cp2为'𝕗'所对十进制编码120152

因此,逐字符遍历字符串时不能以代码单元为跨度

9. String API

String类常用方法,见官方文档click here

10.构建字符串

有些时候,需要由较短的字符串构建字符串,可以通过如下方式:

首先,创建一个空的字符串构建器:

StringBuilder builder = new StringBuilder();

当每次需要添加一部分元素时,调用append方法:

builder.append(ch);
builder.append(str);

最后使用toString方法得到一个String对象:

String str = bulider.toString();

API官方文档,click here,下为常用例子:

类型

名称

解释

void

StringBuilder()

构造一个空的字符串构建器

int

length()

返回构建器或缓冲器的代码单元数量

StringBuilder

append(String str)

追加一个字符串并返回this

StringBuilder

append(char c)

追加一个代码单元并返回this

StringBuilder

appendCodePoint(int cp)

追加一个代码点,并将其转换为一个或两个代码单元并返回this

void

setCharAt(int i,char c)

将第i个代码单元设置为c

StringBuilder

insert(int offset, char c)

在offset位置插入一个代码单元并返回this

StringBuilder

insert(int offset, String str)

在offset位置插入一个字符串并返回this

StringBuilder

delete(int startIndex,int endIndex)

删除偏移量从startIndex到endIndex-1的代码单元并返回this

String

toString()

返回一个与构建器或缓冲器内容相同的字符串

单线程推荐使用StringBuilder对象,速度比较快;多线程推荐使用StringBuff,安全性更好。