zoukankan      html  css  js  c++  java
  • String和StringBuilder作为参数的区别

    先见下面实例:

    public class TestDemo {
    
    	@Test
    	public void test(){
    		//String str = "hello";
    		String str = new String("hello");
    		appendStr(str);
    		System.out.println(str);
    		StringBuilder sb = new StringBuilder("hello");
    		appendSb(sb);
    		System.out.println(sb);
    	}
    	
    	private void appendStr(String s){
    		s = "world";
    	}
    	
    	private void appendSb(StringBuilder s){
    		s.append("world");
    	}
    }
    
    输入:

    hello
    helloworld
    

    问题:为什么用String和StringBuilder作为形参最后导致结果不一致呢?

    过程分析:

    当用String作为形参时

    1. 引用str指向new String("hello")对象。

    2. 调用appendStr时,形参s复制了实参str的值,此时形参,实参指向同一个对象,即均指向"hello"这个对象。

    3. 在appendStr方法内部,将对象“world”的引用被赋给形参s,但并未对实参str产生影响,即实参str依旧指向"hello"这个对象。

    4. appendStr方法结束后,形参s在栈内存中释放,对象"world"因不存在被引用,在后续gc中会被回收。

    5. 打印str执行的对象内容,依旧是"hello".


    当用StringBuilder作为形参时、

    1. 引用str指向new StringBuilder("hello")对象。

    2. 调用appendSb时,形参s复制了实参str的值,此时形参,实参指向同一个对象,即均指向"hello"这个对象。

    3. 在appendSb方法内部,调用了append的方法,该方法会找到形参所指向的对象,即"hello"这个对象,然后修改了该对象,往后面追加了字符串“world”,即修改了

    他所指向的对象内容。

    4. appendSb方法结束后,形参s在栈内存中释放,对象"helloworld"因还被实参str引用,不会被回收。

    5. 打印str执行的对象内容,内容已经改变为"helloworld".


    区别:在appendStr方法内部,给形参赋予了一个新的对象的引用,即形参与实参指向了不同的对象,二者之间没有了关系。

                而appendSb方法内部,是操作形参所指向的对象,改变该对象的内容,而形参和实参依旧是指向同一个对象,故实参所指向的对象也就变了。

    总结:在java中都是值传递,基本类型即是传递原始值,而引用类型则是传递引用所指向的对象的地址。



  • 相关阅读:
    nest exception is java.sql.SQLException:ORA-01476:除数为0
    java.lang.NullPointerException: No FileItemFactory has been set.
    With as 必须跟select
    作为一项技艺的管理——Leo鉴书81
    faultString = "java.lang.NullPointerException : null"
    org.apache.commons.fileupload.FileUploadBase$InvalidContentTypeException
    PERL
    Error:Error #2174
    ArgumentError:Error #2004:某个参数无效
    SecurityError:Error:#2148
  • 原文地址:https://www.cnblogs.com/marcotan/p/4256910.html
Copyright © 2011-2022 走看看