String
类代表字符串。Java 程序中的所有字符串字面值(如 "abc"
)都作为此类的实例实现。
字符串是常量;它们的值在创建之后不能更改。字符串缓冲区支持可变的字符串。因为 String 对象是不可变的,所以可以共享。例如:
String str = "abc";
等效于:
char data[] = {'a', 'b', 'c'}; String str = new String(data);
下面给出了一些如何使用字符串的更多示例:
System.out.println("abc"); String cde = "cde"; System.out.println("abc" + cde); String c = "abc".substring(2,3); String d = cde.substring(1, 2);
字符串内存结构
String str1 = " abc ",这种创建字符串,系统会在字符串常量区先查找是否有 abc 这个字符串,如果没有就分配一个空间创建出 abc 字符串,然后在栈区分配空间创建 str1 存储 abc 在字符串常量池中的地址。
String str2 = " abc",当在创建abc字符串时,同理先在字符串常量区查找,已经存在了,直接将地址存储到栈区 str2 的内存空间。
String str3 = new String("abc") ,这种方式创建字符串,首先在栈区分配给 str3 一个内存空间,在堆区分配一个空间创建abc,并将这个空间的地址存储到 str3 的内存空间。在堆区创建完字符串后,系统会检测字符串常量区是否有这个字符串,如果没有,就会将这个字符串复制到字符串常量区。
String str4 = new String("ab"),创建过程同上,因为字符串常量区没有 ab 这个字符串,所以系统就会在字符串常量区分配一个内存空间,将 ab 复制过去。
String str5 = "ab",直接将字符串常量区里 ab 的地址存储到栈区 str5 的内存空间。
String str6 = new String();
str6 = "abc"; //第一句先在栈曲创建 str6 的内存空间,然后堆区也会创建一个内存空间,将这个内存空间的地址存储到 str6 的内存空间中,第二句,赋值给 str6 一个abc字符串,然后在字符串常量区查找,将abc的地址替换掉 str6里存储的地址。
在String类中,也就是String对象中
如果使用 == 比较:比较的是两个字符串的地址是否一样
如果使用 equals 方法比较,比较的是两个字符串的内容是否一样
常用方法
1、charAt
返回指定索引处的 char 值
public class StringDemo{
public static void main(String[] args){
String str5 = "javase";
char c = str5.charAt(2);
System.out.println(c);
int a = str5.codePointAt(2);
System.out.println(a);
}
}
2、codePointBefore
返回指定索引之前的字符
3、compareTo
按字典顺序比较两个字符串
4、compareToIgnoreCase
按字典顺序比较两个字符串,不考虑大小写