代码改变世界

面向对象基础——String类

2017-07-11 15:12  tlnshuju  阅读(211)  评论(0编辑  收藏  举报

String类的两种实例化方法

 A:直接赋值
public class StringDemo01{
	public static void main(String args[]){
		String name = "liuxun" ;			// 实例化String对象
		System.out.println("姓名:" + name) ;
	}
};

B:通过keywordnew
public class StringDemo02{
	public static void main(String args[]){
		String name = new String("liuxun") ;			// 实例化String对象
		System.out.println("姓名:" + name) ;
	}
};

String类的内容比較

以往基本数据类型才用 == 进行比較。

假设直接比較字符串呢? 例如以下所看到的:

public class StringDemo04{
	public static void main(String args[]){
		String str1 = "hello" ;					// 直接赋值
		String str2 = new String("hello") ;		// 通过new赋值
		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 class StringDemo05{
	public static void main(String args[]){
		String str1 = "hello" ;					// 直接赋值
		String str2 = new String("hello") ;		// 通过new赋值
		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
	}
};



结论:String有两种比較方式。
一种是使用 == 完毕。比較的是地址值
还有一种使用equals 方法完毕,比較的详细内容,开发中比較经常使用。

String类两种实例化方式的差别

public class StringDemo07{
	public static void main(String args[]){
		String str1 = "hello" ;					// 直接赋值
		String str2 = "hello" ;					// 直接赋值
		String str3 = "hello3" ;					// 直接赋值
		System.out.println("str1 == str2 --> " + (str1==str2)+"  "+str1) ;	// true
		System.out.println("str1 == str3 --> " + (str1==str3)+"  "+str2) ;	// true
		System.out.println("str2 == str3 --> " + (str2==str3)+"  "+str3) ;	// true
	}
};


会发现使用直接赋值的方式声明字符串时,假设该字符串的内容和别的字符串的内容同样时,则直接把具有内容同样的字符串的指向给赋值过来。假设没有发现与新声明字符串内容同样的字符串,才会开辟新的堆内存。

而使用 new String()的方式创建字符串的话,就会先开辟一个字符串的堆空间存放字符串的内容。然后通过new 再开辟一个堆空间,将第一个堆空间里的内容给复制一份拷过来,将new出来的堆空间地址赋给一个栈内存,而第一个堆空间等待GC的回收。

一般仅仅要不是特殊情况,则使用第一种直接赋值的方式就可以。

字符串的内容不可改变

这是字符串的一个重要特征。
public class StringDemo09{
	public static void main(String args[]){
		String str = "hello" ;		// 声明字符串
		str = str + " world!!!"	;	// 改动字符串
		System.out.println("str = " + str) ;
	}
};


实际上字符串内容的改变。改变的是内存地址的引用关系。 所以在开发中避免例如以下操作
public class StringDemo10{
	public static void main(String args[]){
		String str1 = "liuxun" ;		// 声明字符串对象
		for(int i=0;i<100;i++){			// 循环改动内容
			str1 += i ;					// 字符串的引用不断改变
		}
		System.out.println(str1) ;
	}
};
这种操作,要断开连接100次才干够完毕。这种操作性能非常低,应该避免使用。而假设非要使用这种操作,JAVA专门提供了StringBuffer类  专门完毕这种功能。

String类的经常用法

最主要方法是查询文档


Split()和replaceAll()方法是须要正则匹配的。

1字符数组与字符串

一个字符串能够变为一个字符数组。相同。也能够把一个字符数组。变为一个字符串。在String类中提供了例如以下操作方法。
   将字符串变为字符数组: public char toCharArray()
   将字符数组变为字符串: public String(char[]  value)
                                            public String(char[] value,int offset, int count)

public class StringAPIDemo01{
	public static void main(String args[]){
		String str1 = "hello" ;			// 定义字符串
		char c[] = str1.toCharArray() ;	// 将一个字符串变为字符数组
		for(int i=0;i<c.length;i++){	// 循环输出
			System.out.print(c[i] + "、") ; 
		}
		System.out.println("") ;		// 换行
		String str2 = new String(c) ;	// 将所有的字符数组变为String
		String str3 = new String(c,0,3) ;	// 将部分字符数组变为String
		System.out.println(str2) ;		// 输出字符串
		System.out.println(str3) ;		// 输出字符串
	}
};


2从字符串中取出指定位置的字符

 假设想使用此操作。则肯定返回一个char类型  public char charAt(int index)

public class StringAPIDemo02{
	public static void main(String args[]){
		String str1 = "hello" ;			// 定义String对象
		System.out.println(str1.charAt(3)) ;	// 取出字符串中第四个字符
	}
};

3字符串与byte数组的转换

 byte数组(字节数组),在一般的IO操作中会常常使用到。
在String类中提供了下面的方法能够进行字符串与字节数组之间的转换。
   字符串变为字节数组:public  byte[] getBytes()
   将一个字节数组变为字符串:
        将所有字节数组变为String: public String(byte[] bytes)
        将部分字节数组变为String: public String(byte[] bytes, int offset, int length)
public class StringAPIDemo03{
	public static void main(String args[]){
		String str1 = "hello" ;			// 定义字符串
		byte b[] = str1.getBytes() ;	// 将字符串变为byte数组
		System.out.println(new String(b)) ;	// 将所有的byte数组变为字符串
		System.out.println(new String(b,1,3)) ;	// 将部分的byte数组变为字符串
	}
};


4取得一个字符串的长度

要想取得字符串的长度: public int length()  
切记:数组的长度为length不带括号。而String是个类  ,length是个方法必需要有括号。
public class StringAPIDemo04{
	public static void main(String args[]){
		String str1 = "hello liuxun" ;		// 定义字符串变量
		System.out.println("\""+str1+"\"的长度为:"+str1.length()) ;
	}
};

5查找指定的字符串是否存在

在实际的操作中,常常会使用到推断一个字符串中是否存在某些内容。此时就能够使用下面的方法。
从头開始查找:public int indexOf(String str)
从指定的位置開始查找:public int indexOf(String str, int fromIndex)
查找的时候方法的返回值是一个int类型的数据,此数据表示的是一个字符串的详细位置,假设没有查找到此字符串则返回 -1.
public class StringAPIDemo05{
	public static void main(String args[]){
		String str1 = "abcdefgcgh" ;				// 声明字符串
		System.out.println(str1.indexOf("c")) ;		// 查到返回位置
		System.out.println(str1.indexOf("c",3)) ;	// 查到返回位置,从第4个位置開始查找
		System.out.println(str1.indexOf("x")) ;		// 没有查到返回-1
	}
};


6、去掉空格

如果如果是由用户输入的话,则就可能出现多余的空格。在这样的操作中就能够使用trim()方法去掉字符串左右的空格,可是字符串中间的空格是不可能去掉的。
public class StringAPIDemo06{
	public static void main(String args[]){
		String str1 = "    hello    " ;		// 定义字符串
		System.out.println(str1.trim()) ;	// 去掉左右空格后输出
	}
};


7 字符串的截取

  从一个指定的字符串中取出里面的部分内容,使用的方法。
  从指定的位置一直截取到结束位置:public String subString(int beginIndex)
  截取指定范围的字符串:public String subString(int beginIndex, int endIndex)
public class StringAPIDemo07{
	public static void main(String args[]){
		String str1 = "hello world" ;		// 定义字符串
		System.out.println(str1.substring(6)) ; // 从第7个位置開始截取
		System.out.println(str1.substring(0,5)) ; // 截取0~5个位置的内容
	}
};


8 拆分字符串

假设如今须要按指定的字符串去拆分一个字符串的话,则使用:public String[] split(String regex) 返回的是截取后的字符串数组。

public class StringAPIDemo08{
	public static void main(String args[]){
		String str1 = "hello world" ;		// 定义字符串
		String s[] = str1.split(" ") ;		// 按空格进行字符串的拆分
		for(int i=0;i<s.length;i++){		// 循环输出
			System.out.println(s[i]) ;
		}
	}
};


9 大写和小写转换

此功能在一般的开发语言中都会存在。将一个大写的字符串中的所有字母所有转为小写或者将一个字符串中的所有小写字母转为大写。
  小写变大写:public String toUpperCase()
  大写变小写:public String toLowerCase()

public class StringAPIDemo09{
	public static void main(String args[]){
		System.out.println("将\"hello world\"转成大写:" + "hello world".toUpperCase()) ;
		System.out.println("将\"HELLO WORLD\"转成小写:" + "HELLO WORLD".toLowerCase()) ;
	}
};


10  推断是否以指定的字符串开头或结尾

在String中能够使用下面的两个方法完毕:
    推断是否以指定的字符串开头:public boolean startsWith(String prefix)
    推断是否以指定的字符串结尾:public boolean endsWith(String suffix)
public class StringAPIDemo10{
	public static void main(String args[]){
		String str1 = "**HELLO" ;			// 定义字符串
		String str2 = "HELLO**" ;			// 定义字符串
		if(str1.startsWith("**")){			// 推断是否以“**”开头
			System.out.println("(**HELLO)以**开头") ;
		}
		if(str2.endsWith("**")){			// 推断是否以“**”结尾
			System.out.println("(HELLO**)以**结尾") ;
		}
	}
};


11 不区分大写和小写的比較

在String类中equals()方法是能够用来进行字符串的比較的。可是此种比較方法仅仅能针对于大写和小写全然一样的字符串进行比較。假设如今要是想进行不区分大写和小写的比較,则能够使用下面方法:
public boolean equalsIgnoreCase(String anotherString)
public class StringAPIDemo11{
	public static void main(String args[]){
		String str1 = "HELLO" ;			// 定义字符串
		String str2 = "hello" ;			// 定义字符串
		System.out.println("\"HELLO\" equals \"hello\" " + str1.equals(str2)) ;
		System.out.println("\"HELLO\" equalsIgnoreCase \"hello\" "
				+ str1.equalsIgnoreCase(str2)) ;	// 不区分大写和小写的比較
	}
};

 12  字符串的替换功能

在String类中提供了下面的方法用于字符串的替换操作。

 public String replaceAll(String regex, String replacement)
public class StringAPIDemo12{
	public static void main(String args[]){
		String str = "hello" ;			// 定义字符串
		String newStr = str.replaceAll("l","x")	;	// 如今将全部的l替换成x
		System.out.println("替换之后的结果:" + newStr) ;
	}
};