String基础

  1. String类是不可变字符序列(可以查看String类的源码,会发现其实String是一个字符数组)
  2. String位于java.lang包中,Java程序默认导入java.lang包下的所有类
  3. 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()
    
 
posted @ 2019-10-20 16:14  Kundalini  阅读(160)  评论(0编辑  收藏  举报