java String类原理浅析

一.String类

    String 表示一个字符串,内部使用字符数组实现,该类不可变

二.存储

上图为下列语句执行的内存存储过程:
String S1 = “粪粪”;
String S2 = new String(“粪粪”);
String S3 = “粪粪”;

三.String实例(注释很详细):

public class StringDemo {
    public static void main(String[] args) {
        //String 的两种赋值方式的分析,推荐第一种

        //1.直接赋值
        String S1 = "粪粪";
        //2.使用new关键字创建对象 new :表示在堆中申请内存空间,强制型的一个操作
        //面试题:下面语句创建了几个对象?  --->1个
        String S2 = new String("粪粪");

        System.out.println(S1==S2);//比较指向的地址,返回false

        //String 类在运行期和编译期的分析
        String S3 = "粪粪"; //常量池已有"粪粪",所以不会再创建对象,直接指向,省了内存空间
        System.out.println(S1==S3); //在常量池中找,所以会返回true
        System.out.println("-----------我是可爱的分割线---------");

        //4种情况分析:直接赋值,字符串连接时,分析编译器和运行期
        //如果在编译期值可以被确定,那就使用已有的对象,否则会创建新的对象
        String a = "a";//编译时可以确定,所以直接把变量a替换成"a"
        String a1 = a+1;//编译时语句是一句一句来的,会把a当成是变量,不可以确定,变量在运行的时候才有值,上一句跑了,a才有值,然后a1才会为"a1",
        //所以这句话会在堆中创建一个a1对象
        String a2 = "a1";//这句则在常量池中创建一个"a1",因此a1==a2 :false
        System.out.println(a1==a2);

        final String b="b";
        String b1=b+"1"; //编译期b到这里已替换,1加不加双引号无所谓,final才可以,没有final就还是变量
        String b2 = "b1";
        System.out.println(b1==b2);//true

        String c = getC();  //注意,方法只有在运行期才能得到结果
        String c1 = c+1;
        String c2 = "c1";
        System.out.println(c1==c2);  //false

        final String d = getD();
        String d1 = d+1;
        String d2 = "d1";
        System.out.println(d1==d2);//还是false,因为虽然d是final,但方法只有在运行时才有返回结果,因此一样是false
    }

    private static String getC(){
        return "c";
    }

    private static String getD(){
        return "d";
    }
}

输出:
false
true
———–我是可爱的分割线———
false
true
false
false

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值