第七课:String类
1、String的两种实例化方法
String本身是一个类,在String类中定义了如下的构造方法:
public String (String original)
可以接收一个String类的对象,并重新实例化String对象,除了此方法之外,String还可以采用直接赋值的方式进行对象的实例化。
public class StringDemo01{ public static void main(String args[]){ String str1 = "hello" ; //使用直接赋值的方式完成 String str2 = new String("WORLD") ; //通过构造方法完成 System.out.println(str1 + str2) ; //进行字符串的连接操作 } }
此时,两个String类型的对象都实例化。
2、String的比较方式
现有如下一道程序,观察String的比较问题:
public class StringDemo01{ public static void main(String args[]){ String str1 = "hello" ; //使用直接赋值的方式完成 String str2 = new String("hello") ; //通过构造方法完成 String str3 = str2 ; //通过构造方法完成 System.out.println("str1 == str2 --> " + (str1 == str2)) ; //false System.out.println("str1 == str3 --> " + (str1 == str3)) ; //false System.out.println("str2 == str3 --> " + (str2 == str3)) ; //true } }
从内存关系来分析结果:
得到一个结果,实际上对于“==”,比较的是两个对象的地址是否相等,具体来讲实际上比较的是地址的值,因为地址是以数值的形式存在的。
但是现在真正要比较的不是地址的值,而是两个字符串的内容,所以现在就需要使用String类中的equals()方法完成比较,此方法定义如下:
public boolean equals(String str)
比如:使用equals()修改程序
public class StringDemo01{ public static void main(String args[]){ String str1 = "hello" ; //使用直接赋值的方式完成 String str2 = new String("hello") ; //通过构造方法完成 String str3 = str2 ; //通过构造方法完成 System.out.println("str1 equals str2 --> " + str1.equals(str2)) ; //true System.out.println("str1 equals str3 --> " + str1.equals(str3)) ; //true System.out.println("str2 equals str3 --> " + str2.equals(str3)) ; //true } }
此时,因为三个字符串的内容完全相等,所以此时equals用于比较字符串内容。
3、一个字符串实际上就是String的匿名对象
一个字符串是使用“"”括起来的,那么一个字符串的常量实际上本身就属于String的一个匿名对象。
public class StringDemo01{ public static void main(String args[]){ String str1 = "hello" ; //使用直接赋值的方式完成 System.out.println("hello".equals(str1)) ; //true } }
4、String的两种实例化方式的区别
内存图形表示:
String str1 = "hello" ;
现在在堆内存空间中,只开辟了有一个空间,不会产生多余的内容。
现在使用关键字new的方式:
String str2 = new String("hello") ;
可以发现,程序开辟了两个空间,与直接赋值相比,肯定使用直接赋值的方式方便,所以在开发中绝对不能使用关键字new调用String(String original)的构造方法。
而且,如果使用直接赋值的方式也可以减少堆内存的开销。
public class StringDemo01{ public static void main(String args[]){ String str1 = "hello" ; //使用直接赋值的方式完成 String str2 = "hello" ; //使用直接赋值的方式完成 String str3 = "hello" ; //使用直接赋值的方式完成 System.out.println("str1 == str2 --> " + (str1 == str2)) ; //true System.out.println("str1 == str3 --> " + (str1 == str3)) ; //true System.out.println("str2 == str3 --> " + (str2 == str3)) ; //true } }
实际上,以上的三个对象表示的都是同一个空间的引用,因为对于String来讲,使用直接赋值的方式,会在字符串池中保存内容。如果之后再声明字符串的时候发现内容相同,则不会重新开辟空间,而是从内存池中取出数据继续使用。
5、字符串的内容一旦声明之后则无法修改
public class StringDemo01{ public static void main(String args[]){ String str = "hello" ; //使用直接赋值的方式完成 str += " world" ; System.out.println(str) ; } }
虽然最终输出的结果改变了,但是字符串的内容没有改变:
实际上来讲,字符串变量的改变是改变的内存空间地址的指向,而本身的字符串内容没有任何变化。所以,在开发中一下的操作代码绝对要避免:
public class StringDemo01{ public static void main(String args[]){ String str = "hello" ; //使用直接赋值的方式完成 for (int i = 0; i < 100; i++){ str += i ; } System.out.println(str) ; } }
以上的操作代码要不断的断开已有的连接,指向新连接100次,整体代码的性能及其低,所以遇到此类绝对不要使用。
6、String的常用操作方法
(1)、字符与字符串
在各个语言中实际上个一个字符串就表示一组字符。所以在String类中提供了以下的方法操作字符与字符串间的转换关系:
根据字符串中的索引找到指定位置的字符:public char charAt(int index)
将字符串变为字符数组:public char[] toCharArray()
将字符数组变为字符串:
将全部的字符数组变为String类型:public String(char[] value)
将部分的字符数组变为String类型:public String(char[] value, int offset, int count)
例1:取出字符串中指定位置的字符
public class StringDemo01{ public static void main(String args[]){ String str = "hello" ; char c = str.charAt(1) ; System.out.println(c) ; } }
例2:字符串 <--> 字符数组
public class StringDemo01{ public static void main(String args[]){ String str = "hello world!!!" ; char c[] = str.toCharArray() ; //将字符串变为字符数组 for (int i=0; i<c.length; i++){ System.out.print(c[i] + "、") ; } String str1 = new String(c) ; //将全部的字符数组重新变为String String str2 = new String(c, 0 ,5) ; //将0~5的字符数组重新变为String System.out.println() ; System.out.println(str1) ; System.out.println(str2) ; } }
(2)、字节与字符串
与字符数组的操作一致,一个字符串也可以变为字节数组,一个字节数组也可以变为字符串:
String --> 字节数组:public bytr[] getBytes()
字节数组 --> String:
全部转换:public String(byte[] bytes)
部分转换:public String(byte[] bytes, int offset, int length)
例:字节数组 --> String
public class StringDemo01{ public static void main(String args[]){ String str = "hello world!!!" ; byte c[] = str.getBytes() ; //将字符串变为byte数组 String str1 = new String(c) ; //将全部的byte数组重新变为String String str2 = new String(c, 0 ,5) ; //将0~5的byte数组重新变为String System.out.println(str1) ; System.out.println(str2) ; } }
(3)、判断是否以指定的字符串开头或结尾
判断是否以指定的字符串开头:public boolean sttsWith(String prefix)
判断是否以指定的字符串结尾:public boolean endsWith(String suffix)
例:验证操作
public class StringDemo01{ public static void main(String args[]){ String str = "**hello world!!!##" ; System.out.println(str.startsWith("**")) ; //true System.out.println(str.endsWith("##")) ; //true } }
(4)、替换操作
使用以下的方法可以完成替换的操作:
public String replaceAll(String regex, String replacement)
例:替换内容
public class StringDemo01{ public static void main(String args[]){ String str = "hello world" ; String newStr = str.replaceAll("l", "x") ; //将全部的l用x替换 System.out.println(newStr) ; } }
(5)、字符串截取
使用以下两个方法可以完成字符串的截取操作:
全部截取:public String substring(int beginIndex)
部分截取:public String substring(int beginIndex, int endIndex)
例:验证操作
public class StringDemo01{ public static void main(String args[]){ String str = "hello world" ; String sub1 = str.substring(6) ; //world String sub2 = str.substring(0, 4) ; //hello System.out.println(sub1) ; System.out.println(sub2) ; } }
(6)、字符串的拆分操作
可以将字符串按照指定的内容进行拆分操作:
public String[] split(string regex)
例:拆分字符串
public class StringDemo01{ public static void main(String args[]){ String str = "hello world" ; String s[] = str.split(" ") ; //按照空格拆分 for (String st:s ){ System.out.println(st) ; } } }
(7)、字符串查找
如果需要在一个字符串中查找是否存在指定的内容,可以使用以下的两个方法:
取得指定字符串的位置:public int indexOf(String str)
此方法返回int型数据,如果查找到了则返回位置,查找不到,返回-1
从指定位置开始查找:public int indexOf(String str, int fromIndex)
直接查找:public boolean contains(String s)
例1:查找操作
public class StringDemo01{ public static void main(String args[]){ String str = "hello world" ; System.out.println(str.contains("hello")) ; //true System.out.println(str.contains("hl")) ; //false } }
例2:查找位置
public class StringDemo01{ public static void main(String args[]){ String str = "hello world" ; System.out.println(str.indexOf("hello")) ; System.out.println(str.indexOf("hl")) ; if (str.indexOf("hello") != -1){ System.out.println("查找到了所需要的内容") ; } } }
例3:指定查找的开始位置
public class StringDemo01{ public static void main(String args[]){ String str = "hello world" ; System.out.println(str.indexOf("h" ,5)) ; //true } }
(8)、字符串的其他操作
去掉左右空格:public String trim()
取得字符串长度:public int length()
转大写:public String toUpperCase()
转小写:public String toLowerCase()
例:验证操作
public class StringDemo01{ public static void main(String args[]){ String str = " hello world " ; System.out.println(str.trim()) ; //去掉空格 System.out.println(str.trim().toUpperCase()) ; //转换为大写 System.out.println(str.trim().length()) ; //求出去掉空格后的字符串的长的 } }
【2012-01-03】