JAVA中的字符串及常用方法

字符串是程序设计中不可或缺的一部分,每种语言都有字符串类型的相关操作。

那么在JAVA中,字符串String对象实际上是不可改变的,String类中每一个看似会修改String值的方法,实际上都只是创建了另一个全新的String对象来保存修改后的String对象,而最初的String对象并未发生改变。看如下一段代码:

package access;

public class Immutable {
	public static String upcase(String s){
		return s.toUpperCase();
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		String q = "hello";
		System.out.println(q);
		String w = upcase(q);
		System.out.println(w);
		System.out.println(q);
	}

}
此程序的输出结果为:


当将q传递给upcae方法时实际传递的是一个引用的拷贝,其实每当把String对象作为方法的参数时,都会复制一份引用,而真实的引用所指的对象仍然是原来的对象并且此对象一直都在单一的物理地址上存储着,并未发生任何改动。

upcase方法中,传入其中的引用被赋值为s名称,只有在upcase运行时,s才有意义,s的作用域仅在upcase函数中,upcase的返回值其实只是最终结果的引用,而原本的q仍然在那个物理地址上。参数是为该方法提供信息的,而并不是让方法改变自己的。

String对象是不可变的,因此我们可以给一个String对象加以任意多的别名,String对象只具有只读性,所以指向它的任何引用都不会改变它的值。这会带来效率的一定提高,比如为String对象而重载过的“+”运算符,另一个重载过的运算符是“+=”,这是JAVA中仅有的重载过的两个运算符,并且JAVA不允许重载任何运算符。看下面一段代码:

package access;

public class Concatenation {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		String h = "hello";
		String w = "oh," + h + " world" + "!";
		System.out.println(w);
	}

}
此程序的输出结果为:


而在JAVA中,利用StringBuilder类来构造String对象会更加方便快捷,StringBulider还允许我们预先为其指定大小,如果我们指定最终的字符串大概有多长,那预先指定StringBuilder的大小可以避免多次重新分配缓冲。当我们为一个类编写toString方法时,如果字符串比较简单,那就可以信赖编译器,它会为我们自动创建最终的字符串结果,但是如果我们要在toString中使用循环,那么我们最好创建一个StrinBuilder对象,用它来构建最后的结果,看如下一段代码:

package access;
import java.util.*;
public class UsingStringBuilder {
	public static Random rand = new Random(47);
	public String toString(){
		StringBuilder result = new StringBuilder("[");
		for(int i = 0; i < 25; i++){
			result.append(rand.nextInt(100));
			result.append(",");
		}
		result.delete(result.length()-1, result.length());
		result.append("]");
		return result.toString();
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		UsingStringBuilder usb = new UsingStringBuilder();
		System.out.println(usb);
	}

}
此程序的输出结果为:


StringBuilder提供了丰富的方法,包括insert、repleace、substring、reverse、append、toString和delete方法。该例子中的delete方法用于删掉最后的“,”来添加“]”。

如果我们希望toString方法打印出对象的内存地址,或许会考虑用到“this”,看下面一段代码:

package access;
import java.util.*;
public class InfiniteRecursion {
	public String toString(){
		return "InfiniteRecursion address: " + this + "\n";
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		List<InfiniteRecursion> v = 
				new ArrayList<InfiniteRecursion>();
		for(int i = 0; i < 10; i++)
			v.add(new InfiniteRecursion());
		System.out.println(v);
	}

}
此程序会抛出异常,抛出异常的原因在于return语句,在返回时“+”运算符会连接字符串,所以对于“this”来说会自动转换为String类型,而在转换的时候又会调用toString方法,此时就发生了递归调用的异常。修改代码:

package access;
import java.util.*;
public class InfiniteRecursion {
	public String toString(){
		return "InfiniteRecursion address: " + super.toString() + "\n";
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		List<InfiniteRecursion> v = 
				new ArrayList<InfiniteRecursion>();
		for(int i = 0; i < 10; i++)
			v.add(new InfiniteRecursion());
		System.out.println(v);
	}

}
此程序的输出为:


我们应当调用的是Object.toString方法,所以不该使用this,应当使用super。
另附String上的一些常用方法:

length();无参数。返回String中字符的个数。

charAt();参数为int索引。取得String中位于该索引位置上的char。

getChar(),getBytes();参数为要复制部分的起点和终点的索引,复制的目标数组,目标数组的起始索引。用于复制char或byte到一个目标数组中。

toCharArray();无参数。生成一个char数组,包含String的所有字符。

equals(),equalsIgnoreCase();参数为与之进行比较的String。比较两个String的内容是否相同。

compareTo();参数为与之进行比较的String。按词典顺序比较String中的内容,比较结果为负数,零或正数,大小写并不等价。

contains();参数为要搜索的CharSequence。如果该String对象包含参数的内容,则返回true。

contentEquals();参数为与之进行比较的CharSequence或StringBuffer。如果该String与参数的内容完全一致,则返回true。

equalsIgnoreCase();参数为与之进行比较的String。忽略大小写,如果两个String的内容相同,则返回true。

regionMatcher();参数为该String的索引偏移量,另一个String及其索引偏移量,要比较的长度。返回boolean结果,以表明所比较区域是否相等。

startsWith();参数为可能的起始String。返回boolean结果,以表明该String是否以此参数起始。

endsWith();参数为该String可能的后缀String。返回boolean结果,以表明此参数是否该字符串的后缀。

indexOf(),lastIndexOf():无参数。如果该String并不包含参数,就返回-1;否则返回此参数在String中的起始索引,lastIndexOf()是从后向前搜索。

substring(subSequence()):返回一个新的String,以包含参数指定的字符串。

concat():参数为要连接的String。返回一个新的String对象,内容为原始String连接上参数String。

replace();参数为要替换掉的字符,用来进行替换的新字符,也可以用一个CharSequence来替换另一个CharSequence。返回替换字符后的新String对象。如果没有发生替换,则返回原始的String对象。

toLowerCase(),toUpperCase():无参数。将字符的大小写改变后,返回一个新的String对象;如果没有发生改变,则返回原始的String对象。

trim():无参数。将String两端的空白字符删除后,返回一个新的String对象。如果没有发生改变,则返回原始的String对象。

valueOf():返回一个表示参数内容的String。

intern():无参数。为每个唯一的字符序列生成一个且仅生成一个String引用。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值