String

1:字符串

有关JAVA版本的API点击这里:Oracle

Java的字符串就是Unicode字符序列。例如:Java由4个Unicode字符J,a,v,aJava没有内置的字符串类型,而是在标准的Java类库中提供了一个预定义类,叫做String

每个用双引号括起来的字符串都是String的一个实例对象。

Java的字符串由char值序列组成。

char数据类型时一个采用UTF-16编码表示Unicode码点的代码单元。

1.1:子串

Stringsubstring方法可以从较大的字符串中提取出来一个子串。

        String sub = "Hello";
        String s = sub.substring(0,3);//从0开始,从3结束。结果即为 "Hel"

创建了一个由字符Hel组成的字符串。 substring方法的第二个参数是不想复制(在哪里停止)的第一个位置。

substring中从0开始计数,直到第二个参数结束,但不包含第二个参数。

1.2:拼接

java允许使用 + 号拼接两个字符串。

        String one = "abc";
        String two = "def";
        String three = one + two;

上述代码将abcdef赋给变量three。 当字符串与一个非字符串的值进行拼接时,后者将转换成字符串。 如果需要把多个字符串放在一起,用一个定界符分割,可以使用join方法。

        String name = String.join("/","x","f","s");
        //  name = "x/f/s"

1.3:不可变字符串

String没有提供用于 修改 字符串的方法。

所有在拼接的过程中都是创建了一个新的String对象,这样做的效率是不是会更低呢?答案是:也对,也不对。通过拼接字符串来创建一个新的字符串的效率确实不高。但是,不可变字符串却有一个优点:编译器可以让字符串共享

为了弄清楚具体的工作方式,可以想象将字符串存放在公共的存储池中。字符串变量指向存储池的相应位置。如果复制一个字符串变量,原始字符串与复制的字符串共享相同的字符。

1.4:检查字符串是否相等

可以使用equals方法来检测两个字符串是否相等。

	boolean b1 = "xiaoFsu".equals("xiaoFsu");
	//b1 为 true
	boolean b2 = "xiaoFsu".equals("xiaofsu");
	//b2 为 false

如果想要检测两个字符串是否相等,而不区分大小写,可以使用equalsIgnoreCase方法。

	boolean b = "xiaoFsu".equalsIgnoreCase("xiaofsu");
	//b 为 true

一定不要使用==运算符来检测两个字符串是否相等。

==运算符只能够确定两个字符串是否在同一个位置上(即相同对象)。如果字符串放在同一个位置上,他们必定相等。但是,完全有可能将内容相同的多个字符串的拷贝位置放在不同的位置上。

        boolean b1 = name == "xiaoFsu";
        // b1 为 true
        boolean b2 = name.substring(0,3) == "xiaoFsu";
        // b2 为 false

如果虚拟机始终将相同的字符串共享,就可以使用==运算符来进行检测是否相等。但实际上,只有字符串常量是共享的。而 +substring 等操作产生的结果并不是共享的。

1.5:空串与Null串

字符串 "" 是长度为0的字符串。 空串是一个java对象,有自己的长度(0)与内容(空)。不过,String变量还可以存储一个特殊值,名为null,这表示了没有任何的对象与该变量关联,要检查一个字符串是否是null,要使用以下添加

	String str1 = "";
        String str2 = null;
        boolean b1 = str1.equals("");
	// b1 为 true
        boolean b2 = str2 == null;
        // b2 为 true
        boolean b3 = str2.equals(str1);
        //抛出 java.lang.NullPointerException(空指针异常)  

有时候需要检查一个字符串不是null串,也不是空串,则需要这种条件:

 	str != null && str.length() != 0;
	// 无论当 str = null 或 str = "" 时,都为 false

1.6:构建字符串

有些时候,需要较短的字符串来构建字符串。采用字符串拼接的方式虽能达到目的但效率比较低。每次拼接字符串就会构建一个新的String对象,耗时且浪费空间。使用StringBuilder就可以避免这个问题的发生。

需要许多小段字符串构建一个字符串,使用StringBuilder来进行构建。

若想将StringBuilder转换为字符串对象,使用toString方法,就可以得到一个String对象,其中包含了构建器的字符序列。

	StringBuilder builder = new StringBuilder();
        //构建一个新的字符串构建器
        builder.append("xiao");
        //每次添加一部分 使用 append 方法
        builder.append("F");
        builder.append("su");
	//  builder 为 xiaoFsu
	String name = builder.toString();
	//  name  为 xiaoFsu

StringBuilder类在JDK5.0之后引入。这个类的前身是StringBuffer,其效率稍有些低,但允许采用多线程的方式执行添加或删除字符的操作。如果字符串在单线程中操作,应该使用StringBuilder

1.7:String的API

一些常用的StringAPI

	boolean equals(Object other);
        //如果字符串与 other 相等,返回 true ,否则返回 false

	boolean equalsIgnoreCase(String other);
	//如果字符串与 other 相等(忽略大小写),返回 true ,否则返回 false

	boolean startsWith(String other);
	boolean endsWith(String other);
	//如果字符串以 other 开头或结尾 返回 true
	
	int length();
	//返回字符串的长度
	
	String toLowerCase();
	String toUpperCase();
	//返回一个字符串,将原始字符由大写字母改为了小写,或将小写字母改为了大写
	
	String trim();
	//返回一个字符串,这个字符串删除了原始字符串开头与结尾的空格

	String substring(int beginIndex);	
	String substring(int beginIndex,int endIndex);
	//返回一个字符串,这个字符串包含原始字符串中从 beginIndex 到串尾,或endIndex-1 的所有代码单元。

	String replace(charSequence oldString,charSequence newString);
	//返回一个字符串,这个字符串用 newString 替换了 oldString,可以使用 String 对象作为 CharSequence 参数。
	
	int indexOf(String str);
	int indexOf(String str,int fromIndex);
	int indexOf(int cp);
	int indexOf(int cp,int fromIndex);
	//返回与字符串 str 或代码点 cp 匹配的第一个子串的开始位置。这个位置从索引0或者fromIndex开始计算。如果在原始串中不存在 str 返回 -1
	
	int lastIndexOf(String str);
	int lastIndexOf(String str,int fromIndex);
	int lastIndexOf(int cp);
	int lastIndexOf(int cp,int fromIndex);
	//返回与字符串 str 或代码点 cp 匹配的最后一个子串的开始位置。这个位置从原始串尾端或 fromIndex 开始计算。

1.8:StringBuilder的API

一些常用的StringBuilderAPI


	StringBuilder();
	//构造一个新的字符串构建器。
	
	int length();
	//返回构建器或缓冲器中的代码单元数量。

	StringBuilder append(String str);
	//追加一个字符串并返回 this;

	StringBuilder append(cha c);
	//追加一个代码单元并返回 this;

	void setCharAt(int i,char c);
	//将第 i 个代码单元更改为 c
	
	StringBuilder insert(int offset,String str);
	//在 offset 位置插入一个字符串并返回 this;

	StringBuilder insert(int offset,char c);
	//在 offset 位置插入一个代码单元并返回 this;

	StringBuilder delete(int startIndex,int endIndex);
	//删除偏移量从 startIndex 到 endIndex-1 的代码单元并返回 this;
	
	String toString();
	//返回一个与构建器或缓冲器内容相同的字符串。

本文摘自:Java核心技术 卷1