1. String 类介绍

String 类代表字符串。Java程序可以方便的处理字符串类型的数据信息,而这都要归功于java中String类提供的强大功能。

String 类描述的是文本字符串序列,即多个字符组成的一串数据。 

String 类的定义:

public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence { ... }

2. Java 中的字符串与 String

Java 中字符串是常量,它们的值在创建之后不能更改。 
String 类的引用可以指向不同的字符串,这 是因为字符串对象虽然是不能修改的, 但是它们的地址 可以共享。 
java 程序类似于 c 语言, 运行时会把程序占用的内存大致分割成几个部分,分别是 stuck(栈区), Heap(堆区), Data(数据区)和代码区,其中数据区用于存放静态变量和字符串常量。

String接收文件 java string.java_System

3. String 类的本质

Java 类的本质大致上可以理解为成员(属性) 和方法的集合体。

String接收文件 java string.java_字符串_02

String 类也一样, 只不过 String 类有 一个关键的成员(hsah), 这个成员保存着数据区的某个字符串的内存地址。 可以理解为一个指针。而 String 类的方法是一些对对应字符串的查询方法(例如 indexOf(), charAt()等)。

注意, 并没有对字符串进行修改的方法, 字符串是常量, 不能修改。 
虽然 String 类不能修改字符串, 但是保存字符串地址的成员却是可以被改变的, 也就是说 String 类的对象可以指向另一个字符串。 

 

4. String 类实例化对象的方法之 new String("abc") 

/*
	String类有很多构造方法,常用的有两种,第一是与其它类一样利用构造函数。
	如:String str = new String("abc"); 
	上面的代码做了下面若干件事情: 
	1. 在数据区中划分一块内存存放字符串, 值是"abc", 这块内存一旦创建, 值"abc" 不能被修改。 
	2. 在堆区划分一块对象内存, 其中一小块用于存放上面字符串的地址, 另一些用于存放函数指针。 
	3. 在栈区划分一块内存, 存放上面堆区的头部地址。 
*/
public class String_2{   
    public static void main(String args[]){		// 输出结果
        String s1 = new String("cat");			// 
        String s2 = new String("cat");			
        System.out.printf("s1: %s\n", s1);		// s1: cat
        System.out.printf("s2: %s\n", s2);		// s2: cat
        System.out.println(s1 == s2);			// false
        System.out.println(s1.equals(s2));		// true
    }   
}   
/*
 * 结果分析:
 * 		因为 String 类重写了 equals() 方法,所以 s1.equals(s2) 比较的是内容,两者相同,返回 true。
 * 		而 "==" 比较的是地址,返回 false,
 * 		说明两次 new String("cat"),在数据区,堆区,栈区分别开辟了两块地址。
 * 		这是 "==" 返回 false 的原因
 */

5. String 类实例化对象的方法之= "abc" 

/*
	事实上, 我们在编程中新建一个字符串更多情况下会用如下的方式: 
	String s = "abc";
	
	利用这种方式创建的String对象的的时候,Java会首先检测当前进程的数据区,
	是否有一个以同样的方式创建的值也是一样的字符串存在。
	如果无,就以类似于 new String("abc"); 的方式创建一个出来,
	如果有,则直接把该对象的地址指向已经存在的字符串在堆区的内存地址。
*/
public class String_3{
    public static String g(){   
        String s4 = "cat";   
        return s4;   
    }
    public static void main(String args[]) {	// 输出结果
        String s1 = new String("cat");   
        String s2 = "cat";   
        String s3 = "cat";   
        System.out.printf("s1: %s\n", s1);		// s1: cat
        System.out.printf("s2: %s\n", s2);		// s2: cat
        System.out.printf("s3: %s\n", s3);		// s3: cat
        System.out.println(s1 == s2);			// false
        System.out.println(s2 == s3);			// true
        System.out.println(s2 == g());			// true
    }   
} 
/*
 * 结果分析:
 * 		其中 s2,s3,s4 都是使用的 String s = "abc"; 方式创建的,这些对象其实都指向了同一个内存区
 * 		所以三个变量的地址相同,
 * 		而 s1 是通过构造函数 new 出来的,会重新开辟空间,指向新的内存,所以地址不同。
 * 
 * 		由于这种特性, 所以这种用= "abc"方式创建的对象十分适合做 synchronized 对象锁要锁的对象。 
 * 		不用担心锁的是两个不同的对象导致多线程同步失败。 
 */

