偶尔发现,Jdk1.4
和
jdk1.5
中的
StringBuffer有些不同,做了个简单调查
toString()
方法
<!---->
<o:p>
</o:p>
jdk1.4
中:
StringBuffer
的
toString()
是这样实现的:
<o:p>
</o:p>
public
String toString() {
<o:p>
</o:p>
return
new
String(
this
);
<o:p>
</o:p>
}
<o:p>
</o:p>
<o:p> </o:p>
继续跟踪到
String
的构造函数:
<o:p>
</o:p>
public
String (StringBuffer buffer) {
<o:p>
</o:p>
synchronized
(buffer) {
<o:p>
</o:p>
buffer.setShared();
<o:p>
</o:p>
this
.
value
= buffer.getValue();
<o:p>
</o:p>
this
.
offset
= 0;
<o:p>
</o:p>
this
.
count
= buffer.length();
<o:p>
</o:p>
}
<o:p>
</o:p>
}
<o:p>
</o:p>
没有重新
new
内存空间,是共享的,这个时候首先想到的问题,如果
StringBuffer
变了,
String
怎么办
<o:p>
</o:p>
<o:p>
</o:p>
继续看
StringBuffer
的操做,例如
deleteCharAt<o:p></o:p> ()
public
synchronized
StringBuffer deleteCharAt(
int
index) {
<o:p>
</o:p>
if
((index < 0) || (index >=
count
))
<o:p>
</o:p>
throw
new
StringIndexOutOfBoundsException();
<o:p>
</o:p>
if
(
shared
)
<o:p>
</o:p>
copy();
<o:p>
</o:p>
System.arraycopy(
value
, index+1,
value
, index,
count
-index-1);
<o:p>
</o:p>
count
--;
<o:p>
</o:p>
return
this
;
<o:p>
</o:p>
}
<o:p>
</o:p>
<o:p> </o:p>
当
StringBuffer
改变的时候
,
判断了是否
shared,
然後决定是否
copy<o:p></o:p>
而且为了避免同步问题,把方法做成同步的
<o:p>
</o:p>
<o:p> </o:p>
<o:p> </o:p>
<o:p> </o:p>
<o:p> </o:p>
jdk1.5<o:p></o:p>
public
synchronized
String toString() {
<o:p>
</o:p>
return
new
String(
value
, 0,
count
);
<o:p>
</o:p>
}<o:p></o:p>
跟踪进入
String<o:p></o:p>
public
String(
char
value[],
int
offset,
int
count) {
<o:p>
</o:p>
if
(offset < 0) {
<o:p>
</o:p>
throw
new
StringIndexOutOfBoundsException(offset);
<o:p>
</o:p>
}
<o:p>
</o:p>
if
(count < 0) {
<o:p>
</o:p>
throw
new
StringIndexOutOfBoundsException(count);
<o:p>
</o:p>
}
<o:p>
</o:p>
// Note: offset or count might be near -1>>>1.
<o:p>
</o:p>
if
(offset > value.
length
- count) {
<o:p>
</o:p>
throw
new
StringIndexOutOfBoundsException(offset + count);
<o:p>
</o:p>
}
<o:p>
</o:p>
char
[] v =
new
char
[count];
<o:p>
</o:p>
System.arraycopy(value, offset, v, 0, count);
<o:p>
</o:p>
this
.
offset
= 0;
<o:p>
</o:p>
this
.
count
= count;
<o:p>
</o:p>
this
.
value
= v;
<o:p>
</o:p>
}<o:p></o:p>
重新分配了内存空间
<o:p>
</o:p>
<o:p> </o:p>
再来看看
StringBuffer
的
deleteCharAt<o:p></o:p>
public
synchronized
StringBuffer deleteCharAt(
int
index) {
<o:p>
</o:p>
super
.deleteCharAt(index);
<o:p>
</o:p>
return
this
;
<o:p>
</o:p>
}
<o:p>
</o:p>
<o:p> </o:p>
<o:p> </o:p>
<o:p> </o:p>
<o:p> </o:p>
<o:p> </o:p>
<o:p> </o:p>
<o:p> </o:p>
有了继承关系,先不管,继续
<o:p>
</o:p>
public
AbstractStringBuilder deleteCharAt(
int
index) {
<o:p>
</o:p>
if
((index < 0) || (index >=
count
))
<o:p>
</o:p>
throw
new
StringIndexOutOfBoundsException(index);
<o:p>
</o:p>
System.arraycopy(
value
, index+1,
value
, index,
count
-index-1);
<o:p>
</o:p>
count
--;
<o:p>
</o:p>
return
this
;
<o:p>
</o:p>
}
<o:p>
</o:p>
不需要判断,也不需要
copy
了
<o:p>
</o:p>
<o:p> </o:p>
既然看到了继承关系,那我们先看一下这个继承关系,再得出结论
<o:p>
</o:p>
发现
<o:p>
</o:p>
abstract
class
AbstractStringBuilder
implements
Appendable, CharSequence
<o:p>
</o:p>
然後
<o:p>
</o:p>
public
final
class
StringBuffer
<o:p>
</o:p>
extends
AbstractStringBuilder
<o:p>
</o:p>
implements
java.io.Serializable, CharSequence
<o:p>
</o:p>
<o:p> </o:p>
public
final
class
StringBuilder
<o:p>
</o:p>
extends
AbstractStringBuilder
<o:p>
</o:p>
implements
java.io.Serializable, CharSequence<o:p></o:p>
<o:p> </o:p>
分享到:
相关推荐
正则表达式是JDK 1.4的新功能,但是对sed和awk这样的Unix的标准实用工具,以及Python,Perl之类的语言来讲,它早就已经成为其不可或缺的组成部分了(有人甚至认为,它还是Perl能大获成功的最主要的原因)。单从技术...
jdk1.5新特性 jdk1.7新特性 jdk1.8新特性 java语言有哪些优点? 同一个.java文件中是否可以有多个main方法 一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制? 如何在main方法执行前输出”hello ...
主要给大家介绍了关于JDK源码分析之String、StringBuilder和StringBuffer的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用jdk具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
jdk1.8-source-analysis JDK1.8源码分析引入原始过程中的注意事项JDK1.8对应JDK版本下载: 码:49wi原始码在src目录下以下两个类手动添加的,解决编译过程中该包的丢失sun.font.FontConfigManager sun.awt....
方便人们把sql转化为StringBuffer拼接语句,也可以转为String拼接语句,jdk要在1.6以上,并且配置了JAVAHOME才能运行
jdk1.8-source-analysis JDK1.8源码分析引入原始过程中的注意事项JDK1.8对应JDK版本下载: 码:49wi原始码在src目录下以下两个类手动添加的,解决编译过程中该包的丢失sun.font.FontConfigManager sun.awt....
java.lang.ref和jdk.internal.ref下的各种引用:软引用/弱引用/虚引用 Unsafe的实现(JDK9之后有两个同名类,一个引用了另一个,建议放在一起阅读) java.util.stream下的流式编程的实现(很难) Thread和...
第1章 Java基础 1.1 转换基本数据类型 1.2 Java的运算符 1.3 控制程序的流程 1.4 计算阶乘 1.5 实现命令行程序 第2章 Java面向对象程序设计 2. 1 复数类 2. 2 equals.chashCode...
//注意JS中用到的encryptionExponent和modulus通过pk.getPublicKey().toString()字符串中得到. } /** * * 生成密钥对 * @return KeyPair * @throws EncryptException */ public static KeyPair ...
1.请手动添加jdk下面的lib到path中 2.lib文件夹下面的junit测试jar包添加到path中,以便编写测试用例 学习计划 很多java开发的小伙伴都会阅读jdk源码,然而确不知道应该从哪读起。以下为小编整理的通常所需阅读的...
java biginteger 源码 阅读JDK源码项目 2020.07.14创建该项目,目的...java.lang.ref和jdk.internal.ref下的各种引用:软引用/弱引用/虚引用 Unsafe的实现(JDK9之后有两个同名类,一个引用了另一个,建议放在一起阅读
请手动添加jdk下面的lib到path中 2.lib文件夹下面的junit测试jar包添加到路径中,刹车编写测试用例 学习计划 以下为小编整理的通常所需阅读的二进制范围。标题为包名,后面序号为优先级1-4,优先级递减 1,java.lang...
1.请手动添加jdk下面的lib到path中 2.lib文件夹下面的junit测试jar包添加到path中,以便编写测试用例 学习计划 很多java开发的小伙伴都会阅读jdk源码,然而确不知道应该从哪读起。以下为小编整理的通常所需阅读的...
jdk源码学习 JavaSourceLearn 版本号 版本 corretto-1.8.0_275 方式 逐步阅读源码添加注释、notes文件夹添加笔记 计划学习任务计划 标题为包名,后面序号为优先级1-4,优先级递减 java.lang Object 1 String 1 ...
2.18 String和StringBuffer的效率对比 38 2.19 StringBuilder类 39 2.20 总结 39 2.21 强调一下编程风格 40 3 Java类与对象 42 3.1 Java类的定义及其实例化 42 3.2 构造方法 42 3.3 创建对象 43 3.4 访问成员变量和...
字符串拼接问题应该是每个Java程序员都熟知的事情了,几乎每个Java程序员都读过关于StringBuffer/StringBuilder来拼接字符串...下面这篇文章主要给大家介绍了关于JDK8中的字符串拼接的相关资料,需要的朋友可以参考下。
6.3 String类和StringBuffer类 6.4 基本数据类型的对象包装类 6.5 集合类 6.6 Hashtable与Properties类 6.7 System类与Runtime类 6.8 Date与Calendar,DateFormat类 6.9 Math与Random类 6.10 学习API的方法 第7章 IO...
6.什么是 Java 程序的主类 应用程序和小程序的主类有何不同 7.Java 应用程序与小程序之间有那些差别 8.字符型常量和字符串常量的区别 9. 构造器 Constructor 是否可被 override 10.重载和重写的区别 11.Java 面向...
java为数据结构中的映射定义一个接口java.util.Map,有四个实现类HashMap Hashtable LinkedHashMap TreeMap用法和区别;对Map排序; 5字符串 使用String;判断一个字符串是否是合法的java标识符;使用StringBuffer;...
我们先用一张表格来回顾一下Java中String,StringBuilder,StringBuffer关于值可变性、线程安全性、时间性能排序、常用场景等主要区别。见下表: 数据类型 值可变性 线程安全性 时间性能排名 常用场景 String...