java学习笔记33:String类及常用方法、常量池、阅读API文档、字符串的相等判断及内存分析

一、String基础

1、String类又称作不可变字符序列。

2、 String位于java.lang包中,Java程序默认导入java.lang包下的所有类。

3、Java字符串就是Unicode字符序列,例如字符串“Java”就是4个Unicode字符’J’、’a’、’v’、’a’组成的。

4、Java没有内置的字符串类型,而是在标准Java类库中提供了一个预定义的类String,每个用双引号括起来的字符串都是String类的一个实例。

注:String类内部有private final char value[] (数组),字符串的每个字符都存储在里面。

示例:String类的实例

    String e = ""  ; // 空字符串
    String greeting = " Hello World ";

5、Java允许使用符号"+"把两个字符串连接起来。
示例:字符串的连接

String s1 = "Hello";
String s2 = "World! ";
String s = s1 + s2;    //HelloWorld!
    n-符号"+"把两个字符串按给定的顺序连接在一起,并且是完全按照给定的形式。

    n-当"+"运算符两侧的操作数中只要有一个是字符串(String)类型,系统会自动将另一个操作数转换为字符串然后再进行连接。

示例:"+"连接符

int age = 18;
String str = "age is" + age;    //str赋值为"age is 18"
//这种特性通常被用在输出语句中:
System.out.println("age  is" + age);

代码示例:String类的基本用法

/**
 * 测试字符串类的基本用法
 */
public class testString {
	public static void main(String[] args) {
		String s1 = "abc";
		String s2 = new String("defg");
		String s3 = "abc" + "defg";    
		System.out.println(s3);
		String s4 = "15" + 20;    //不是加法,是字符串连接符
		System.out.println(s4);
	}
}

运行结果:
String类的基本用法

二、String类和常量池

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

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

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

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

【示例5-28】常量池

String str1 = "abc";
String str2 = new String("def");
String str3 = "abc";
String str4 = str2.intern();
String str5 = "def";
System.out.println(str1 == str3);// true
System.out.println(str2 == str4);// false
System.out.println(str4 == str5);// true

        示例5-28的首先经过编译之后,在该类的class常量池中存放一些符号引用,然后类加载之后,将class常量池中存放的符号引用转存到运行时常量池中,然后经过验证,准备阶段之后,在堆中生成驻留字符串的实例对象(也就是上例中str1所指向的“abc”实例对象),然后将这个对象的引用存到全局String Pool中,也就是String Pool中,最后在解析阶段,要把运行时常量池中的符号引用替换成直接引用,那么就直接查询String Pool,保证String Pool里的引用值与运行时常量池中的引用值一致,大概整个过程就是这样了。
  
  回到示例5-28的那个程序,现在就很容易解释整个程序的内存分配过程了,首先,在堆中会有一个“abc”实例,全局String Pool中存放着“abc”的一个引用值,然后在运行第二句的时候会生成两个实例,一个是“def”的实例对象,并且String Pool中存储一个“def”的引用值,还有一个是new出来的一个“def”的实例对象,与上面那个是不同的实例,当在解析str3的时候查找String Pool,里面有“abc”的全局驻留字符串引用,所以str3的引用地址与之前的那个已存在的相同,str4是在运行的时候调用intern()函数,返回String Pool中“def”的引用值,如果没有就将str2的引用值添加进去,在这里,String Pool中已经有了“def”的引用值了,所以返回上面在new str2的时候添加到String Pool中的 “def”引用值,最后str5在解析的时候就也是指向存在于String Pool中的“def”的引用值,那么这样一分析之后,结果就容易理解了。

三、阅读API文档(当字典看)

如何下载API文档

  1. 下载地址,点击进入:

    http://www.oracle.com/technetwork/java/javase/documentation/jdk8-doc-downloads-2133158.html

    API下载界面图:
    API下载界面图

  2. 下载成功后,解压下载的压缩文件,点击进入docs/api下的index.html文件即可。
    打开index.html文件:
    打开index.html文件

API文档如何阅读
在这里插入图片描述
eclipse中将鼠标放到类或方法上,即可看到相关的注释说明;再按下F2即可将注释窗口固定。
在这里插入图片描述

四、String类常用的方法

String类是我们最常使用的类。字符串类的方法我们必须非常熟悉!

String类的常用方法列表:
String类的常用方法列表
String类常用方法一:

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);
    }
}

运行结果:
在这里插入图片描述

String类常用方法二:

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(4, 7);//提取子字符串:下标[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不变
    }
}

五、字符串相等判断

1、equals方法用来检测两个字符串内容是否相等。如果字符串s和t内容相等,则s.equals(t)返回true,否则返回false。

2、要测试两个字符串除了大小写区别外是否是相等的,需要使用equalsIgnoreCase方法。

3、判断字符串是否相等不要使用 “==”。

示例:忽略大小写的字符串比较

        "Hello".equalsIgnoreCase("hellO");    //true

示例:字符串的比较"=="与equals()方法

public class TestStringEquals {
    public static void main(String[] args) {
        String g1 = "北京尚学堂";
        String g2 = "北京尚学堂";
        String g3 = new String("北京尚学堂");
        System.out.println(g1 == g2); // true  指向同样的字符串常量对象
        System.out.println(g1 == g3); // false  g3是新创建的对象
        System.out.println(g1.equals(g3)); // true  g1和g3里面的字符串内容是一样的
    }
}

运行结果:
在这里插入图片描述
内存分析:
内存分析

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值