Java学习笔记2:String类
在Java中没有内置的字符串类型,而是在标准Java库中提供了一个预定义类。String是一种引用数据类型,主要有以下常见的几种操作:
1. 字符串长度
在Java中,使用方法length
求字符串的的长度,例如:
String a = "abcdef";
int len = a.length();//a为6
注意length
与length()
看起来相似,但是前者主要用于求解数组大小,例如:
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. 拼接
- 与绝大部分语言类似,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"
- 若需要进行多个字符串的拼接,可以使用方法
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
方法将返回传入位置的代码单元;使用offsetBycodePoints
和codePointAt
将得到得到传入位置的码点,例如:
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 |
| 构造一个空的字符串构建器 |
int |
| 返回构建器或缓冲器的代码单元数量 |
StringBuilder |
| 追加一个字符串并返回this |
StringBuilder |
| 追加一个代码单元并返回this |
StringBuilder |
| 追加一个代码点,并将其转换为一个或两个代码单元并返回this |
void |
| 将第i个代码单元设置为c |
StringBuilder |
| 在offset位置插入一个代码单元并返回this |
StringBuilder |
| 在offset位置插入一个字符串并返回this |
StringBuilder |
| 删除偏移量从startIndex到endIndex-1的代码单元并返回this |
String |
| 返回一个与构建器或缓冲器内容相同的字符串 |
单线程推荐使用StringBuilder
对象,速度比较快;多线程推荐使用StringBuff
,安全性更好。