6. String 类的常用方法 

6.1 判断功能
public boolean equals(Object obj);    // 将此字符串与指定的对象比较。
public boolean equalsIgnoreCase(String str);    // 将此 String 与另一个 String 比较,不考虑大小写。
public boolean contains(CharSequence s);    // 当且仅当此字符串包含指定的 char 值序列时,返回 true。
public boolean startsWith(String prefix);    // 测试此字符串是否以指定的前缀开始。 
public boolean endsWith(String suffix);    // 测试此字符串是否以指定的后缀结束。 
public boolean isEmpty();    // 当且仅当 length() 为 0 时返回 true。

6.2 获取功能
public int length();    // 返回此字符串的长度。
public char charAt(int index);    // 返回指定索引处的 char 值。
public int indexOf(int ch);    // 返回指定字符在此字符串中第一次出现处的索引。
public int indexOf(String str);    // 返回指定子字符串在此字符串中第一次出现处的索引。
public int indexOf(int ch,int fromIndex);    // 返回在此字符串中第一次出现指定字符处的索引,从指定的索引开始搜索。
public int indexOf(String str,int fromIndex);    // 返回指定子字符串在此字符串中第一次出现处的索引,从指定的索引开始。
public String substring(int start);    // 返回一个新的字符串,它是此字符串的一个子字符串。
public String substring(int start,int end);    // 返回一个新字符串,它是此字符串的一个子字符串。

6.3 转换功能
public byte[] getBytes();    // 使用平台的默认字符集将此 String 编码为 byte 序列,并将结果存储到一个新的 byte 数组中。
public char[] toCharArray();    // 将此字符串转换为一个新的字符数组。
public static String valueOf(char[] chs);    // 返回 char 数组参数的字符串表示形式。
public static String valueOf(int i);    // 返回 int 参数的字符串表示形式。其中 int 可以换成 long float double
public String toLowerCase();    // 使用默认语言环境的规则将此 String 中的所有字符都转换为小写。
public String toUpperCase();    // 使用默认语言环境的规则将此 String 中的所有字符都转换为大写。
public String concat(String str);    // 将指定字符串连接到此字符串的结尾。

6.4 替换功能
public String replace(char old,char new);    // 返回一个新的字符串,它是通过用 newChar 替换此字符串中出现的所有 oldChar 得到的
public String replace(String old,String new);    // 使用指定的字面值替换序列替换此字符串所有匹配字面值目标序列的子字符串。
 
6.5 去空格功能
public String trim();    // 返回字符串的副本,忽略前导空白和尾部空白。

6.6 分割功能
public String[] split(String regex);    // 根据给定正则表达式的匹配拆分此字符串。

6.7 格式化功能
public static String format(String format, Object... args);    // 使用指定的格式字符串和参数返回一个格式化字符串。 
      
6.8 按字典比较功能
/* 
	// 按字典顺序比较两个字符串。
	参数字符串等于此字符串,则返回值 0;
	如果此字符串按字典顺序小于字符串参数,则返回一个小于 0 的值;
	如果此字符串按字典顺序大于字符串参数,则返回一个大于 0 的值。
 */
public int compareTo(String str);				

/*
	// 按字典顺序比较两个字符串,不考虑大小写。
	根据指定 String 大于、等于还是小于此 String(不考虑大小写),
	分别返回一个负整数、0 或一个正整数。
 */
public int compareToIgnoreCase(String str);