java String类深度解析--读《java特种兵》

用csdn会员下载了一本《java特种兵》上册,最近闲来无事准备认认真真读一遍,刚读了第一张关于string的一部分就深感此书绝对是本好书,不枯燥,不形式,有深度(在我这种菜鸟看来)。胖哥老谢,原谅我不在物力上支持你吧,我会在精神上大大支持你的:b

对于string类的一些细节问题胖哥主要举了三个例子引出:

一、

private static void test1() {
String a = "a" + "b" + 1;
String b = "ab1";
System.out.println(a == b);
}
输出结果是true。

要解决这个问题,首先要弄明白几个知识点:==,equals,a,b在内存中是什么样的,编译时的优化方案。

1,== 用于匹配内存单元上的内容,对于原始数据类型byte、boolean、short、char、int、long、float、double来说比较的是他们的值,而对于引用数据类型比较的是他们的逻辑地址,也就是说比较的他们是否是同一个对象

2,equals在所有类的老祖宗Object类中定义的也是比较两个对象是否相等,只是在String类中对其进行重写,来实现判断两个字符串的值是否相等。

3,a和b在内存中指向的是同一块内存

4,3的原因是因为JVM的编译时优化,比如当代码是String s="a"+"b"+1的时候会将其编译为:String s = "abc",因为他们都是常量,能提前做的事就提前做,节省效率。

同样的道理还可以证明StringBuilder和“+”那个效率高,如果都是针对常量,“+”已经在编译时计算好了,运行时直接获取!看场景啊看场景.

二、

private static String getA() {return"a";}
public static void test2() {
String a = "a";
final String c = "a";
String b = a + "b";
String d = c + "b";
String e = getA() + "b";
String compare = "ab";
System.out.println(b == compare);
System.out.println(d == compare);
System.out.println(e == compare);
}
输出结果是:

false

true

false

1,第一个输出false,a是变量,在执行b==compare之前编译器不敢保证是固定不变的

2,因为c是final类型值不发生变化,编译时就会认为是常量做比较

3,返回false是因为对于返回结果的值是copy返回的,而copy不是final

三、

public static void test3() {
String a = "a";
String b = a + "b";
String c = "ab";
String d = new String(b);
println(b == c);
println(c == d);
println(c == d.intern());
println(b.intern() == d.intern());
}
答案 :false false true true

d.intern()把d的值放入常量池,而常量池中的东西是不重复的。

四,StringBuilder和“+”的终极PK

在执行for操作时,

整个过程中会创造出无穷对个StringBuilder,并且在append和toString的时候还会生成新的String,这些临时对象会耗费大量的内存空间,呆滞频繁GC,当一个字符串达到了一定长度就会进入Old区域,当达到Old区域的1/4时会发生 Out Of Memory.

太深的不做解释,看看书理解理解就好。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值