从概念上讲,Java中的字符串实际上是Unicode字符序列。Java没有内置的字符串类型,而是在Java标准库中提供了一个预定义类,就叫做String。
字符串允许使用”+“拼接字符串。当一个字符串与一个非字符串进行”+“号拼接时,后者会被转换成字符串。
在Java文档中,将Java的String类对象定义为不可变字符串。如同数字3永远是3,不会是4,比如:String s=”Java“; 字符串”Java“是永远包含J、a、v、a的代码单元序列,而不能修改其中的任何一个字符。当然可以修改字符串变量s,让它指向另外一个字符串。Java中的字符串不是字符型数组。
检测字符串是否相等,用s.equals(t)方法,而一定不要用==的方法。用equals方法,相等则返回true,否则返回false。其中s和t可以是字符串变量,也可以是字符串常量。检测两个字符串是否相等而且忽略大小写,则用s.equalsIgnoreCase(t)。使用==的方法,这种方法只能确定两个字符串是否放在同一个位置。如果放置在同一个位置上那么肯定相等,但完全有可能将内容相同的多个字符串经过拷贝放置在不同的位置上。比如:
String s = "Java";
if(s == "Java") //可能是对的
if(s.subString(0,3) == "Jav") //可能是错的
如果虚拟机始终将字符串共享,那么完全可以用==来检测是否相等,但实际上只有常量字符串是始终共享的,而通过”+“或subString等操作产生的结果并不是共享的。因此千万不要在程序中庸==来判断字符串变量是否相等,否则会出现糟糕的bug,说它糟糕是因为一旦出现这样的bug,单凭自己很难发现。
空字符串是长度为0,内容为空的字符串。空字符串和null并不是一回事。null表示目前该变量没有任何对象与该变量关联。检测一个字符串为空字符串可以用if(str.equals(""))或者if(str.length()==0)。检测一个null字符串可以用if(str==null)。如果要检测一个字符串既不是null,也不是空字符串就要这样写if(str!=null && !str.equals("")),两个条件的前后位置不能颠倒,否则会出错,因为一个等于null的变量,是没有任何方法的,当然也没有equals方法,那么在进行str.equals("")方法时,系统会报错。
常用的字符串函数列表:
char charAt (int index) | 返回给定位置的代码单元 |
int codePointAt(int index) | 返回从给定位置开始或结束的代码点 |
int compareTo(String other) | 按照字典顺序,如果字符串位于other之前,返回一个负数; 如果相等,返回0; 如果字符串位于other之后,返回一个整数; |
boolean endsWith(String suffix) | 如果字符串一suffix结尾,返回true |
boolean equals(Object other) | 如果字符串与other相等,返回true |
boolean equalsIgnoreCase(String other) | 如果字符串与other相等(忽略大小写),返回true |
int indexOf(String str) | 返回与字符串str或代码点cp匹配的第一个子串的开始位置。 这个位置从0或者fromIndex处开始计算。如果在原字符串中不存在str,返回-1. |
int indexOf(String str, int fromIndx) | |
int indexOf(int cp) | |
int indexOf(int cp, int fromIndex) | |
int length() | 返回字符串的长度 |
String replace(CharSequence oldString , CharSequence newString) | 返回一个新字符串。这个字符串用newString代替原字符串中所有的oldString。 CharSequence可以用String或StringBuilder对象作为参数。 |
boolean startsWith(String prefix) | 如果字符串一prefix字符串开始,返回true。 |
String subString(int beginIndex) | 返回一个新字符串。这个字符串包含原始字符串中 从beginIndex到串尾或endIndex-1的所有代码单元。 |
String subString(int beginIndex , int endIndex) | |
String toLowerCase() | 返回新字符串。将原字符串中所有大小写字母全改成小写。 |
String toUpperCase() | 返回新字符串。将原字符串中所有大小写字母全改成大写。 |
String trim() | 返回新字符串。这个字符串将删除了原字符串头部和尾部的空格。 |
构建新的字符串时,如果由很多小的短的字符串组成一个新的字符串时,用StringBuilder类,这样可以提高效率,比字符串用”+“号拼接要快的多。
StringBuilder sb = new StringBuilder();
sb.append("J");
sb.append("a");
sb.append("va");
String str = sb.toString(); //str = "Java";