- 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()