`
ahuter9
  • 浏览: 2531 次
  • 性别: Icon_minigender_1
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

java-StringBuffer涉及引用传值操作探讨

 
阅读更多

提出问题:

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);
    }


分享到:
评论

相关推荐

    【IT十八掌徐培成】Java基础第10天-01.字节集-编解码操作-中繁体-StringBuffer.zip

    字节集-编解码操作-中繁体-StringBuffer"的课程中,我们将探讨以下几个关键知识点: 1. 字节集(Byte Array):在Java中,字节集是数据传输和存储的基础。`byte[]`数组用于表示二进制数据,它可以容纳任何类型的...

    String-StringBuffer-StringBuilder

    在Java编程语言中,`String`、`StringBuffer`和`StringBuilder`都是用来处理字符串的类,但它们之间存在显著的差异,主要体现在性能、线程安全性和使用场景上。 首先,`String`是最基本的字符串类,它代表的是不可...

    Java程序基础-StringBuffer.pptx

    java

    JAVA中传值与引用问题

    本文将深入探讨Java中的传值与传引用问题,并通过具体的例子来解析其中的原理。 #### 二、基础知识回顾 在Java中,所有的数据类型可以分为两大类:基本类型(如int, double等)和引用类型(如Object, String等)。...

    Java是传值还是传址引用

    ### Java是传值还是传址引用 #### 一、简单类型是按值传递的 Java在处理简单数据类型(如int、boolean等)时采用的是按值传递的方式。这意味着当你将一个简单类型的值作为参数传递给一个方法时,实际上传递的是这...

    java基础--4.常用类-3.StringBuffer、StringBuilder

    在Java编程语言中,`StringBuffer`和`StringBuilder`是两个非常重要的类,它们主要用于处理字符串的拼接和修改操作。这两个类位于`java.lang`包下,因此在使用时无需显式导入。本篇文章将深入探讨这两个类的特性和...

    计算机后端-Java-Java核心基础-第21章 常用类 20. StringBuffer的源码分析.avi

    计算机后端-Java-Java核心基础-第21章 常用类 20. StringBuffer的源码分析.avi

    Java语言中StringBuffer的用法

    在Java编程语言中,`StringBuffer`类是一个非常重要的工具,尤其在处理字符串连接操作时。相较于`String`类,`StringBuffer`提供了线程安全的动态字符串构建,避免了频繁创建新对象带来的性能开销。本文将深入探讨`...

    计算机后端-Java-Java核心基础-第21章 常用类 21. StringBuffer中的常用方法.avi

    计算机后端-Java-Java核心基础-第21章 常用类 21. StringBuffer中的常用方法.avi

    java-java-lang包.pdf

    Java编程语言中的java.lang包是一个核心包,它提供了Java语言运行时的基础类库,包含了Java程序运行的基本数据类型、异常处理类以及一些用于系统级别的工具类和接口。java.lang包中的类和接口不需要程序员显示地导入...

    java及C++中传值传递、引用传递和指针方式的理解.docx

    ### Java及C++中传值传递、引用传递和指针方式的理解 在程序设计语言中,函数调用时参数的传递方式对理解程序的行为至关重要。本文将深入探讨Java与C++这两种广泛使用的编程语言中参数传递的方式,包括值传递、引用...

    JAVA-持续更新.pdf

    - Java是一种跨平台的语言,可以在任何操作系统上运行 - Java的优点:简单、面向对象、平台独立性、健壮性、安全性、可移植性、多线程机制、动态性、网络功能 - Java的核心技术:面向对象程序设计,继承、封装、...

    《剑指offer》Java-String、StringBuffer 和 StringBuilder 的区别.pdf

    当我们尝试对String对象进行操作,如使用`+`进行拼接时,Java编译器实际上会自动转换为使用StringBuilder或StringBuffer的append方法。例如,以下代码: ```java String s1 = "aaa"; String s2 = "bbb" + "ccc"; ...

    Java中StringBuffer对象的初始化.pdf

    在Java编程语言中,`StringBuffer`类是一个非常重要的工具,尤其在处理字符串连接操作时。与`String`类不同,`StringBuffer`是可变的(mutable),这意味着它的内容可以在创建后进行修改,而无需创建新的对象。这种...

    SQL2JAVA-java字段串代码拼接小工具

    标题中的“SQL2JAVA-java字段串代码拼接小工具”是指一个辅助开发的软件,它主要功能是帮助程序员便捷地在Java代码和SQL语句之间进行转换,特别是处理字符串拼接的问题。在软件开发过程中,尤其是在数据库交互时,...

    JAVA_StringBuffer

    总之,`JAVA_StringBuffer`这个主题涉及到Java编程中字符串操作的关键概念,尤其是在需要动态构建和修改字符串时,`StringBuffer`是一个不可或缺的工具。了解和熟练使用它的各种方法,对于提高代码效率和保证线程...

    Java中StringBuffer类

    Java中StringBuffer类

    Java软件开发实战 Java基础与案例开发详解 9-2 StringBuffer和String Builder类共9页.pdf

    ### Java软件开发实战:StringBuffer和StringBuilder类 #### 1. 概述 在Java编程中,处理字符串是一项常见的需求。对于需要频繁修改的字符串,使用`String`类可能会导致性能问题,因为每次修改都会创建一个新的`...

    JAVA的StringBuffer类.docx

    【JAVA的StringBuffer类】 Java中的`StringBuffer`类是一个非常重要的工具,特别是在处理字符串时需要频繁进行修改的情况。与`String`类不同,`StringBuffer`不会在每次修改时创建新的对象,从而减少了内存开销,...

Global site tag (gtag.js) - Google Analytics