Java值傳遞和地址傳遞:關於String型別和集合型別作為函式引數時傳值問題的測試
先看程式碼,你要是一眼就看出問題了,那就請允許在下水那麼一回。
基本資料型別是值傳遞的,那麼基本資料型別的封裝型別呢?是不是值傳遞呢,這個可是物件喲!
直接新建的字串是值傳遞的,那麼要是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。先看程式碼,你要是一眼就看出問題了,那就請允許在下水那麼一回。 基本資
Android:WebView與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中基本資料型別是值傳遞,物件是地址(引用)傳遞。給大家看個例子:
String和StringBuffer作為方法引數引起的值傳遞和方法傳遞
一、 最開始的示例寫程式碼最重要的就是實踐,不經過反覆試驗而得出的說辭只能說是憑空遐想罷了。所以,在本文中首先以一個簡單示例來丟擲核心話題: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 =