提出问题:
Demo1
public class StringBufferTest {
public static void main(String[] args) {
StringBuffer strbf1=new StringBuffer("csdn is good!");
StringBuffer strbf2=new StringBuffer("i am good!");
new StringOperate().operateStringBuffer(strbf1,strbf2); //调用方法对两个StringBuffer对象进行操作
System.out.println(strbf1);
System.out.println(strbf2);
}
}
class StringOperate{
public void operateStringBuffer(StringBuffer strbf1,StringBuffer strbf2){//这里传递对象的引用
strbf1.append("yes"); //在原对象的内存块上追加yes字符串
strbf2.append("yes");
System.out.println(strbf1);
System.out.println(strbf2);
}
}
很明显,Demo1是对对象的引用操作
//out
csdn is good!yes
i am good!yes
csdn is good!yes
i am good!yes
Demo2
public class StringBufferTest {
public static void main(String[] args) {
StringBuffer strbf1=new StringBuffer("csdn is good!");
StringBuffer strbf2=new StringBuffer("i am good!");
new StringOperate().operateStringBuffer(strbf1,strbf2);
System.out.println(strbf1);
System.out.println(strbf2);
}
}
class StringOperate{
public void operateStringBuffer(StringBuffer strbf1,StringBuffer strbf2){
strbf1 = strbf2; //将strbf1的引用指向strbf2的内存块
System.out.println(strbf1);
System.out.println(strbf2);
strbf1.append("yes");
strbf2.append("yes");
System.out.println(strbf1);
System.out.println(strbf2);
}
}
Demo2相对Demo1添加了引用的修改,那么两次append的操作都会对主函数中的strbf2有影响,即添加了yesyes,对主函数的strbf1没影响。
//out
i am good!
i am good!
i am good!yesyes
i am good!yesyes
csdn is good!
i am good!yesyes
Demo3
public class StringBufferTest {
public static void main(String[] args) {
StringBuffer strbf1=new StringBuffer("csdn is good!");
StringBuffer strbf2=new StringBuffer("i am good!");
new StringOperate().operateStringBuffer(strbf1,strbf2);
System.out.println(strbf1);
System.out.println(strbf2);
}
}
class StringOperate{
public void operateStringBuffer(StringBuffer strbf1,StringBuffer strbf2){
strbf2 = new StringBuffer("you are good!");//将strbf2重新指向一个新开辟的空间
System.out.println(strbf1);
System.out.println(strbf2);
strbf1.append("yes");
strbf2.append("yes");
System.out.println(strbf1);
System.out.println(strbf2);
}
}
//out
csdn is good!
you are good!
csdn is good!yes
you are good!yes
csdn is good!yes
i am good!
Demo3相对Demo1添加了将strbf2重新指向新开辟的空间,那么在主函数中strbf1会受append的影响,追加了yes,而strbf2不会受影响。
Demo4
public class StringBufferTest {
public static void main(String[] args) {
StringBuffer strbf1=new StringBuffer("csdn is good!");
StringBuffer strbf2=new StringBuffer("i am good!");
new StringOperate().operateStringBuffer(strbf1,strbf2);
System.out.println(strbf1);
System.out.println(strbf2);
}
}
class StringOperate{
public void operateStringBuffer(StringBuffer strbf1,StringBuffer strbf2){
strbf1 = strbf2;
System.out.println(strbf1);
System.out.println(strbf2);
strbf2 = new StringBuffer("you are good!");
System.out.println(strbf1);
System.out.println(strbf2);
strbf1.append("yes");
strbf2.append("yes");
System.out.println(strbf1);
System.out.println(strbf2);
}
}
综上所述,就可以得到Demo4的结果了。
//out
i am good!
i am good!
i am good!
you are good!
i am good!yes
you are good!yes
csdn is good!
i am good!yes
附加JDK1.6 API
public synchronized StringBuffer append(String str) {//in class StringBuffer
super.append(str);//append
return this;
}
public AbstractStringBuilder append(String str) { //in class AbstractStringBuilder
if (str == null) str = "null";
int len = str.length();
if (len == 0) return this;
int newCount = count + len;
if (newCount > value.length)
expandCapacity(newCount); //expandCapacity
str.getChars(0, len, value, count);//getChars
count = newCount;
return this;
}
void expandCapacity(int minimumCapacity) { in class AbstractStringBuilder
int newCapacity = (value.length + 1) * 2;
if (newCapacity < 0) {
newCapacity = Integer.MAX_VALUE;
} else if (minimumCapacity > newCapacity) {
newCapacity = minimumCapacity;
}
value = Arrays.copyOf(value, newCapacity); //Arrays.copyof
}
public static char[] copyOf(char[] original, int newLength) { //Arrays.copyof in class Arrays
char[] copy = new char[newLength];
System.arraycopy(original, 0, copy, 0,
Math.min(original.length, newLength));
return copy;
}
public void getChars(int srcBegin, int srcEnd, char dst[], int dstBegin) { //in class String
if (srcBegin < 0) {
throw new StringIndexOutOfBoundsException(srcBegin);
}
if (srcEnd > count) {
throw new StringIndexOutOfBoundsException(srcEnd);
}
if (srcBegin > srcEnd) {
throw new StringIndexOutOfBoundsException(srcEnd - srcBegin);
}
System.arraycopy(value, offset + srcBegin, dst, dstBegin,
srcEnd - srcBegin);
}
分享到:
相关推荐
字节集-编解码操作-中繁体-StringBuffer"的课程中,我们将探讨以下几个关键知识点: 1. 字节集(Byte Array):在Java中,字节集是数据传输和存储的基础。`byte[]`数组用于表示二进制数据,它可以容纳任何类型的...
在Java编程语言中,`String`、`StringBuffer`和`StringBuilder`都是用来处理字符串的类,但它们之间存在显著的差异,主要体现在性能、线程安全性和使用场景上。 首先,`String`是最基本的字符串类,它代表的是不可...
java
本文将深入探讨Java中的传值与传引用问题,并通过具体的例子来解析其中的原理。 #### 二、基础知识回顾 在Java中,所有的数据类型可以分为两大类:基本类型(如int, double等)和引用类型(如Object, String等)。...
### Java是传值还是传址引用 #### 一、简单类型是按值传递的 Java在处理简单数据类型(如int、boolean等)时采用的是按值传递的方式。这意味着当你将一个简单类型的值作为参数传递给一个方法时,实际上传递的是这...
在Java编程语言中,`StringBuffer`和`StringBuilder`是两个非常重要的类,它们主要用于处理字符串的拼接和修改操作。这两个类位于`java.lang`包下,因此在使用时无需显式导入。本篇文章将深入探讨这两个类的特性和...
计算机后端-Java-Java核心基础-第21章 常用类 20. StringBuffer的源码分析.avi
在Java编程语言中,`StringBuffer`类是一个非常重要的工具,尤其在处理字符串连接操作时。相较于`String`类,`StringBuffer`提供了线程安全的动态字符串构建,避免了频繁创建新对象带来的性能开销。本文将深入探讨`...
计算机后端-Java-Java核心基础-第21章 常用类 21. StringBuffer中的常用方法.avi
Java编程语言中的java.lang包是一个核心包,它提供了Java语言运行时的基础类库,包含了Java程序运行的基本数据类型、异常处理类以及一些用于系统级别的工具类和接口。java.lang包中的类和接口不需要程序员显示地导入...
### Java及C++中传值传递、引用传递和指针方式的理解 在程序设计语言中,函数调用时参数的传递方式对理解程序的行为至关重要。本文将深入探讨Java与C++这两种广泛使用的编程语言中参数传递的方式,包括值传递、引用...
- Java是一种跨平台的语言,可以在任何操作系统上运行 - Java的优点:简单、面向对象、平台独立性、健壮性、安全性、可移植性、多线程机制、动态性、网络功能 - Java的核心技术:面向对象程序设计,继承、封装、...
当我们尝试对String对象进行操作,如使用`+`进行拼接时,Java编译器实际上会自动转换为使用StringBuilder或StringBuffer的append方法。例如,以下代码: ```java String s1 = "aaa"; String s2 = "bbb" + "ccc"; ...
在Java编程语言中,`StringBuffer`类是一个非常重要的工具,尤其在处理字符串连接操作时。与`String`类不同,`StringBuffer`是可变的(mutable),这意味着它的内容可以在创建后进行修改,而无需创建新的对象。这种...
标题中的“SQL2JAVA-java字段串代码拼接小工具”是指一个辅助开发的软件,它主要功能是帮助程序员便捷地在Java代码和SQL语句之间进行转换,特别是处理字符串拼接的问题。在软件开发过程中,尤其是在数据库交互时,...
总之,`JAVA_StringBuffer`这个主题涉及到Java编程中字符串操作的关键概念,尤其是在需要动态构建和修改字符串时,`StringBuffer`是一个不可或缺的工具。了解和熟练使用它的各种方法,对于提高代码效率和保证线程...
Java中StringBuffer类
### Java软件开发实战:StringBuffer和StringBuilder类 #### 1. 概述 在Java编程中,处理字符串是一项常见的需求。对于需要频繁修改的字符串,使用`String`类可能会导致性能问题,因为每次修改都会创建一个新的`...
【JAVA的StringBuffer类】 Java中的`StringBuffer`类是一个非常重要的工具,特别是在处理字符串时需要频繁进行修改的情况。与`String`类不同,`StringBuffer`不会在每次修改时创建新的对象,从而减少了内存开销,...