目录
if(str.length()==0)或if(str.equals(""))
String变量还可以存放一个特殊的值,名为null,这表示目前没有任何对象与该变量关联
if(str!==null&&str.length()!=0):
int cpCount = str.codePointCount(0,str.length());
char ch = str.charAt(0);//ch = 'h'
StringBuilder builder = new StringBuilder();
builder.append(ch);//appends a single character
builder.append(str);//appends a string
String str = builder.toString();
Java字符串就是Unicode字符序列
Java没有内置的字符串类型,在标准Java类库中提供了一个预定义类,叫做String
每个用双引号括起来的字符串都是String类的一个实例:
子串
String类的实例方法substring():提取一个子串
##substring(0,3):从0开始到2(不包括3)
String str = “Hello”;
String s = str.substring(0,3);
//s="Hel"
拼接
用“+”拼接字符串
如果非字符串和字符串用“+”拼接时,非字符串会自动转换为字符串(任何一个java对象都可以转换为字符串)
int num = 3;
String s = "abc"+num;
//s = "abc3";
如果需要把多个字符串放在一起,用一个定界符分隔,可以使用静态join方法:
String all = String.join("/","S","M","L","XL");
// all = "S/M/L/X/L"
join的API文档:
public static String join(CharSequence delimiter,
CharSequence... elements)返回一个新的字符串,由CharSequence elements的副本组成,并附有指定的delimiter的delimiter 。
For example,
String message = String.join("-", "Java", "is", "cool");
// message returned is: "Java-is-cool"
请注意,如果元素为空,则添加"null" 。
参数
delimiter - 分隔每个元素的分隔符
elements - 要加入的元素。
结果
一个新的 String ,其由所述的 elements由分离 delimiter
异常
NullPointerException - 如果 delimiter或 elements是 null
不可变字符串
String类没有提供用于修改字符串的方法。如果希望将greeting的内容修改为“Help! ”,不能直接地将greeting的最后两个位置的字符修改为‘p’和‘! '
如何修改这个字符串呢?在Java中实现这项操作非常容易。首先提取需要的字符,然后再拼接上替换的字符串:
String str = "hello,";
String s = str.substring(0,str.length())+"world!";
//s = "hello,world!"
String对象是不可变字符串
不可变字符串却有一个优点:编译器可以让字符串共享。
共享带来的高效率远远胜过于提取、拼接字符串所带来的低效率
很少需要修改字符串,而是往往需要对字符串进行比较(有一种例外情况,将来自于文件或键盘的单个字符或较短的字符串汇集成字符串。为此,Java提供了一个独立的类
检验字符串是否相等
equals方法检验两个字符串是否相等
s.equals(t)--相等返回True
“Hellp”.equals(str)
如果不区分大小写:"Hello".equalsIgnoreCase("hello")
一定不要使用==运算符检测两个字符串是否相等!这个运算符只能够确定两个字符串是否放置在同一个位置上,当然,如果字符串放置在同一个位置上,它们必然相等。但是,完全有可能将内容相同的多个字符串的拷贝放置在不同的位置上。
注:equals比较的是值相等,==比较的是位置相同
如果虚拟机始终将相同的字符串共享,就可以使用 == 运算符检测是否相等,但实际上只有字符串常量是共享的,而 + 或 substring 等操作产生的结果并不是共享的,但实际上只有字符串常量是共享的,而 + 或 substring 等操作产生的结果并不是共享的
空串与Nill串
空串“”是长度为0的字符串,
可用如下代码检验字符串是否为空:
if(str.length()==0)或if(str.equals(""))
空串是一个Java对象,有自己的串长度(0)和内容(空)
String变量还可以存放一个特殊的值,名为null,这表示目前没有任何对象与该变量关联
要检查一个字符串是否为null,要使用以下条件:
if(str==null)
有时要检查一个字符串既不是null也不为空串,这种情况下就需要使用以下条件:
if(str!==null&&str.length()!=0):
有时要检查一个字符串既不是null也不为空串,这种情况下就需要使用以下条件:
码点和代码单元
Java字符串由char值序列组成,char数据类型是一个采用UTF-16编码表示Unicode码点的代码单元,length方法将返回采用UTF-16编码表示的给定字符串所需要的代码单元数量
length方法将返回采用UTF-16编码表示的给定字符串所需要的代码单元数量:
String str = "hello";
int n = str.length();//n = 5
要想得到实际的长度,即码点数量,可以调用:
int cpCount = str.codePointCount(0,str.length());
调用s.charAt(n)将返回位置n的代码单元,n介于0~s.length()-1之间。例如:
String str = "hello";
char ch = str.charAt(0);//ch = 'h'
要想得到第i个码点,应该使用下列语句
int index = str.offsetByCodePoints(0,i);
int cp = str.codePointAt(index);
构建字符串
使用StringBuilder类(JDK5.0引入的,前身是StringBuffer)可以避免(有些时候,需要由较短的字符串构建字符串,例如,按键或来自文件中的单词。采用字符串连接的方式达到此目的效率比较低。每次连接字符串,都会构建一个新的String对象,既耗时,又浪费空间)
如果需要用许多小段的字符串构建一个字符串,那么应该按照下列步骤进行。首先,构建一个空的字符串构建器:
StringBuilder builder = new StringBuilder();
当每次需要添加一部分内容时,就调用append方法:
builder.append(ch);//appends a single character
builder.append(str);//appends a string
构建字符串时就调用toString方法,将可以得到一个String对象:
String str = builder.toString();
###注释:在JDK5.0中引入StringBuilder类。这个类的前身是StringBuffer,其效率稍有些低,但允许采用多线程的方式执行添加或删除字符的操作。如果所有字符串在一个单线程中编辑(通常都是这样),则应该用StringBuilder替代它。这两个类的API是相同的。
StringBuilder API文档:
● 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, String str)在offset位置插入一个字符串并返回this。
● StringBuilder insert(int offset, Char c)在offset位置插入一个代码单元并返回this。
● StringBuilder delete(int startIndex, intendIndex)删除偏移量从startIndex到-endIndex-1的代码单元并返回this。
● String to toString( )返回一个与构建器或缓冲器内容相同的字符串。
*
*
*
参考文献:java核心技术卷一