1. 程式人生 > >Java值傳遞和地址傳遞:關於String型別和集合型別作為函式引數時傳值問題的測試

Java值傳遞和地址傳遞:關於String型別和集合型別作為函式引數時傳值問題的測試

這個問題,可能是太簡單了。稍微有點經驗的,估計都不會犯這個錯誤。不好意思,過了個年,幾天不寫程式碼,生疏了,也就有了下面的bug。

先看程式碼,你要是一眼就看出問題了,那就請允許在下水那麼一回。

基本資料型別是值傳遞的,那麼基本資料型別的封裝型別呢?是不是值傳遞呢,這個可是物件喲!

直接新建的字串是值傳遞的,那麼要是new 出來的string在引數傳遞的時候,是不是值傳遞的呢?

帶著疑惑,看下面的程式碼。

public class StringTest {
    public static void main(String[] args) {
        String transmitValue = "初始值";
        String transmitValueNew = new String("new 出來的字串");
        Integer integer = 100;
        List<String> list = Lists.newArrayList();
        list.add("0");
        testTransmitValue(transmitValue, transmitValueNew, list, integer);
        System.out.println(transmitValue);
        System.out.println(transmitValueNew);
        System.out.println(list.toString());
        System.out.println(integer);
        //testStringPool();
    }

    /**
     * 測試字串和集合在函式之間的傳值問題,解決值傳遞和地址傳遞的疑惑.
     */
    private static void testTransmitValue(String transmitValue, String transmitValueNew, List<String> list, Integer integer) {
        transmitValue += "修改的痕跡";
        transmitValueNew += "assss修改的痕跡";
        list.add("1");
        list.add("2");
        list.add("3");
        integer = 9999;
    }
}



執行結果:

看了程式碼和執行結果。發現

不管是直接寫的字串,還是new出來的字串,都是值傳遞。

封裝的基本資料型別,也是值傳遞。

使用集合,使用習慣了,今天看到個字串,也習慣性的就把他當引數給傳到函式去了,然後就悲劇啦,這個字串一直是原始值,一直沒有修改。

而且,自己也沒有意識到這個錯誤,也是很尷尬呀,怎麼能這麼水呢!

慚愧啦。

我就留個筆記,避免以後發生這麼low的bug。

這字串是值傳遞,集合是地址傳遞。具體就不寫那麼多了。

相關推薦

Java傳遞地址傳遞關於String型別集合型別作為函式引數問題的測試

這個問題,可能是太簡單了。稍微有點經驗的,估計都不會犯這個錯誤。不好意思,過了個年,幾天不寫程式碼,生疏了,也就有了下面的bug。先看程式碼,你要是一眼就看出問題了,那就請允許在下水那麼一回。 基本資

