java从基础知识(二)字符串处理

字符串是程序开发中使用最为频繁,因此为了工作的高效和作为一名想进阶的程序员,了解并掌握字符串的处理显得尤为重要。java为我们提供了String、StringBuffer、StringBuilde三个处理字符串的类,下面我们对其做一个总结和介绍。

1、分别介绍

  1)String

  解答1:

  我们在查看API文档的时候,会发现有这么一句话“字符串是常量,它们的值在创建之后不能更改”。众所周知常量是用final修饰的,一旦创建在程序的其他地方无法修改。这时我们就会快速的回想,在我们日常的开发中String是可以随时随地可对其赋值的,难道是jdk的API文档写错了?其实不然,下面我们对其原理进行讲解。

复制代码
public static void main(String arg[]){
    String str1 = "a";
    String str2 = str1;
    String str4 = str2;
    System.out.println(str1 == str2);//true,说明引用stt1和引用str2指向了同一地址
    String str3 = "b";
    str1 = str1 + str3;
    System.out.println(str1 == str2);//false,说明引用str1所指向的地址已经改变
    System.out.println(str2 == str4);//true
    str2 = str2 + str3;
    System.out.println(str2 == str4);//false,说明引用str2所指向的地址已经改变
    System.out.println(str1 == str2);//false
}
复制代码

  因为String是引用类型,引用类型在内存中的存储如下图

  

  也就是说,当我们在对str1做改变的时候,只是改变了其在栈内存中存储的引用所指向的地址,与此同时java虚拟机会为其在堆内存中重新分配新的空间,而原来堆内存地址存储的值(因为是常量)并没有发生改变,会作为无用的引用被java回收站处理,到此相信可以顺利理解上述代码。

  解答2:

复制代码
public class Test {

    private final static String s1 = "abc";
    private final static String s2 = "abc";

    public static void main(String arg[]){
        String str1="abc";
        String str2="abc";
        String str3="ab"+"c";
        String str4=new String(str2);
        System.out.println(str1 == str2);//true,说明str1、str2指向同一地址
        System.out.println(str1 == str3);//true,说明str1、str3指向同一地址
        System.out.println(str1 == str4);//false,说明str1、str4指向不同的地址
        System.out.println(s1 == s2);//true,说明s1、s2指向同一地址
        System.out.println(str1 == s1);//true,说明str1、s1指向同一地址
    }

}
复制代码

    上述现象是有常量在内存中的存储规则决定的,java代码在编译的阶段会在代码区中分配出一块存储区域,作为常量池,用于存储常量值。当再有常量被申明时,编译器会去常量池中查找这个字符串是否存在,若存在则将这个字符串的引用直接指向字符串所在

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值