标签:字符串拼接 har 设置 中介 str 使用 指定 微软 ace
StringBuilder 于是乎, 不需要关注线程安全和无中间拼接对象的StringBuilder产生了。与StringBuffer没差,只是去掉了线程安全。
因此, 当我们有多字字符串拼接行为, 尽量避免使用String更为合适。同时,尽量预估字符串大小,设置好capacity,避免扩容带来的额外开销(因为扩容会重新开辟空间进行数组的移植)。
StringBuffer和StringBuilder都继承AbstractStringBuilder,底层均是利用可修改的char数组。
String常量池是Java为了避免同样的字符串常量存在多分拷贝产生大量String对象所引入的。
策略: (1)创建一个字符串时(String str = "aabbcc"), 首先检查常量池中是否有值相同的字符串对象, 如果有, 则不会再次创建,而是直接将引用传递; 如果没有, 则在常量池中创建响应的字符串, 然后将引用传递。(2)但是当使用new String("aabbcc")
进行字符串创建时, 则不会检查常量池是否存在此字符串常量, 也不会在常量池创建, 而是直接在堆中创建相应的对象。
(1)String str = "aa" + "bb" + "cc"
对于这种字符串的拼接, 编译阶段会直接合成"aabbcc", 然后去字符串常量池去对应。
(2)String str1 = str + "dd" + "ee" + "ff"
即使带了变量, 在拼接时也先创建StringBuilder,然后使用append方法向其中拼接。
上述两种方式, 在拼接操作并不很频繁的前提下, 使用string也是没有问题的
(3)对下述代码
String s1 = "aa" + "bb" + "cc";
String s2 = "dd" + "ee" + "ff";
String s3 = new String("gg");
String s4 = s1 + s2;
对上述部分, 则会多次new StringBuilder, 因此不如直接使用StringBuilder来的方便。
StringBuilder strb = new StringBuilder("aabbccdd");
strb.append("ee")
将指定字符追加到strb的末尾(结果:aabbccddee)strb.reverse()
将字符序列反转(结果:eeddccbbaa)strb.delete(1,5)
删除strb中位置1到位置5的子字符串。(包含1,但不包含5)(结果:)strb.insert(1,"zzz");
将zzz插入到strb的第二个位置处。(结果: czzzbbaa)strb.replace(2, 5, "yyy");
使用yyy替换位置2到位置5的字符串(包含1,但不包含5)(结果: czyyybaa)008-Java的StringBuilder和StringBuffer
标签:字符串拼接 har 设置 中介 str 使用 指定 微软 ace
原文地址:https://www.cnblogs.com/Sinkinghost/p/11537376.html