今天,我们就进入字符串的学习吧。
字符串,在java中是作为对象进行处理的,不死简单的对很多的char进行的一个连合。
java中的字符串String都是对象。
它们的构造方法(或者说通俗点,String类型变量的定义方法,这个对于C,VB学习者会好理解些)
例如(根据字符常量建立字符串):
String k="123"; //是创建了一个值为“123”的String类的对象
String k=new String("123"); //这个语句可以和上面达到同样的效果
不仅如此,还可以根据字节数组来创建字符串。字节数组中的内容,在创建字符串时被认为是字符的ascii编码,或者unicode编码等等。。
方法是:new String(byteArray)
上面的是按照字节数组创建字符串对象,但是并没有限制bytearray的字符集,也就是说,没有指明字节数组中的数据该被如何理解。
通过:new String(byteArray,charsetName)
可以通过设置charsetName(字符集名),来控制字节数组中的数据,被解析成某个字符集下的文字。
除了字节数组,我们还可以将字符数组作为原料,来创建字符串。这个很容易理解:字符数组是一堆单个字符的集合,按照数组的下标顺序连接起来,就可以构成对应的字符串对象了。
有了字符串对象(或者有人喜欢称为变量),我们就需要探究了解它的属性和方法。从而能够自如的使用它。
首先一点就是要知道这个字符串的长度,也就是有多少个字符在这个字符串中。测试代码如下:
void showStringLength(){
String kString="";
String nString=null;
T.O("空字符串长度:"+kString.length());
T.O("null字符串长度:"+nString.length());
}
可以从代码中看到,使用string对象.length()可以获得字符串的长度。
有特例需要说明:如果字符串是如上面nString一样的null,就无法获得长度信息。对于一个null字符串,没有长度信息。因为一个字符串为null的时候,里面是没有信息的,所以不可能有长度。一个空字符串,例如这里的kString,是有内容的,虽然内容为空,但是可以计算长度,长度值为0;
可以这样理解:
开办一个银行账号等同于定义一个字符串变量;
开一项业务,相当于给字符串增加了内容;
这个业务的值为0,类似于一个字符串内容为空。
业务的值不为0,类似于字符串中有文字;
业务没有办理,只存在银行账号,类似于字符串的值为null(我的值就是没有值)
那么,有了一段字符串,自然我就会想到从这里面获取我要的内容,也就是截取文本。
【方法1:从某个点开头,截取后面全部内容】
截取文本使用的是String这个类的substring(子字符串)方法。
void GetSubString(){
String sunsoftString="I Love Michael Jackson";
String getPart1=sunsoftString.substring(0);
String getPart2=sunsoftString.substring(1);
String getPart3=sunsoftString.substring(2);
T.O("从第0个位置开始截取的是:["+getPart1+"]");
T.O("从第1个位置开始截取的是:["+getPart2+"]");
T.O("从第2个位置开始截取的是:["+getPart3+"]");
}
语法是:
String
java.lang.
String
.substring(int beginIndex)
这里的beginIndex是开始位置。这个方法是把字符串从beginIndex开始一直到尾部的字符串都截取出来作为返回值。
需要注意的是,这里,字符串的第一个字符的序号是0,和数组是相同的情况,可以类比记忆。
比如我们需要把从第5个字符开始的所有内容截取下来,我们就需要substring(4)。
【方法2:截取两点间的字符串,含这两点自身】
语法是:String java.lang.String.substring(int beginIndex, int endIndex)
意义是将字符串中,序号为beginIndex到序号为endIndex-1的内容截取下来。上例子:
void GetSubString(){
String sunsoftString="I Love Michael";
String getPart1=sunsoftString.substring(0);
String getPart2=sunsoftString.substring(1);
String getPart3=sunsoftString.substring(2);
T.O("从第0个位置开始截取的是:["+getPart1+"]");
T.O("从第1个位置开始截取的是:["+getPart2+"]");
T.O("从第2个位置开始截取的是:["+getPart3+"]");
String getPart4=sunsoftString.substring(0, 6);
String getPart5=sunsoftString.substring(1, 6);
String getPart6=sunsoftString.substring(2, 6);
String getPart7=sunsoftString.substring(3, 6);
T.O("");
T.O("从第0-6的是:["+getPart4+"]");
T.O("从第1-6的是:["+getPart5+"]");
T.O("从第2-6的是:["+getPart6+"]");
T.O("从第3-6的是:["+getPart7+"]");
}
我这里使用的字符串是:(我将序号和对应的字符列在下表中了,空的表示空格)
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 |
I | L | o | v | e | M | i | c | h | a | e | l |
根据实际运行结果:
substring(0,6)得到的是:I_Love
(这上面,下划线表示空格)
我们可以看出,0-6实际上是从标号为零,的“I”开始,截取到标号为5的“e”结束。
也就是说,substring在截取文字中的一段的时候,是从beginIndex到endIndex-1的地方截取,不包括endIndex对应的字符,包括beginIndex包括的字符。这个一定要重视和铭记。这个和VB里面是很不一样的。
知道了字符串的截取,我们还需要知道字符串的分割。
分割字符串。就是我们根据一个字符串将另一个字符串分成好几个部分,作为字符串数组返回:
举例说吧,有个字符串:“i love to ,dance on the,floor only if,you will help,me or i will have to go”(双引号内的为字符串)
我根据逗号来分割,可以得到:“i love to ”,“dance on the”,“floor only if”,“you will help”,“me or i will have to go”
再假设我根据“on”来分割,可以得到:“i love to ,dance ”,“ the,floor ”,“ly if,you will help,me or i will have to go”
分割的简单理解是:我们标记所有分割字符串所在的位置,然后在这些位置下刀,砍断这些字符串,将得到的一些分散开的字符串集合起来成为数组。
下面,就演示分割的代码:
void StringSplit(){
String iloveString="we,are,the,world";
String splited[]=iloveString.split(",");
for (String string : splited) {
T.O("分割字符串:"+string);
}
}
可见,“we,are,the,world”将被逗号分割成4个字符串。输出结果证明这个方法是正确的。
这里的分割是将所有的分割结果都作为字符串,并集合成字符串数组返回。
还有一种分割,就是将字符串分割,只返回指定个数的字符串数组:String[] java.lang.String.split(String regex, int limit)
这里的regex就是分割符或者分割的正则表达式,limit是返回几个字符数组,代码如下:
void StringSplit(){
String iloveString="we,are,the,world";
String splited[]=iloveString.split(",",3);
for (String string : splited) {
T.O("分割字符串:"+string);
}
}
运行结果如下:
分割字符串:we
分割字符串:are
分割字符串:the,world
也就是说,3表示将返回结果分为3个字符串。前两个是已经分割好的,最后一个是剩余未分割的。
可以得出结论,对于设置的值limit,前limit-1个是已经分割号的,最后一个是剩余的字符串。
由于这里“we,are,the,world”按照逗号来分割,只可以分割成4个字符串。如果设置是limit>=4,也只能显示四个字符串。下面给出limit不同值下的返回结果:
limit=1:
分割字符串:we,are,the,world
limit=2
分割字符串:we
分割字符串:are,the,world
limit=3
分割字符串:we
分割字符串:are
分割字符串:the,world
limit=4
分割字符串:we
分割字符串:are
分割字符串:the
分割字符串:world
limit=5
分割字符串:we
分割字符串:are
分割字符串:the
分割字符串:world
可以看出limit超过4(本例子可分割得到的最大字符串数)的时候,返回的字符数组都和limit等于4的时候相同。
上面的详细数据列举就是希望能帮助大家理解。
再接着,就需要对字符串进行清理空格的操作了:
String.trim();会返回一个清除了前导空格、tab和尾部空格tab的字符串,实例如下:
void ClearSpace(){
String emp=" sd s d ";
emp=emp.trim();
T.O("["+emp+"]");
}
返回值是:“sd s d” (双引号内为返回值)
接下来,需要在字符串中寻找我需要的内容,也就是字符串搜索:
String.indexOf(字符串或字符); //返回字符串或字符的首次出现位置。
实例:
void LocateString(){
String loc="i was looking for a song";
Easy.ShowL("for的位置是:"+loc.indexOf("for"));
}
结果显示"for"在14这个位置找到了。我检查了后发现,如果第一个字符为0位置,则第14位置就是for这个字符首字母“f”的位置。
还有一个类似的就是lastindexOf,也是获取位置,不过这个是获取最后一个匹配项的位置:返回值依然是搜索词的首字母的位置。