java字符串缓冲器问题

1.java 字符串缓冲器问题

        String s="java";
        String ss=s.replace("j","j");

        System.out.println(s);
        System.out.println(ss);
        System.out.println(ss==s);

运行结果:

java
java
false
请问,变量s和ss的字符串内容相同,可是相同的字符串编译器不会开辟空间,直接引用吗?

2.字符串变量如何输出地址

4个回答

s会被解析为常量串,而ss是一个字符串对象。你可以看看String 的replace方法,是返回的一个String对象的。
如果你直接写ss="java",那么ss==s 就是true.

String ss=s.replace("j","j");
这个要运算才能知道值的,编译器没法优化,所以不能让它指向常量“java”

反过来说,如果只要字面值向等,==永远都返回true,就没有字符串比较需要用equals一说了。

这个是因为s.replace("j","j");创建对象时又创建了一个静态区(又称常量区,方法区),此时静态区又两个存储区域,
==是判断静态区域是否相同的,只有基本数据类型的静态区相同,String不是基本数据类型所以不能用==,equals是判断静态区的值是否相同
如果你有时间可以了解侠jvm的**栈,堆,静态区**。

第一个是元数据区的引用,第二个是堆中的引用(replace方法:return new String(buf, true);),自然不相等
但是你把双引号换成单引号:String aa = a.replace('j','j');
就会是true了,因为String 中的replace方法两个char相同会return this

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