AndroidWebView與Javascript互動(相互呼叫引數

Android中可以使用WebView載入網頁,同時Android端的java程式碼可以與網頁上的javascript程式碼之間相互呼叫。 效果圖: (一)Android部分: 佈局程式碼: <LinearLayout xmlns:android="http://s

普通、指標、引用作為函式引數的理解

       很多時候,我們都會看到在教科書上寫著各種值傳遞,引用傳遞,一看一大堆,有時候看的還容易迷糊,什麼情況該怎麼傳總是區分不清,下邊我們用一小版塊並結合程式碼例項講解下。 一、值傳遞 // 普通值傳遞 void test(int num) {

C++中陣列作為函式引數或返回

C++中陣列作為函式引數或者返回值 概述 在程式設計任務中,經常會遇到將陣列作為函式引數或者返回值,比如在前一篇的計數排序任務中,需要額外的空間來儲存排序後的元素,並且將該陣列返回給主函式。本文會介紹幾種可行的方案,僅供參考。 陣

Java中的傳遞地址傳遞

0.前言 被java中的“值傳遞”和“引用傳遞”困擾過一陣子,在實際程式碼中也犯過不少錯,記錄一下,方便檢視。 1.問題 首先看看程式碼: public class Test { public static void main(Stri

Java中的傳遞地址傳遞引用)

首先,不要糾結於 Pass By Value 和 Pass By Reference 的字面上的意義,否則很容易陷入所謂的“一切傳引用其實本質上是傳值”這種並不能解決問題無意義論戰中。 更何況,要想知道Java到底是傳值還是傳引用,起碼你要先知道傳值和傳引用的準確含義吧?可是如果你已經知道了這兩個名字的準確

## 標題指標的傳遞地址傳遞,全域性變數傳遞,與形參傳遞的區別與結果

標題:指標的值傳遞與地址傳遞,全域性變數傳遞,與形參傳遞的區別與結果 1.值傳遞與地址傳遞 下面看著段程式碼:void swap(int a, int b){ int t; t=a; a=b; b=t; } void swap1(int *p1,int *p2){ int t; t=*p

java引數傳遞傳遞還是地址傳遞

java的引數傳遞是值傳遞還是地址傳遞結論: 1、基本型別作為引數傳遞時,是傳遞值的拷貝,無論你怎麼改變這個拷貝,原值是不會改變的 2、物件作為引數傳遞時,是把物件在記憶體中的地址拷貝了一份傳給了引數。 基本型別作為引數傳遞 public class Test1

指標的傳遞地址傳遞

值傳遞: 形參是實參的拷貝,改變形參的值並不會影響外部實參的值。從被呼叫函式的角度來說,值傳遞是單向的(實參->形參),引數的值只能傳入, 不能傳出。當函式內部需要修改引數,並且不希望這個改變影響呼叫者時,採用值傳遞。 指標傳遞: 形參為指向實參地址的指標,

java 傳遞地址傳遞(引用)的區別

JAVA傳遞引數有兩種方式:值傳遞和引用傳遞 值傳遞是傳遞資料:如基本資料型別都是值傳遞 引用傳遞是把形參和實參的指標指向了堆中的同一物件,物件的引用和陣列的引用。 注意: 實參,J

什麼是 傳遞地址傳遞引用傳遞 有什麼區別

什麼是值傳遞,地址傳遞和引用傳遞?它們有什麼不同?這在學校考試,找工作面試中都是常見的問題。它們之間的區別容易搞錯,長時間不用也容易忘記。最近又被問到這個問題,想想還是整理一下記下來,也方便以後參考。 首先,看以下三段程式碼。 1.  void swap1(i

傳遞地址傳遞的區別

首先了解一下jvm的內部如何儲存資料: 1.jvm中每個執行緒都對應一個執行時記憶體區-----棧。棧中存放執行緒自己用到的所有變數。 2.jvm規定棧和堆分開。棧儲存基本資料型別和物件引用。而物件儲存在堆裡。 3.物件引用中儲存的值是堆中物件的地址。 呼叫方法時,實參賦值形參, 值傳遞:(形式引數型

java 傳遞地址傳遞(引用傳遞

        一直來覺得對值傳遞和地址傳遞了解的很清楚,剛才在開源中國上看到一篇帖子介紹了java中的值傳遞和地址傳遞,看完後感受頗深。下邊總結下以便更容易理解。         按照以前的理解,java中基本資料型別是值傳遞,物件是地址(引用)傳遞。給大家看個例子:

StringStringBuffer作為方法引數引起的傳遞方法傳遞

一、 最開始的示例寫程式碼最重要的就是實踐,不經過反覆試驗而得出的說辭只能說是憑空遐想罷了。所以,在本文中首先以一個簡單示例來丟擲核心話題:public class StringAsParamOfMethodDemo {public static void main(Str

傳遞地址傳遞

作為開發人員,入門級的理解,就是值傳遞和地址傳遞的區別,這是C語言中的基礎。今天通過一個oc的demo理解一下面向物件中的值傳遞和地址傳遞,首先定義一個自定義類MyFunction,定義值傳遞和地址傳遞的方法 -(int)byValue:(int)x { x++; return x

javascript中傳遞地址傳遞,引用傳遞的問題。

首先發現問題是好事情,只有發現問題,才會有提高,不然整體都在寫相同的程式碼,寫個幾年,不還是原來的水平。 這個地址傳遞和值傳遞 不論在什麼語言都有這個問題,一旦出問題,就是很微妙的問題。想破天都不知道為啥的時候,多半就是 這個問題在作怪啦。 (js,java,c)c語言的

C語言引數傳遞----傳遞地址傳遞

最近開始復(yu)習(xi)C語言,看到引數傳遞這裡,又遇到了以前一直沒有搞清楚的一個問題,我相信這個問題大家許多初學者也會遇到過,就是C語言函式的引數傳遞方式。 C語言中引數的傳遞有兩種方式: 1)值傳遞 2)地址傳遞 3)陣列作為函式引數 這裡用兩

徹底高清傳遞地址傳遞的區別

1. 考題一:程式程式碼如下:void Exchg1(int x, int y)  {  int tmp;  tmp=x;  x=y;  y=tmp;  printf(“x=%d,y=%d/n”,x,y)}void main(){  int a=4,b=6;  Exchg1

物件作為引數傳遞地址傳遞

1.沒有明確宣告為指標或者引用,都是值傳遞,會呼叫物件過載的=,建立新的物件。2.當指定為指標型別的時候為傳遞的是指標(地址),指定引數型別為引用的時候,傳遞的也是地址。#include<stdi

c++裡面的傳遞,指標傳遞地址傳遞詳解

c++裡面的值傳遞: //將i和j的值傳給a和b,實參傳給形參,但由於形參不會回傳給實參,故輸出i仍為38,j仍為45 void main(){void swap(int, int);int i =