Java String类和常量池

String 部分源码

Java String类和常量池

学习笔记

package cn.jason.oop;
/**
 * 测试字符串类的基本语法
 *   不可变字符串
 * @author Jason
 *
 */
public class TestString {
	public static void main(String[] args){
		String str = "WorkHard";
		String str1 = new String("HardWork");
		String str2 = "123"+"456";
		String str3 = "18" + 19; //这里不是加法,是字符串连接符
		System.out.println(str3);
		if(str3 instanceof String){
			System.out.println("str3是字符串");
		}
		
		
		System.out.println("-------------------------------");
		String str10 = "jason";
		String str11 = "jason";
		String str12 = new String("jason");
		
		System.out.println(str10 == str11);
		System.out.println(str10 == str12);//str10 和 str12 不是同一个对象
		
		System.out.println(str10.equals(str12));//所以比较字符串时,使用equals较好
		
	}
}

 

 在Java的内存分析中,我们会经常听到关于“常量池”的描述,实际上常量池也分了以下三种:

1. 全局字符串常量池(String Pool)

      全局字符串常量池中存放的内容是在类加载完成后存到String Pool中的,在每个VM中只有一份,存放的是字符串常量的引用值(在堆中生成字符串对象实例)。

2. class文件常量池(Class Constant Pool)

      class常量池是在编译的时候每个class都有的,在编译阶段,存放的是常量(文本字符串、final常量等)和符号引用。

3. 运行时常量池(Runtime Constant Pool)

      运行时常量池是在类加载完成之后,将每个class常量池中的符号引用值转存到运行时常量池中,也就是说,每个class都有一个运行时常量池,类在解析之后,将符号引用替换成直接引用,与全局常量池中的引用值保持一致。

 String类是我们最常使用的类。字符串类的方法我们必须非常熟悉!我们列出常用的方法,请大家熟悉。

     表1 String类的常用方法列表

Java String类和常量池

【示例1】String类常用方法一

1

2

3

4

5

6

7

8

9

10

11

12

13

14

public class StringTest1 {

    public static void main(String[] args) {

        String s1 = "core Java";

        String s2 = "Core Java";

        System.out.println(s1.charAt(3));//提取下标为3的字符

        System.out.println(s2.length());//字符串的长度

        System.out.println(s1.equals(s2));//比较两个字符串是否相等

        System.out.println(s1.equalsIgnoreCase(s2));//比较两个字符串(忽略大小写)

        System.out.println(s1.indexOf("Java"));//字符串s1中是否包含Java

        System.out.println(s1.indexOf("apple"));//字符串s1中是否包含apple

        String s = s1.replace(' ''&');//将s1中的空格替换成&

        System.out.println("result is :" + s);

    }

}

      执行结果如图1所示:

Java String类和常量池

图1 示例1运行效果图

【示例2】String类常用方法二

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

public class StringTest2 {

    public static void main(String[] args) {

        String s = "";

        String s1 = "How are you?";

        System.out.println(s1.startsWith("How"));//是否以How开头

        System.out.println(s1.endsWith("you"));//是否以you结尾

        s = s1.substring(4);//提取子字符串:从下标为4的开始到字符串结尾为止

        System.out.println(s);

        s = s1.substring(47);//提取子字符串:下标[4, 7) 不包括7

        System.out.println(s);

        s = s1.toLowerCase();//转小写

        System.out.println(s);

        s = s1.toUpperCase();//转大写

        System.out.println(s);

        String s2 = "  How old are you!! ";

        s = s2.trim();//去除字符串首尾的空格。注意:中间的空格不能去除

        System.out.println(s);

        System.out.println(s2);//因为String是不可变字符串,所以s2不变

    }

}

      执行结果如图2所示:

Java String类和常量池

图2 示例2运行效果图