0 0

StringBuffer 打印问题5

public class Test {
	
	public static void main(String[] args){
		
		
	StringBuffer a = new StringBuffer("adc");
	StringBuffer b = new StringBuffer("efg");
	
	Test test = new Test();
	test.change(a, b);
	System.out.println(a);
	System.out.println(b);
	
	
	}
	
	
	public void change(StringBuffer a ,StringBuffer b){
		
		
		a.append(b);
		b = a;
		
	}

}



	System.out.println(a);
	System.out.println(b);


上面的输出结果为什么是:abcefg和efg 而不是 abcefg 和 abcefg?

问题补充: 
chen_yongkai 写道
又是局部变量作用域的问题

    public static void main(String[] args){   
           
           
    StringBuffer a = new StringBuffer("adc");   
    StringBuffer b = new StringBuffer("efg");   
       
    Test test = new Test();   
    test.change(a, b);   
    System.out.println(a);   
    System.out.println(b);   
       
       
    }   
       
       
    public void change(StringBuffer t1 ,StringBuffer t2){   
                    
        t1.append(t2);   
       t2 = t1;   //与外面的 StringBuffer b 不是同一个对象引用
           
    }  



问题补充:
引用

//与外面的 StringBuffer b 不是同一个对象引用

可是已经将最新的应用给它了。
2012年1月08日 18:42

8个答案 按时间排序 按投票排序

0 0

采纳的答案

图片没有发好:

2012年1月09日 18:48
0 0

1.当 执行a.append(b); 改变了实参对应实例的值。没有改变实参的引用。
2.当执行 b = a; 时,实际上将形参b指向了实参a所对应的实例。并没有改变实参
a的引用。所以打印出来的是"efg"而不是"abcefg".
3.将代码做如下改动:

 public void change(StringBuffer a ){                        
        a.append(b);      
        b = a; 
        System.out.println("我是形参b现在对应实例的值:"+b);     
    }  

会输出:我是形参b现在对应实例的值:abcefg.

2012年1月09日 19:00
0 0

楼上大家说了很多,这其实是一个java中的实参和形参的问题。
为了便于理解我图解一下:
[img]
http://dl.iteye.com/upload/attachment/0061/8739/963f057a-ebfe-35a1-84db-673b03c746cb.jpg
[/img]

2012年1月09日 18:47
0 0

public class Test {
	
	public static void main(String[] args){
		
		
	StringBuffer a = new StringBuffer("adc");
 System.out.println(b.hashCode());  //1
	StringBuffer b = new StringBuffer("efg");
	
	Test test = new Test();
	test.change(a, b);
 System.out.println(b.hashCode());  //2
	System.out.println(a);
	System.out.println(b);
	
	
	}
	
	/**
            
             当调用方法change(a,b)时
              因为append方法是再字符串原有对象地址存储上,进行连续操作
                实际上操作的时a变量。
              sb=sa;这个sb与b的内存地址根本不是同一个
                  这个时候的sb指向不同的地址、 
                
           
        **/
	public void change(StringBuffer sa ,StringBuffer sb){
		sa.append(sb);
		sb = sa;
                   
		  System.out.println("我其实不是类的成员变量b我是我自己的b"+sb );  //这个时候打印的应该是a被修改后的值
 System.out.println(b.hashCode());  //3
	}

}
你可以发现1,2,3处的hashcode
1,2处相同的 表示同一个b
第3处的hashcode与1,2不同 因为他们根本 不是同一个b

2012年1月08日 22:38
0 0

public void change(StringBuffer a ,StringBuffer b){  
          
          
        a.append(b);  //这个是向 字符串a缓冲区“追加”元素b这样改变了a的缓存区的值,即改变了a
        b = a;  a,//这个只是值传递,和赋值操作,并不会改变变量a,b
          
    }  

2012年1月08日 22:17
0 0

public void change(StringBuffer a ,StringBuffer b){    
        a.append(b);  
        b = a;      
}


