字符串——string我们可以理解为0个或多个字符组成的序列,也可以理解为一句话,之前我们介绍了char类型用单引号来表示,在Java的字符串中我们用双引号来表示字符串,极大地满足了我们编程开发中的一些难题。
注意的是,String类是final类,被final修饰的类是不可以继承的,这个其实方法里面默认的,最后归一我们讲的是String其实是通过char字符数组来保存字符串的,这个也是比较的符合我们计算机程序的基本思想的。
创建字符串
package 字符串; public class 创建字符串 { public static void main(String args[]){ char[] javaHello = { 'j', 'a', 'v', 'a', '!', '!'}; String helloString = new String(javaHello); System.out.println( helloString ); } }
上面的就是一个简单的字符数组初始化的概念,同时我们用到了类的继承,调用方法这些。
注意:String 类是不可改变的,所以你一旦创建了 String 对象,那它的值就无法改变了
字符串长度
String 类的一个访问器方法是 length() 方法,它返回字符串对象包含的字符数,思想和我们的Python类似。
package 字符串;
public class 字符串长度 { public static void main(String args[]) { String site = "你好!王小王;你好!Java"; int len = site.length(); System.out.println( "site的长度是 : " + len ); } }
连接字符串
在Python里面我们有三种的形式,逗号,format,%s,+,等这些连接的方法,但是在Java里面就会略有不同。
"我的名字是 ".concat("王小王");
返回的是:我的名字是王小王
但是有的时候我们会觉得这个方法有些繁琐,我们还有一个和Python语言一样的那就是加号连接。
"Hello," + " 王小王" + "!"
加号不只是对于字符串,它对变量或者其他的值也可以,比如你去看看上面的那个代码+len,不就是吗。
创建格式化字符串
我们知道输出格式化数字可以使用 printf() 和 format() 方法。
String 类使用静态方法 format() 返回一个String 对象而不是 PrintStream 对象。
String 类的静态方法 format() 能用来创建可复用的格式化字符串,而不仅仅是用于一次打印输出。
String方法
下面我们将进入字符串的一系列方法,它的有些方法和Python其实是触类旁通的,我们学起来也比较的明显好懂!
charAt() 方法
这个方法我相信之前仔细看过那个条件控制篇的文章的小伙伴一定不会陌生,那个里面有一个字符的数据输入,就用到了这个方法进行索引获取。
charAt() 方法用于返回指定索引处的字符。索引范围为从 0 到 length() - 1。
public class Test { public static void main(String args[]) { String s = "www.runoob.com"; char result = s.charAt(6); System.out.println(result); } }
它的索引方法和我们的Python都是类似的,这里获取到的是n这个字符。
compareTo() 方法
字符串与对象进行比较。
按字典顺序比较两个字符串。
返回值
返回值是整型,它是先比较对应字符的大小(ASCII码顺序),如果第一个字符和参数的第一个字符不等,结束比较,返回他们之间的差值,如果第一个字符和参数的第一个字符相等,则以第二个字符和参数的第二个字符做比较,以此类推,直至比较的字符或被比较的字符有一方结束。其实吧这个东西我觉得只需要了解就可以了。
如果参数字符串等于此字符串,则返回值 0;
如果此字符串小于字符串参数,则返回一个小于 0 的值;
如果此字符串大于字符串参数,则返回一个大于 0 的值。
package 字符串;
public class 字符串比较 { public static void main(String args[]) { String str1 = "王小王"; String str2 = "王小王"; String str3 = "王小王123"; int result = str1.compareTo( str2 ); System.out.println(result); result = str2.compareTo( str3 ); System.out.println(result); result = str3.compareTo( str1 ); System.out.println(result); } }
compareToIgnoreCase() 方法用于按字典顺序比较两个字符串,不考虑大小写,这里了解一下。
contentEquals() 方法用于将此字符串与指定的 StringBuffer 比较。
public boolean contentEquals(StringBuffer sb)
sb – 要与字符串比较的 StringBuffer
如字符串与指定 StringBuffer 表示相同的字符序列,则返回 true;否则返回 false
public class Test { public static void main(String args[]) { String str1 = "String1"; String str2 = "String2"; StringBuffer str3 = new StringBuffer( "String1"); boolean result = str1.contentEquals( str3 ); System.out.println(result); result = str2.contentEquals( str3 ); System.out.println(result); } }
用法就是这样,这里的str3是一个新建的StringBuffer的对象,这里大家可能会有的陌生,不过没关系,后面慢慢就好了。
copyValueOf() 方法
这个方法有点陌生,我们仔细看看,首先我们看看语法格式
public static String copyValueOf(char[] data, int offset, int count)
data -- 字符数组。
offset -- 子数组的初始偏移量。。
count -- 子数组的长度。
那么怎么去理解这个东西了,我们接下来看一看代码演示
package 字符串;
public class 字符串偏移获取 { public static void main(String args[]) { char[] Str1 = {'h', 'e', 'l', 'l', 'o', '!', 'r', 'u', 'n', 'o', 'o', 'b'}; String Str2 = ""; Str2 = Str2.copyValueOf( Str1 ); System.out.println("返回结果:" + Str2); Str2 = Str2.copyValueOf( Str1, 2, 6 ); System.out.println("返回结果:" + Str2); } }
我们可以这样去理解,首先里面的三个参数,第一个是字符数组,就是我们的数据,第二个就是我们要从那个索引位置开始获取,默认为0开始,最后一个就是我们想要取到的位数是多少,这个和我们Python的字符串索引有的类似吧。
endsWith() 方法
endsWith() 方法用于测试字符串是否以指定的后缀结束。
话不多说我们直接看代码演示
package 字符串; public class 字符串后缀 { public static void main(String args[]) { String Str = new String("王小王12345678.9"); boolean retVal; retVal = Str.endsWith( "王小王" ); System.out.println("返回值 = " + retVal ); retVal = Str.endsWith( ".9" ); System.out.println("返回值 = " + retVal ); } }
如果参数表示的字符序列是此对象表示的字符序列的后缀,则返回 true;否则返回 false。注意,如果参数是空字符串,或者等于此 String 对象(用 equals(Object) 方法确定),则结果为 true。简单来说就是一个判断字符串后缀的方法
说到这里了,我还是提一下关于这个new方法,为什么我们每一次新创建的字符串用的就是这个了,因为这样比较方便,最后就是你也可以用之前的定义再去调用,这个的好处是让他们实现在同一行代码,使得结构更加紧凑。
getChars() 方法
getChars() 方法将字符从字符串复制到目标字符数组。
public void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin)
srcBegin -- 字符串中要复制的第一个字符的索引。
srcEnd -- 字符串中要复制的最后一个字符之后的索引。
dst -- 目标数组。
dstBegin -- 目标数组中的起始偏移量。
我们看看代码演示
package 字符串;
public class 字符串复制 { public static void main(String args[]) { String Str1 = new String("王小王.123.王小王123456789"); char[] Str2 = new char[6]; try { Str1.getChars(4, 10, Str2, 0); System.out.print("拷贝的字符串为:" ); System.out.println(Str2 ); } catch( Exception ex) { System.out.println("触发异常..."); } } }
这里其实就是一个简单的复制,首先是初始索引,最后的索引,注意这个和之前的一个字符串偏移是不一样的,那个是返回多少个字符copyValueOf() 方法
** indexOf() 方法**
这个方法和我们的Python返回索引位置不相上下
public int indexOf(int ch): 返回指定字符在字符串中第一次出现处的索引,如果此字符串中没有这样的字符,则返回 -1。
public int indexOf(int ch, int fromIndex): 返回从 fromIndex 位置开始查找指定字符在字符串中第一次出现处的索引,如果此字符串中没有这样的字符,则返回 -1。
int indexOf(String str): 返回指定字符在字符串中第一次出现处的索引,如果此字符串中没有这样的字符,则返回 -1。
int indexOf(String str, int fromIndex): 返回从 fromIndex 位置开始查找指定字符在字符串中第一次出现处的索引,如果此字符串中没有这样的字符,则返回 -1。
package 字符串;
public class 返回字符串索引 { public static void main(String args[]) { String Str = new String("王小王123.w0ww.sina.com.cn"); String SubStr1 = new String("w0ww"); String SubStr2 = new String("com"); System.out.print("查找字符 o 第一次出现的位置 :" ); System.out.println(Str.indexOf( 'o' )); System.out.print("从第14个位置查找字符 o 第一次出现的位置 :" ); System.out.println(Str.indexOf( 'o', 14 )); System.out.print("子字符串 SubStr1 第一次出现的位置:" ); System.out.println( Str.indexOf( SubStr1 )); System.out.print("从第十五个位置开始搜索子字符串 SubStr1 第一次出现的位置 :" ); System.out.println( Str.indexOf( SubStr1, 15 )); System.out.print("子字符串 SubStr2 第一次出现的位置 :" ); System.out.println(Str.indexOf( SubStr2 )); } }
这个里面解释比较详细了,我这里就不多余解释,反正就是需要注意的是第一个是查找的字符,第二个是开始的位置。我建议仔细看看代码和演示效果。
lastIndexOf() 方法
这个方法和上面的一样的,知识要求的是从多少位置,返回最后一个出现该字符的位置索引。
System.out.print("从第14个位置查找字符 o 最后出现的位置 :" );
System.out.println(Str.lastIndexOf( 'o', 14 ));
toLowerCase() 方法
toLowerCase() 方法将字符串转换为小写。
public String toLowerCase(Locale locale) public class Test { public static void main(String args[]) { String Str = new String("WWW.RUNOOB.COM"); System.out.print("返回值 :" ); System.out.println( Str.toLowerCase() ); } }
toUpperCase() 方法将字符串小写字符转换为大写。用法一样
其实字符串的方法有很多,但是有的我们确实用不到,如果你们遇见了也没关系,去网上查询相关的文档再去学习,他们都是大同小异,只有掌握了方法才会学到自由自在。
下面我们接着介绍几个常见的
replace() 方法
replace() 方法通过用 newChar 字符替换字符串中出现的所有 oldChar 字符,并返回替换后的新字符串
package 字符串;
public class 字符串替换 { public static void main(String args[]) { String Str = new String("王小王123"); System.out.print("返回值 :" ); System.out.println(Str.replace('王', '小')); System.out.print("返回值 :" ); System.out.println(Str.replace('l', 'D')); } }
replaceAll() 方法
replaceAll() 方法使用给定的参数 replacement 替换字符串所有匹配给定的正则表达式的子字符串。
成功则返回替换的字符串,失败则返回原始字符串。
package 字符串; public class 用正则替换字符串 { public static void main(String args[]) { String Str = new String("www.google.com"); System.out.print("匹配成功返回值 :" ); System.out.println(Str.replaceAll("(.*)google(.*)", "runoob" )); System.out.print("匹配失败返回值 :" ); System.out.println(Str.replaceAll("(.*)taobao(.*)", "runoob" )); } }
** replaceFirst() 方法**
replaceFirst() 方法使用给定的参数 replacement 替换字符串第一个匹配给定的正则表达式的子字符串。
成功则返回替换的字符串,失败则返回原始字符串。
public class Test { public static void main(String args[]) { String Str = new String("hello runoob,I am from runoob。"); System.out.print("返回值 :" ); System.out.println(Str.replaceFirst("runoob", "google" )); System.out.print("返回值 :" ); System.out.println(Str.replaceFirst("(.*)runoob(.*)", "google" )); } }