深入理解Java字符串:

0、前言

Java中一个给定的字符串对象一旦构造了实例就不能改变。换句话说,一旦定义String s = "Hello " + yourname,变量s所引用的特定对象内容就不可以改变。你可以让变量s引用另一个字符串,甚至可以引用一个从原来的字符串中派生出来的子串,例如s = s.trim()。你还可以通过调用charAt(),从原来的字符串中提取字符。但它不叫getCharAt(),因为没有一个当然也不可能存在一个setCharAt()方法。事实上,即使是toUpperCase*()这样的方法也不能改变字符对象,只能返回一个新的字符串对象,包含转换后的字符串。相反,如果你需要改变字符串中的字符,则应创建一个StringBuilder对象(初始化为String对象的值),再修改StringBuilder对象,最后调用toString()方法再转换为String对象。

字符串的不变形时Java虚拟机的基本原理之一。不变形对象通常有利于保证软件的可靠性,避免发生冲突,特别时牵涉到多个线程时,或者来自多个组织的软件协同工作。例如,你可以安全地将不可变对象传递给第三方库并且期望对象不被修改。

因此,String是Java的一个基本类型。与核心API中大多数其他类不同,字符串行为是不可变的,String类有final标记,因此不能从它派生出子类。

如果确定需要修改字符串时,可以采用提取字符串的方法进行修改,下面将逐一介绍

1、Java 截取字符串SubString方法

public class SubStringDemo{
	public static void main(String[] args) {
		String a = "Java is the best language all over the world" ;
		System.out.println(a);
		String b = a.substring(5);
		System.out.println(b);
		String c= a.substring(5,7);
		System.out.println(c);
		String d = a.substring(5,a.length());
		System.out.println(d);
		
		/**
	Java is the best language all over the world
	is the best language all over the world
	is
	is the best language all over the world

		*/		
	}
	
}

2、Java分割字符串成词

可以使用StringTokenizer的方法进行分割,或者使用正则表达式,StringTokenizer有三个构造方法,分别如下:

public StringTokenizer(String str)
public StringTokenizer(String str, String delim)
public StringTokenizer(String str, String delim, boolean returnDelims)
第一个参数就是要分隔的String,第二个是分隔字符集合,第三个参数表示分隔符号是否作为标记返回,如果不指定分隔字符,默认的是:”\t\n\r\f”
import java.util.StringTokenizer;
public class SubTokDemo{
public static void main(String[] args) {
	String str = "Hello World of Java";
	StringTokenizer st = new StringTokenizer(str);
	while (st.hasMoreTokens()) { // 
	   System.out.println("Token:" + st.nextToken());
	}
	
	//最简单的方法是使用一个正则表达式。
	for(String word : str.split(" ")){
		System.out.println(word);
	}
}

}

3、Java处理单个字符串(如何处理字符串中的单个字符)

解决方案:
使用一个for循环和String的charAt()方法,或者使用“for each”循环和String的toCharArray方法。

其中String的charAt()方法根据索引号(从0开始)在字符串对象中检索某个字符。如果要处理所有字符,则需逐个进行处理,需要使用一个for循环,循环计数从零到String.length()-1。下面的程序处理字符串的所有字符:

public class StrCharAt{
	public static void main(String[] args) {
		String a = "A quick bronze for lept a lazy bovine";
		for (int i = 0;i<a.length();i++){
			System.out.println("Char"+i+"is"+a.charAt(i));
		}
		for (char ch : a.toCharArray()) { // 
		   System.out.println(ch);
		}
	}
	
}

4、Java输出字符串左右对齐或居中对齐

文本的居中和左右对齐调整是经常遇到的工作。假设想打印一个简单的报告,并在报告也居中显示页码。使用标准API似乎还不能做到一部到位。
下面的StringAlign类可以实现:

import java.text.FieldPosition;
import java.text.Format;
import java.text.ParsePosition;

/**
 * Bare-minimum String formatter (string aligner).
 */
// BEGIN main
public class StringAlign extends Format {

private static final long serialVersionUID = 1L;

public enum Justify {
	/* Constant for left justification. */
	LEFT,
	/* Constant for centering. */
	CENTER,
	/** Constant for right-justified Strings. */
	RIGHT,
}

/** Current justification */
private Justify just;
/** Current max length */
private int maxChars;

/** Construct a StringAlign formatter; length and alignment are
 * passed to the Constructor instead of each format() call as the
 * expected common use is in repetitive formatting e.g., page numbers.
 * @param maxChars - the maximum length of the output
 * @param just - one of the enum values LEFT, CENTER or RIGHT
 */
public StringAlign(int maxChars, Justify just) {
	switch(just) {
	case LEFT:
	case CENTER:
	case RIGHT:
		this.just = just;
		break;
	default:
		throw new IllegalArgumentException("invalid justification arg.");
	}
	if (maxChars < 0) {
		throw new IllegalArgumentException("maxChars must be positive.");
	}
	this.maxChars = maxChars;
}

/** Format a String.
 * @param input - the string to be aligned.
 * @parm where - the StringBuilder to append it to.
 * @param ignore - a FieldPosition (may be null, not used but
 * specified by the general contract of Format).
 */
@Override
public StringBuffer format(
	Object input, StringBuffer where, FieldPosition ignore)  {

	String s = input.toString();
	String wanted = s.substring(0, Math.min(s.length(), maxChars));

	// Get the spaces in the right place.
	switch (just) {
		case RIGHT:
			pad(where, maxChars - wanted.length());
			where.append(wanted);
			break;
		case CENTER:
			int toAdd = maxChars - wanted.length();
			pad(where, toAdd/2);
			where.append(wanted);
			pad(where, toAdd - toAdd/2);
			break;
		case LEFT:
			where.append(wanted);
			pad(where, maxChars - wanted.length());
			break;
		}
	return where;
}

protected final void pad(StringBuffer to, int howMany) {
	for (int i=0; i<howMany; i++)
		to.append(' ');
}

/** Convenience Routine */
String format(String s) {
	return format(s, new StringBuffer(), null).toString();
}

/** ParseObject is required, but not useful here. */
public Object parseObject (String source, ParsePosition pos)  {
	return source;
}
}
// END main

实例化:

/* Align a page number on a 70-character line. */
// BEGIN main
public class StringAlignSimple {

	public static void main(String[] args) {
		// Construct a "formatter" to center strings.
		StringAlign formatter = new StringAlign(70, StringAlign.Justify.CENTER);
		// Try it out, for page "i"
		System.out.println(formatter.format("- i -"));
		// Try it out, for page 4. Since this formatter is
		// optimized for Strings, not specifically for page numbers,
		// we have to convert the number to a String
		System.out.println(formatter.format(Integer.toString(4)));
	}
}
// END main