Java编程那些事儿75——String类利用
副标题#e#
9.5.3 String和StringBuffer
String和StringBuffer类都是代表字符串,也就是任意多个字符构成的序列。措施需要存储的大量文字一般都利用字符串举办代表。在这两个类中,包括了大部门关于字符串操纵的要领,在实际操纵字符串时,可以首先查阅这两个类中的要领。
String和StringBuffer固然都代表字符串,可是由于两个类内部实现的区别,所以一般把String当作不行变字符串,而把StringBuffer当作可变字符串,对付String的每次改变(譬喻字符串通接等)城市生成一个新的字符串,较量挥霍内存,而StringBuffer每次都改变自身,不生成新的工具,较量节省内存。
下面就具体先容一下String和StringBuffer的实际利用。
9.5.3.1 String类
1、String工具的初始化
由于String工具出格常用,所以在对String工具举办初始化时,Java提供了一种简化的非凡语法,名目如下:
String s = “abc”;
s = “Java语言”;
其实凭据面向工具的尺度语法,其名目应该为:
String s = new String(“abc”);
s = new String(“Java语言”);
只是凭据面向工具的尺度语法,在内存利用上存在较量大的挥霍。譬喻String s = new String(“abc”);实际上建设了两个String工具,一个是”abc”工具,存储在常量空间中,一个是利用new要害字为工具s申请的空间。
其它的结构要领的参数,可以参看String类的API文档。
2、字符串的常见操纵
a、charAt要领
该要领的浸染是凭据索引值(划定字符串中第一个字符的索引值是0,第二个字符的索引值是1,依次类推),得到字符串中的指定字符。譬喻:
String s = “abc”;
char c = s.chatAt(1);
则变量c的值是’b’。
b、compareTo要领
该要领的浸染是较量两个字符串的巨细,较量的道理是依次较量每个字符的字符编码。首先较量两个字符串的第一个字符,假如第一个字符串的字符编码大于第二个的字符串的字符编码,则返回大于0的值,假如小于则返回小于0的值,假如相等则较量后续的字符,假如两个字符串中的字符编码完全沟通则返回0。
譬喻:
String s = “abc”;
String s1 = “abd”;
int value = s.compareTo(s1);
则value的值是小于0的值,即-1。
在String类中还存在一个雷同的要领compareToIgnoreCase,这个要领是忽略字符的巨细写举办较量,较量的法则和compareTo一样。譬喻:
String s = “aBc”;
String s1 = “ABC”;
int value = s. compareToIgnoreCase (s1);
则value的值是0,即两个字符串相等。
#p#副标题#e#
c、concat要领
该要领的浸染是举办字符串的毗连,将两个字符串通接今后形成一个新的字符串。譬喻:
String s = “abc”;
String s1 = “def”;
String s2 = s.concat(s1);
则毗连今后生成的新字符串s2的值是”abcdef”,而字符串s和s1的值不产生改变。假如需要毗连多个字符串,可以利用如下要领:
String s = “abc”;
String s1 = “def”;
String s2 = “1234”;
String s3 = s.concat(s1).concat(s2);
则生成的新字符串s3的值为”abcdef1234”。
其实在实际利用时,语法上提供了一种更简朴的形式,就是利用“+”举办字符串的毗连。譬喻:
String s = “abc” + “1234”;
则字符串s的值是”abc1234”,这样书写越发简朴直观。
并且利用“+”举办毗连,不只可以毗连字符串,也可以毗连其他范例。可是要求举办毗连时至少有一个参加毗连的内容是字符串范例。并且“+”匹配的顺序是从左向右,假如双方毗连的内容都是根基数字范例则凭据加法运算,假如参加毗连的内容有一个是字符串才凭据字符串举办毗连。
譬喻:
int a = 10;
String s = “123” + a + 5;
则毗连今后字符串s的值是“123105”,计较的进程为首先毗连字符串”123”和变量a的值,生成字符串”12310”,然后利用该字符串再和数字5举办毗连生成最终的功效。
而如下代码:
int a = 10;
String s = a + 5 + “123”;
则毗连今后字符串s的值是”15123”,计较的进程为首先计较a和数字5,由于都是数字型则举办加法运算可能数字值15,然后再利用数字值15和字符串”123”举办毗连得到最终的功效。
而下面的毗连代码是错误的:
int a = 12;
String s = a + 5 + ‘s’;
因为参加毗连的没有一个字符串,则计较出来的功效是数字值,在赋值时无法将一个数字值赋值给字符串s。
d、endsWith要领
该要领的浸染是判定字符串是否以某个字符串末了,假如以对应的字符串末了,则返回true。
譬喻:
String s = “student.doc”;
boolean b = s.endsWith(“doc”);
则变量b的值是true。
e、equals要领
该要领的浸染是判定两个字符串工具的内容是否沟通。假如沟通则返回true,不然返回false。譬喻:
String s = “abc”;
String s1 = new String(“abc”);
boolean b = s.equals(s1);
而利用“==”较量的是两个工具在内存中存储的地点是否一样。譬喻上面的代码中,假如判定:
boolean b = (s == s1);
#p#分页标题#e#
则变量b的值是false,因为s工具对应的地点是”abc”的地点,而s1利用new要害字申请新的内存,所以内存地点和s的”abc”的地点纷歧样,所以得到的值是false。
在String类中存在一个雷同的要领equalsIgnoreCase,该要领的浸染是忽略巨细写较量两个字符串的内容是否沟通。譬喻:
String s = “abc”;
String s1 =”ABC”;
boolean b = s. equalsIgnoreCase (s1);
则变量b的值是true。
f、getBytes要领
该要领的浸染是将字符串转换为对应的byte数组,从而便于数据的存储和传输。譬喻:
String s = “计较机”;
byte[] b = s.getBytes(); //利用本机默认的字符串转换为byte数组
byte[] b = s.getBytes(“gb2312”); //利用gb2312字符集转换为byte数组
在实际转换时,必然要留意字符集的问题,不然中文在转换时将会呈现问题。
g、indexOf要领
该要领的浸染是查找特定字符或字符串在当前字符串中的起始位置,假如不存在则返回-1。譬喻:
String s = “abcded”;
int index = s.indexOf(‘d’);
int index1 = s.indexOf(‘h’);
则返回字符d在字符串s中第一次呈现的位置,数值为3。由于字符h在字符串s中不存在,则index1的值是-1。
虽然,也可以从特定位置今后查找对应的字符,譬喻:
int index = s.indexOf(‘d’,4);
则查找字符串s中从索引值4(包罗4)今后的字符中第一个呈现的字符d,则index的值是5。
由于indexOf是重载的,也可以查找特定字符串在当前字符串中呈现的起始位置,利用方法和查找字符的方法一样。
别的一个雷同的要领是lastIndexOf要领,其浸染是从字符串的末端开始向前查找第一次呈现的划定的字符或字符串,譬喻:
String s = “abcded”;
int index = s. lastIndexOf(‘d’);
则index的值是5。
h、length要领
该要领的浸染是返回字符串的长度,也就是返回字符串中字符的个数。中文字符也是一个字符。譬喻:
String s = “abc”;
String s1 = “Java语言”;
int len = s.length();
int len1 = s1.length();
则变量len的值是3,变量len1的值是6。
i、replace要领
该要领的浸染是替换字符串中所有指定的字符,然后生成一个新的字符串。颠末该要领挪用今后,本来的字符串不产生改变。譬喻:
String s = “abcat”;
String s1 = s.replace(‘a’,’1’);
该代码的浸染是将字符串s中所有的字符a替换成字符1,生成的新字符串s1的值是”1bc1t”,而字符串s的内容不产生改变。
假如需要将字符串中某个指定的字符串替换为其它字符串,则可以利用replaceAll要领,譬喻:
String s = “abatbac”;
String s1 = s.replaceAll(“ba”,”12”);
该代码的浸染是将字符串s中所有的字符串”ab”替换为”12”,生成新的字符串”a12t12c”,而字符串s的内容也不产生改变。
假如只需要替换第一个呈现的指定字符串时,可以利用replaceFirst要领,譬喻:
String s = “abatbac”;
String s1 = s. replaceFirst (“ba”,”12”);
该代码的浸染是只将字符串s中第一次呈现的字符串”ab”替换为字符串”12”,则字符串s1的值是”a12tbac”,字符串s的内容也不产生改变。
j、split要领
该要领的浸染是以特定的字符串作为隔断,拆分当前字符串的内容,一般拆分今后会得到一个字符串数组。譬喻:
String s = “ab,12,df”;
String s1[] = s.split(“,”);
#p#分页标题#e#
该代码的浸染是以字符串”,”作为隔断,拆分字符串s,从而获得拆分今后的字符串数字s1,其内容为:{“ab”,”12”,”df”}。
该要领是理会字符串的基本要领。
假如字符串中在内部存在和隔断字符串沟通的内容时将拆除空字符串,尾部的空字符串会被忽略掉。譬喻:
String s = “abbcbtbb”;
String s1[] = s.split(“b”);
则拆分出的功效字符串数组s1的内容为:{“a”,””,”c”,”t”}。拆分出的中间的空字符串的数量便是中距离断字符串的数量减一个。譬喻:
String s = “abbbcbtbbb”;
String s1[] = s.split(“b”);
则拆分出的功效是:{“a”,””,””,”c”,”t”}。最后的空字符串岂论有几多个,城市被忽略。
假如需要限定拆分今后的字符串数量,则可以利用别的一个split要领,譬喻:
String s = “abcbtb1”;
String s1[] = s.split(“b”,2);
该代码的浸染是将字符串s最多拆分成包括2个字符串数组。则功效为:{“a”,”cbtb1”}。
假如第二个参数为负数,则拆分出尽大概多的字符串,包罗尾部的空字符串也将被保存。
k、startsWith要领
该要领的浸染和endsWith要领雷同,只是该要领是判定字符串是否以某个字符串作为开始。譬喻:
String s = “TestGame”;
boolean b = s.startsWith(“Test”);
则变量b的值是true。
l、substring要领
该要领的浸染是取字符串中的“子串”,所谓“子串”即字符串中的一部门。譬喻“23”是字符串“123”的子串。
字符串“123”的子串一共有6个:”1”、”2”、”3”、”12”、”23”、”123”。而”32”不是字符串”123”的子串。
譬喻:
String s = “Test”;
String s1 = s.substring(2);
则该代码的浸染是取字符串s中索引值为2(包罗)今后的所有字符作为子串,则字符串s1的值是”st”。
假如数字的值和字符串的长度沟通,则返回空字符串。譬喻:
String s = “Test”;
String s1 = s.substring(4);
则字符串s1的值是””。
假如需要取字符串内部的一部门,则可以利用带2个参数的substring要领,譬喻:
String s = “TestString”;
String s1 = s.substring(2,5);
则该代码的浸染是取字符串s中从索引值2(包罗)开始,到索引值5(不包罗)的部门作为子串,则字符串s1的值是”stS”。
下面是一个简朴的应用代码,该代码的浸染是输出任意一个字符串的所有子串。代码如下:
String s = “子串示例”;
int len = s.length(); //得到字符串长度
for(int begin = 0;begin < len – 1;begin++){ //起始索引值
for(int end = begin + 1;end <= len;end++){ //竣事索引值
System.out.println(s.substring(begin,end));
}
}
在该代码中,轮回变量begin代表需要得到的子串的起始索引值,其变革的区间从第一个字符的索引值0到倒数第二个字符串的索引值len -2,而end代表需要得到的子串的竣事索引值,其变革的区间从起始索引值的后续一个到字符串长度。通过轮回的嵌套,可以遍历字符串中的所有子串。
m、toCharArray要领
该要领的浸染和getBytes要领雷同,即将字符串转换为对应的char数组。譬喻:
String s = “abc”;
char[] c = s.toCharArray();
则字符数组c的值为:{‘a’,’b’,’c’}。
n、toLowerCase要领
该要领的浸染是将字符串中所有大写字符都转换为小写。譬喻:
String s = “AbC123”;
String s1 = s.toLowerCase();
则字符串s1的值是”abc123”,而字符串s的值稳定。
雷同的要领是toUpperCase,该要领的浸染是将字符串中的小写字符转换为对应的大写字符。譬喻:
String s = “AbC123”;
String s1 = s. toUpperCase ();
则字符串s1的值是”ABC123”,而字符串s的值也稳定。
o、trim要领
该要领的浸染是去掉字符串开始和末了的所有空格,然后形成一个新的字符串。该要领不去掉字符串中间的空格。譬喻:
String s = “ abc abc 123 “;
String s1 = s.trim();
则字符串s1的值为:” abc abc 123”。字符串s的值稳定。
p、valueOf要领
该要领的浸染是将其它范例的数据转换为字符串范例。需要留意的是,根基数据和字符串工具之间不能利用以前的强制范例转换的语法举办转换。
别的,由于该要领是static要领,所以不消建设String范例的工具即可。譬喻:
int n = 10;
String s = String.valueOf(n);
则字符串s的值是”10”。固然对付措施员来说,没有产生什么变革,可是对付措施来说,数据的范例却产生了变革。
先容一个简朴的应用,判定一个自然数是几位数字的逻辑代码如下:
int n = 12345;
String s = String.valueOf(n);
int len = s.length();
则这里字符串的长度len,就代表该自然数的位数。这种判定比数学判定要领在逻辑上要简朴一些。
关于String类的利用就先容这么多,其它的要领以及这里到的要领的具体声明可以参看对应的API文档。