这段代码中,StringBuffer的append方法会把直接修改先前的StringBuffer变量,也就是说以前的StringBuffer变量 a - {"abd"} 已经不存在了,你永远也找不到了,不管是在堆内存还是栈内存,那么就解释了a.append(b)直接改变了a的堆内存的数据,以后你再想使用a变量,得到的只能是修改后的值。

StringBuffer变量b,采用了=,=意味着地址引用的改变,b=a只是改变了当前局部函数内部,b的地址引用,而 *b - {"efg"}在堆内存中都含有数据,还没有被销毁或改变。当前局部函数做的只是传值调用,等函数结束后,一切都是没有改变的,如果想要改变b的值,那么可以使用return语句,把b的值传回来,然后在主函数(main也是一个函数,也有变量作用域的)中,这样,再把函数的返回值赋给b,就可以了。

2012年1月08日 21:31
0 0

这样就能得到你想要的结果,对比一下

//全局
static StringBuffer b = new StringBuffer("efg");  
public static void main(String[] args){      
          
          
StringBuffer a = new StringBuffer("adc");      
    
      
Test test = new Test();      
test.change(a);      
System.out.println(a);      
System.out.println(b);      
      
      
}      
      
       
    public void change(StringBuffer a ){              
           
        a.append(b);   
        b = a;   
           
    }   
   

2012年1月08日 20:11
0 0

又是局部变量作用域的问题

    public static void main(String[] args){   
           
           
    StringBuffer a = new StringBuffer("adc");   
    StringBuffer b = new StringBuffer("efg");   
       
    Test test = new Test();   
    test.change(a, b);   
    System.out.println(a);   
    System.out.println(b);   
       
       
    }   
       
       
    public void change(StringBuffer t1 ,StringBuffer t2){   
                    
        t1.append(t2);   
       t2 = t1;   //与外面的 StringBuffer b 不是同一个对象引用
           
    }  

2012年1月08日 19:59

