第七课:String类 M

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】

原文地址:https://www.cnblogs.com/chuanstone/p/2311184.html