zoukankan      html  css  js  c++  java
  • String和StringBuffer相关

    在http://www.cnblogs.com/aishangJava/p/7262577.html这里看到了一个题目,就去尝试了一下,代码如下:

    /*
     * To change this template, choose Tools | Templates
     * and open the template in the editor.
     */
    package controller;
    
    /**
     *
     * @author Administrator
     */
    public class change {
    
        public static void main(String[] args) {
            String s1 = "hello";
            String s2 = "world";
            StringBuffer sb1 = new StringBuffer("hello");
            StringBuffer sb2 = new StringBuffer("world");
            change(s1, s2);
            System.out.println(s1 + "---" + s2);
            change(sb1,sb2);
            System.out.println(sb1+"---"+sb2);
        }
    
        public static void change(String s1, String s2) {
            s1 = s2;
            s2 = s1 + s2;
        }
    
        public static void change(StringBuffer sb1, StringBuffer sb2) {
            sb1 = sb2;
            System.out.println("first sb1:"+sb1);
            sb2.append(sb1);
            System.out.println("sb1:"+sb1+"	sb2:"+sb2);
        }
    }

     

    百度了一下,整理一下自己的理解:

    在第一个change中,改变的只是形参的值,实参并没有改变;

    第二个change中,由于StringBuffer定义时,sb1是存储在栈空间里的一个指向堆空间的一个地址,堆的值就是“hello”,当进行sb1=sb2的操作后,sb1中的地址就指向了sb2所指向的对象,所以在此时sb1的值为“world”,之后sb2进行append,随之s1的值变为“worldworld”。

    至于为什么最后sb1输出的还是"hello",百度看了一下是这么回事:

    要知道java中所有方法的实参都是传入变量的副本,所以对于基本类型参数,改变其副本值,原始参数不受影响,而对于引用类型参数,传入的是引用的副本,原始引用和副本引用指向同一个对象,操作副本引用指向的对象时,原始引用的对象也会随之改变(说白了,两个引用指向一个对象),但是 sb1=sb2,是说将这个sb1的副本引用设置为sb2的引用,使得副本引用sb1指向了sb2对象,但是原始引用sb1却没有参与任何操作,所以sb1不变。
  • 相关阅读:
    仿当当网鼠标经过图片翻转
    静态随鼠标移动的Tip
    Weblogic免项目名
    weblogic中文乱码问题
    IE6下的{clear:both}出现怪异的空白
    动态随鼠标移动的Tip
    base标签在ie6下的恶心问题
    javascript中for和for in 区别
    jQuery性能优化<<转>>
    Ant项目打包脚本
  • 原文地址:https://www.cnblogs.com/panlongfeng/p/7298330.html
Copyright © 2011-2022 走看看