String源码简要分析以及常见考点干货

String源码简要分析以及常见考点干货

源码截图
***1.final修饰类,那么该类就不可被继承
2.String底层是通过char数组实现的,并且成员变量value被final修饰(String不可变的原因)
3.通过对默认的无参构造函数知道,默认的是空串*
下面我们看看常见的String的考点
A String对象的存储
请看这样两个语句:
String x = “abc”;
String y = new String(“abcd”);
我们来分析下载jvm中的内存模型
这里写图片描述
从图中我们可以看出第一句话运行后,栈里有一个x引用指向了字符串常量池中的abc字符串常量。
对于第二条语句,同样会在常量池中有一个“abcd”的字符串,当new时,会拷贝一份该字符串存放到堆中,于是y指向了堆中的那个“abcd”字符串。
重要提醒:当两个字符串字面值连接时(相加),得到的新字符串依然是字符串字面值,保存在常量池中。
好了,如果你理解上面的小段文字,对于String的内存判断应该没问题,再次送大家几个常见的面试题
String s1 = “abc”;
String s2 = “ab”;
String s3 = “c”;
String s4 = s2 + s3;
String s5 = “ab” + “c”;
System.out.println(s1 == s5);
System.out.println(s1 == (s2 + s3));
System.out.println(s1 == (s2 + s3).intern());
String s6 = new String(“abc”);
System.out.println(s1 == s6);
System.out.println(s1 == s6.intern());
final String bb = “b”;
String b = “a” + bb;
System.out.println(s2 == b);
关于string的intern的方法请查看api
如果上面的你都能理解,说明true或者false的原因,那么对应String的面试题你应该差不多了。
B String,StringBuffer与StringBuilder的区别
String 不可改变类,任何对String对象的改变只会生成新的String对象。
StringBuffer可变类,任何对它所指代的字符串的改变都不会产生新的对象。
StringBuilder可变类,JDK5.0 引入,任何对它所指代的字符串的改变都不会产生新的对象
所以String和StringBuffer的区别大家都很清楚,StringBuffer和StringBuilder之间的区别呢?
新引入的StringBuilder类不是线程安全的,而StringBUffer是线程安全的,很多方法都是synchronized 方法。这就是这两者之前的区别,除此之外,几乎没有区别。由此可见,如果我们的程序是在单线程下运行,或者是不必考虑到线程同步问题,我们应该优先使用StringBuilder类;当然,如果要保证线程安全,自然非StringBuffer莫属了。
最后再提供大家一个string的工具类 apache下面的StringUtils。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值