字符串是由字符构成的序列,很多语言把字符串当作字符数组处理,但在java中,字符串是一个对象。
字符串构造
- 用字符串直接量创建字符串对象。java将字符串直接量看作String对象
String newString = new String("hi world");
或
String newString = "hi world";
- 用字符数组创建字符串对象
char[] charArray={'h','i',' ','w','o','r','l','d'}
String newString=new String(charArray);
String变量存储的是对String对象的引用,String对象存储的才是字符串的值,但通常不做严格区分,均叫做字符串。
不可变字符串和限定字符串
String对象是不可变的,它的内容是不能改变的。
String s="java";
s="world";
以上语句,创建内容为“java”的String对象,并把对象引用赋值给s,第二条语句创建内容为“world”的String对象,并把对象引用赋值给s。此时,有两个对象,s指向内容为world的对象,内容为java的对象不能再访问。
java虚拟机为了提高效率并节约内存,对具有相同字符串序列的字符串直接量使用同同一个实例。这样的实例称为限定的。
String s1="welcome";
String s2=new String("welcome");
String s3="welcome";
s1和s3指向相同的String对象,s2与其他两个只具有相同的内容,但是是不同的字符串对象。s1==s3 ,s1!=s2
字符串比较
运算符==用于检测两个String对象引用是否指向同一个对象:指向同一个对象返回true,否则false。
equals(s)方法用于判断两个字符串变量的内容是否相同。
s1.compareTo(s2)方法,
如果s1与s2相等,则返回0;如果按字典序s1 < s2,返回值小于0;如果大于,返回值大于0。返回的实际值是依据s1与s2从左到右数第一个不同字符之间的距离得出的。
例如:s1=“asd”,s2=“asf”,一个字符相等,检查第二个字符也相等,检查第三个字符d比f小2,所以返回-2。
- 使用>、>=等运算符比较两个字符串会发生语法错误,可用s1.compareTo(s2)进行比较
- cmpareTo根据一个字符串是否等于、大于或小于另一个字符串分别返回0、正整数或负整数。
- 如果两个字符串相等,equals方法返回true,如果不等,返回false。
- startWith(prefix)方法,如果以指定前缀开始则返回true
字符串连接
- 使用concat方法
String s3=s1.concat(s2);
- 使用“+”
String s3=s1+s2;
使用+可以连接数字和字符串和字符串直接量。连接数字时,先将数字转换为字符串,再进行连接。
获取字符串
- charAt()获取指定下标处的单个字符
s.charAt(1);
- substring从字符串中提取子串
substring(beginIndex):返回从指定下标开始,到字符串末尾的子串
substring(beIn,enIn):返回从指定下标开始到指定下标结束的子串(不包括结束下标处的字符)
例如:
String s="welcome to java".substring(0,11)+"c++";
s变为“welcome to c++”
字符串的转换、替换和分隔
一旦创建了字符串内容就不能改变,replace、split等方法会返回一个源自原始字符串的新字符串,原始字符串并未被改变。
replace(oldChar,newChar);
//返回用新字符替换字符串中和旧字符匹配的新的字符串
replaceFirst(oldString,newString);
//返回用新子串替换第一个和旧子串匹配的子串之后的新字符串
replaceAll(oldString ,newString);
//返回用新子串替换所有和旧子串匹配的子串之后的新字符串、
split(delimiter);
//返回用定界符分隔的子串所构成的一个字符串数组
例如:
String[] r="java#c++#python".split("#");//用#分隔字符串,然后存入字符串数组
for(int i=0;i<r.length;i++)
System.out.print(r[i]+"\t");
返回结果:java c++ python
依照模式的匹配、替换和分隔
正则表达式:根据某个指定模式来匹配、替换和分隔一个字符串
match()、replace()、split()等方法都可以根据构建的模式结合使用,内容较多,日后单独写一篇
字符串与数组的转换
- 字符串-> 数组
使用toCharArray():
char[] c="java".toCharArray();
使用getChars():
getChars(int srcBegin,int srcEnd,char[] dst,int dstBegin);
//将下标从secBegin到srcEnd-1的子串复制到字符数组dst中下标从dstBegin开始的位置
char[] dst={'j','a','v','a','1','2','3','4'};
"py5678".getChars(2,6,dst,4);
运行结果:dst变成{‘j’,’a’,’v’,’a’,’5’,’6’,’7’,’8’}
- 字符数组-> 字符串
使用构造方法String(char[])
String s=new String(new char[] {'j','a','v','a'});
使用valueOf(char [])
String s=String.valueOf(new char[] {'j','a','v','a'});
格式化字符串
String类包含一个静态format方法,可以创建一个格式化的字符串,调用语法:
String.format(format,item1,item2,...,itemk);
类似格式化输出的printf,但是printf()只是显示一个格式化的字符串,format是返回一个格式化的字符串。
String s=String.format(“%5.2f”,45.556);
创建一个格式化的字符串“45.56”