前言
从概念上来讲,Java字符串就是Unicode字符序列。例如,”Java\u2122” 由5个Unicode字符J,a,v,a,和 ™。Java没有内置的字符串类型,而是在标准Java类库中提供了一个预定义类,叫做String。每个用双引号括起来的字符串都是String类的一个实例。
子串
String类的substring方法可以从一个较大的字符串提取出一个子串。例如:
String greeting = "Hello"
String s = greeting.substring(0,3) // s = "Hel"
substring方法的第二个参数是不想复制的第一个位置。这里要复制位置为0,1和2(从0到2,包括0和2)的字符。在substring中从0开始计数,直到3为止,但不包括3。
substring有一个优点:容易计算字串的长度。即substring(a,b)的长度为b-a。例如,子串“Hel”的长度为3-0=3
拼接
与绝大多数的程序设计语言一样,Java语言允许使用 + 号连接(拼接)两个字符串。
String expletive = "Expletive"
String PG13 = "deleted"
String message = expletive + PG13 // message = "Expletivedeleted"
当将一个字符串与一个非字符串的值进行拼接时,后者被转换成字符串。
int age = 13;
String rating = "PG" + age; //rating为 PG13
如果需要将多个字符串连接在一起,并用定界符分离,可以使用静态join方法
String size = String.join(" / ", "S", "M", "L", "XL");
//size = "S / M / L / XL"
不可变字符串
由于不能修改Java字符串中的字符,所以在Java文档中将String类对象称为不可变字符串,如同数字3永远是数字3一样,字符串“Hello”永远包含字符 H,e,l,l 和 o 的代码单元序列,而不能修改戏中的任何一个字符。当然,可以修改字符串变量,让它引用另一个字符串。
不可变字符串的优点是:编译器可以让字符串共享,即各种字符串存储在公共的存储池中,字符串变量值相存储池中相应的位置,如果复制一个字符串变量,原始字符串与复制的字符串共享相同的字符。
Java的设计者认为共享所带来的高效率远远胜于提取,拼接字符串所带来的低效率,因为我们很少需要修改字符串,更多的,我们是对字符串进行比较。
检测字符串是否相等
可以使用equals方法判断两个字符串是否相等,对于表达式:
s.equals(t)
如果字符串 s 与字符串 t 相等,则返回true;否则,返回false。需要注意,s和t可以是字符串变量,也可以是字符串字面量。如果要想检测两个字符串是否相等,而不区分大小写,可以使用equalsIgnoreCase方法。
"Hello".equalsIgnoreCase("hello") // true
一定不要使用==运算符检测两个字符串是否相等!!!
这个运算符只能确定两个字符串是否放在同一个位置上,当然,如果字符串放置在同一个位置上,他们必然相等。但是,完全有可能将内容相同的多个字符串的拷贝放在不同的位置上。
String greeting = "hello";
if (greeting == "hello") // true
if (greeting.substring(0,3) == "hel") // false
因为只有字符串常量是共享的,而 + 或substring产生的结果并不是共享的。所以千万不要用 == 运算符测试字符串的相等性!
空串与null串
空串 “” 是长度为0的字符串。可以调用以下代码检查一个字符串是否为空:
if (str.length() == 0)
或
if (str.equals(""))
空串是一个Java对象,有自己的串长度(0)和内容(空)。不过,String变量还可以存放一个特殊的值,名为null,这表示目前没有任何对象与该变量关联
常用String API
char charAt (int index)
返回给定位置的代码单元。除非对底层的代码单元感兴趣,否则不需要调用这个方法。int compareTo(String other)
按照字典顺序,如果字符串位于other之前,返回一个负数;如果字符串位于other之后,返回一个正数;如果两个字符串相等,返回0boolean equals(Object other)
如果字符串与other相等,返回trueboolean equalsIgnoreCase(String other)
如果字符串与other相等(忽略大小写),返回trueboolean startWith(String prefix)
boolean endWith(String suffix)
如果字符串以prefix(suffix)开头(结尾),则返回trueint indexOf(String str)
int indexOf(String str, int fromIndex)
int indexOf(int cp)
int indexOf(int cp, int fromIndex)
返回与字符串str或代码点cp匹配的第一个子串的开始位置。这个位置从索引0或fromIndex开始计算。如果原始串中不存在str,返回-1int lastIndexOf(String str)
int lastIndexOf(String str, int fromIndex)
int lastIndexOf(int cp)
int lastIndexOf(int cp, int fromIndex)
返回与字符串str或代码点cp匹配的最后一个子串的位置。这个位置从原始串尾端或fromIndex开始计算int length()
返回字符串的长度String replace(CharSequence oldString, CharSequence newString)
返回一个新字符串,这个字符串用newString代替原始字符串中的所有oldString。可以用String或StringBuilder对象作为CharSequence参数String substring(int beginIndex)
String substring(int beginIndex, int endIndex)
返回一个新字符串。这个字符串包含原始字符串中从beginIndex到串尾或endIndex - 1的所有代码单元String toLowerCase()
String toUpperCase()
返回一个新字符串,这个字符串将原始字符串中的大写字母改为小写,或者将原始字符串中的所有小写字母改成了大写字母。String trim()
返回一个新字符串,这个字符串将删除了原始字符串头部和尾部的空格。String join(CharSequence delimiter, CharSequence…elements)
返回一个新字符串,用给定的定界符连接所有元素。
参考资料
Core Java Volume Ⅰ-Fundamentals
下期预告
控制流程:块作用域,条件语句,循环,等等~
公众号
纯公益技术分享,欢迎关注~