偶尔发现,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>
分享到:
相关推荐
3. **日期和时间**:`java.util.Date`和`java.text.SimpleDateFormat`处理日期和时间格式化,Java 1.4中还引入了`java.util.Calendar`类,提供了更强大的日期时间操作。 4. **XML处理**:`javax.xml`包包含了处理...
6. **字符串处理**:String类是Java中的重要组成部分,理解它的不可变性,熟悉StringBuilder和StringBuffer的使用,以及字符串连接的效率问题。 7. **内存管理与垃圾回收**:Java自动进行内存管理,理解堆和栈的...
除此之外,JDK1.5还对字符串进行了优化,例如,String类增加了substring()的效率,以及加入了StringBuilder和StringBuffer的append()方法,这些改进提升了字符串操作的性能。 总的来说,JDK1.5免安装版为开发者提供...
泛型是JDK 1.5引入的一个核心特性,允许在类、接口和方法中使用类型参数,从而实现更安全、更强大的类型约束。在泛型出现之前,开发者通常使用Object作为通用类型,但这可能导致类型转换异常。泛型通过在类声明中...
【JDK1.5新特性】 1. 泛型(Generic) JDK1.5引入了泛型,这是对类型安全的重要改进。泛型允许在集合类中指定元素的类型,确保了在编译时就能进行类型检查,避免了运行时的强制类型转换和可能的ClassCastException...
9. **String的优化**:JDK1.8对字符串进行了优化,例如新增了`String.join()`方法,以及`StringBuilder`和`StringBuffer`的改进,提升了字符串操作的效率。 10. **Optional类**:为了解决Java中的null安全问题,JDK...
### JAVA设计模式在JDK中的应用 #### 一、引言 在软件开发过程中,设计模式作为一套被广泛接受的解决方案,能够帮助开发者解决常见的设计问题。Java作为一门流行的编程语言,其标准库(JDK)中巧妙地融入了多种设计...
在JDK的不同版本中,`String`类经历了一些优化和改进,尤其是在性能和内存管理方面。这里我们将对JDK 1.6、1.7和1.8中的`String`类进行对比研究,探讨其中的关键变化。 ### JDK 1.6中的String 在JDK 1.6中,`...
Java Development Kit (JDK) 是Java编程语言的核心组件,它为开发者提供了编译、调试和运行Java应用程序所需的所有工具。JDK 1.7(也称为Java 7)是Oracle公司发布的一个重要版本,它引入了许多新特性,优化了性能,...
4. **字符串内联**:JDK 1.7优化了字符串操作,对字符串拼接使用StringBuilder或StringBuffer进行优化,提升了性能。 5. **二进制字面量和下划线分隔符**:Java 7引入了二进制字面量(如0b1010)和数字间允许使用...
这些是Java JDK 7中一些关键的更新和改进,对于开发者来说,理解和掌握这些知识点对于提升编程效率和写出高质量的Java代码至关重要。通过这份PDF学习笔记,读者将能深入理解JDK 7的新特性,并能将其应用到实际项目中...
在JDK1.6版本中,Java语言和库经历了许多改进和增强。以下是一些关键知识点: 1. **泛型(Generics)**:JDK1.6全面支持泛型,这使得代码更安全,类型检查在编译时就能完成,避免了运行时的ClassCastException。...
Java Development Kit(JDK)是Java编程语言的核心组件,它包含了一套开发和运行Java应用程序所需的工具和库。"jdk-7u191-linux-x64" 是Oracle公司为Linux 64位操作系统发布的JDK 7的更新版本191。在Oracle官网不再...
- **String的多次追加优化**:`StringBuilder`和`StringBuffer`的`append()`方法在循环中更加高效。 - **重复注解**:一个注解可以在同一个元素上重复使用,增加了注解的灵活性。 ### 使用场景 这个免安装的JDK8...
### JDK中的设计模式 ...综上所述,JDK中广泛地应用了各种设计模式,这些模式不仅提高了代码的质量,还增强了系统的灵活性和可扩展性。理解这些模式的原理及其在JDK中的具体实现,对于深入学习Java编程至关重要。
这些只是JDK1.8中部分重要更新和改进,详细帮助文档会涵盖更多内容,包括类库的每个类和方法的使用说明,开发者可以根据具体需求查阅相应的章节,以获取更全面的知识。对于Java开发者来说,深入理解JDK1.8的特性不仅...
2. **字符串字面量连接优化**:在JDK 1.7中,字符串的连接操作被优化,通过使用StringBuilder或StringBuffer的自动扩容机制,提高了字符串拼接的效率。 3. **try-with-resources语句**:这是JDK 7中的一个新特性,...
在Windows系统中,配置JDK通常涉及两个关键步骤:设置环境变量和验证安装。首先,你需要将JDK的安装目录添加到系统的PATH环境变量中,这样系统就能在任何位置找到Java命令。对于免安装版,这意味着你需要手动指定...
【描述】中的"jdk-7u80-windows-x64.7z"和"jdk-7u25-linux-x64.tar.gz"分别对应了两个不同的JDK1.7更新版本,"u80"和"u25"代表的是更新版本号。对于Windows用户,提供了7z格式的压缩包,这是一个高效的压缩格式,...
在这个分析过程中,开发者通常会关注JDK提供的各种API如何被有效利用,以提升代码的效率、可读性和维护性。 描述中的“NULL”意味着没有具体的细节描述,但我们可以通过常见的JDK库分析实践来推测可能涉及的内容。...