相关推荐

    面试的经典程序(String,StringBuffer,list,Connections)

    Java还提供了`Arrays`类,包含许多实用的静态方法,如`sort()`排序数组,`equals()`比较数组内容,以及`deepToString()`打印数组的详细信息。 集合容器,如`List`接口,是Java集合框架的重要组成部分。`List`接口...

    day13_StringBuffer_java_

    最后,我们通过`toString()`方法将`StringBuffer`转换为`String`并打印出来。 总的来说,理解和熟练使用`StringBuffer`是每个Java开发者必备的技能,尤其是在处理大量字符串操作或在多线程环境下。通过掌握`...

    java打印 java定位打印

    4. `StringBuilder`与`StringBuffer`: 这两个类用于构建字符串,可以通过循环和插入空格来实现定位打印。 5. ASCII控制字符:某些ASCII控制字符可以用来移动光标位置,但在现代编程中使用较少。 三、Java GUI打印 ...

    Scanner读取文件和StringBuffer读取文件

    这段代码创建了一个`Scanner`实例来读取指定文件,并逐行打印文件内容。`hasNextLine()`方法用于检查是否还有下一行,`nextLine()`方法则用于获取下一行内容。 而`StringBuffer`是Java.lang包中的类,主要用于字符...

    使用代理打印出详细的入参出参

    StringBuffer buffer = new StringBuffer(); buffer.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>"); buffer.append("); buffer.append(this.obj.getClass().getName()); buffer.append("\" method=\"...

    基于Java的实例源码-邮政汇款打印程序.zip

    6. **字符串处理**:在打印汇款信息时,会涉及到大量的字符串操作,如格式化输出、拼接等,`StringBuffer`或`StringBuilder`类在多线程环境下能提供高效的字符串处理。 7. **控制结构**:循环和条件语句是程序逻辑...

    java 插入新的字符

    这段代码首先创建了一个`StringBuffer`对象,然后通过`append()`和`insert()`方法添加和插入字符,最后打印出结果,即"Java is Programming"。 总的来说,理解并熟练使用`StringBuffer`和`StringBuilder`是Java编程...

    Java中String类的详细文档打印版

    字符串的不可变性确保了它们的线程安全性,因为多个线程可以同时访问同一个字符串而不会导致数据不一致的问题。 #### 字符串的创建 创建`String`对象有两种主要方式: 1. **直接字面量定义**:如`String str = ...

    某公司的java水平测试题

    根据提供的信息,我们可以详细分析每个问题中的知识点。 ### 第一题 #### 题目描述: ```java public class TestAmigo { public static void main(String[] args) { StringBuffer a = new StringBuffer("A"); ...

    《使用Java理解程序逻辑》内部测试-笔试试卷.doc

    因此,当`main`方法打印`sb`时,输出将是`"sb = stringbuffer1stringbuffer2"`。答案是C. sb = stringbuffer2。 4) 包在Java中用于组织和管理类,它提供了一种命名空间,防止命名冲突,并允许访问控制。然而,包...

    SCJP试题2011

    而`bufferReplace`方法接收一个`StringBuffer`类型的参数`text`,虽然同样试图修改它,但由于`StringBuffer`是可变的,所以可以通过`append`方法向其添加字符。然而,这里的问题在于方法体内的赋值操作`text = text....

    java 插入新的字符串

    这个程序将打印出"Java 编程 学习 乐趣",通过`append()`方法将数组中的每个单词连接起来,而不会每次迭代都创建新的`String`对象。 总之,Java中的`StringBuffer`和`StringBuilder`类是处理动态字符串和插入新字符...

    dqpba云南大学软件学院java实验四.doc

    在本次云南大学软件学院的Java实验四中,学生需要掌握Java中关于字符串(String)和字符串缓冲区(StringBuffer)的基本操作,以及如何处理包含逗号分隔的字符串。以下是实验的详细内容和相关知识点: 一、实验目的...

    程序设计(反转、猴子).pdf

    首先创建一个`StringBuffer`对象,将其初始化为输入字符串,然后调用`reverse()`方法,最后通过`toString()`方法获取反转后的字符串并打印。 ```java StringBuffer sb = new StringBuffer(str); sb.reverse(); ...

    oracle全部整合java试题(学生).docx

    - 问题14中,`stringBuffer1.equals(stringBuffer2)`返回`true`,而两个引用不同的`String`对象`empA`和`empB`使用`==`比较则返回`false`。 15. switch语句: - 问题15的代码会打印出"one",因为`i`等于1,匹配到...

    java模拟题 模拟训练

    Java模拟题是提升Java编程技能的有效方式,尤其对于准备Sun公司的等级考核来说,这些题目能够帮助考生熟悉考试格式和常见问题。以下是对所给部分Java模拟题的详细解答: 1. 题目中,变量i被赋值为0xFFFFFFF1(16...

    scjp study material

    StringBuffer textBufferString = new StringBuffer("java"); stringReplace(textString); bufferReplace(textBufferString); System.out.print(textString); } } ``` **问题:** 运行结果是什么? **解析...

    java JAVA数组与字符串,编写图形界面的程序,接收用户输入的一个字符串和一个字符,将字符串中出现的所有该字符删除,打印新生成的字符串。

    java JAVA数组与字符串,编写图形界面的程序,接收用户输入的一个字符串和一个字符,将字符串中出现的所有该字符删除,打印新生成的字符串。 String 类或StringBuffer类 deleteCharAt方法

    Java 核心 API的包PPT学习教案.pptx

    例如,我们可以使用`System.out.println()`方法来打印文本到控制台。 `System`类还提供了几个常用的方法,如`currentTimeMillis()`,这个方法返回当前时间的毫秒值,可用于计算时间差。`exit(int status)`方法用于...

Global site tag (gtag.js) - Google Analytics