- String类是不可变字符序列(可以查看String类的源码,会发现其实String是一个字符数组)
- String位于java.lang包中,Java程序默认导入java.lang包下的所有类
- Java字符串就是Unicode字符序列,例如字符串"Java"就是4个Unicode字符'J'、'a'、'v'、'a' 组成
常量池分为3种:
1.全局字符常量池(String Pool)
全局字符常量池中存放的内容是在类加载完成后存到String Pool中的,在每个JVM中只有一份,存放的是字符串常量的引用值(在堆中生成字符串对象实例)
2.class文件常量池(Class Constant Pool)
class常量池是在编译的时候每个class都有的,在编译阶段,存放的是常量(文本字符串、final常量等)和符号引用。
3.运行时常量池(Runtime Constant Pool)
运行时常量池是在类加载完成后,将每个class常量池中的符号引用值转存到运行时常量池中,也就是说,每个class都有一个运行时常量池,类在解析之后,将符号引用替换成直接引用,与全局常量池中的引用值保持一致。
Example:
1 package com.teststring; 2 public class TestString { 3 public static void main(String[] args) { 4 String str1="Tom"; 5 String str2="Tom"; 6 String str3="Mike"; 7 String str4="Mike"; 8 String str5 = new String("Tom"); 9 String str6 = new String("Mike"); 10 11 System.out.println(str1==str2); 12 System.out.println(str1==str3); 13 System.out.println(str3==str4); 14 System.out.println(str3==str5); 15 System.out.println(str5==str6); 16 } 17 } 18 19 输出结果: 20 true 21 false 22 true 23 false 24 false
可以看到str1==str2输出结果是true,str3==str4的输出结果也是true,因为它们分别都在“Tom”常量池和“Mike”常量池,因此是相等的。而str1和str3是不同的,str5和str6都是new出来的,所以是在一个不同的常量池中的
对于通过new产生一个字符串(假设为”Tom”)时,会先去常量池中查找是否已经有了"Tom"对象,如果没有则在常量池中创建一个此字符串对象,然后堆中再创建一个常量池中此”Tom”对象的拷贝对象。
这也就是有道面试题:String s = new String(“xyz”);产生几个对象?答:一个或两个,如果常量池中原来没有”xyz”,就是两个。
通常比较字符串时使用equals()