java中什么是引用變量 java循環(huán)中不改變循環(huán)變量是規(guī)范嗎?
java循環(huán)中不改變循環(huán)變量是規(guī)范嗎?您好,我不知道您的意思是foreach循環(huán)變量的名稱不能更改還是for循環(huán)中集合中的元素不能更改。如果它是第一個,我認為它應(yīng)該被視為一個語言規(guī)范,特別是在fore
java循環(huán)中不改變循環(huán)變量是規(guī)范嗎?
您好,我不知道您的意思是foreach循環(huán)變量的名稱不能更改還是for循環(huán)中集合中的元素不能更改。
如果它是第一個,我認為它應(yīng)該被視為一個語言規(guī)范,特別是在foreach循環(huán)中。實際上,變量名通常是不變的,因為我們不會對變量名做太多處理。它實際上是中間的一個臨時變量,類似于我們有一個數(shù)組,數(shù)組的每個元素在參與邏輯處理時都會先得到,當涉及到這個元素時,比如array[i],我們可以直接用它來處理業(yè)務(wù)邏輯。但是,由于在foreach循環(huán)中不能以這種方式獲得臨時變量,因此會給出一個臨時變量,并且每個循環(huán)的變量名是相同的。
如果是第二個,我認為它肯定不是一個規(guī)范。在很多業(yè)務(wù)中,我們會修改相應(yīng)的變量,包括更新或刪除。當然,我們在處理這些業(yè)務(wù)時需要使用迭代器,但是循環(huán)變量肯定可以修改。
多個線程可以讀一個變量,只有一個線程可以對這個變量進行寫,到底要不要加鎖?
下面簡要說明以下原因:
鎖定是因為操作不是原子的。讓我們用操作一來解釋它??聪旅鎯蓚€圖。
我這個操作需要
看上面的第二個圖,你能很清楚地理解這個過程嗎?
鎖定是為了確保上述三個步驟是原子操作。
回到問題上來,只有一個線程要寫,沒有競爭,所以不需要鎖定。
但是,如果你看第一張圖片,因為主內(nèi)存和本地內(nèi)存的存在
在一個線程寫入后,其他線程無法立即看到它。這就是可見性問題。
添加volatile關(guān)鍵字后,它將在操作后強制工作內(nèi)存和主內(nèi)存同步,以確保其他線程可以立即看到它。
為什么說java里面只有值傳遞?
在這個問題上,不同的人有不同的理解。對于Java初學(xué)者來說,他們可能認為Java中的參數(shù)傳遞分為值傳遞和引用傳遞。至于為什么,教科書上說了。對于程序員的某些工作年限,他們可能會認為,如果傳遞的參數(shù)類型是普通類型,則傳遞的是值;如果參數(shù)是對象,則傳遞的是引用。另一些人認為,只有Java中的值傳遞才是主要問題的主題。
對于Java編程語言,前兩種理解是錯誤的。Java中只使用值傳遞。對我來說,一開始,我也理解了價值傳遞和參照傳遞的理論,但隨著自己代碼的積累,我逐漸發(fā)現(xiàn)事實并非如此。那么為什么只有價值傳遞呢?
首先,讓我們了解什么是值傳遞,什么是引用傳遞?
值傳輸意味著調(diào)用函數(shù)時,實際參數(shù)值被復(fù)制并傳遞給被調(diào)用函數(shù)。修改被調(diào)用函數(shù)中的參數(shù)值不會影響原始參數(shù)值。
引用傳遞意味著調(diào)用函數(shù)時,實際參數(shù)的地址直接傳遞給被調(diào)用函數(shù)。修改被調(diào)用函數(shù)中的參數(shù)值將影響原始參數(shù)值。
如果傳遞的參數(shù)類型是普通基本類型,則必須復(fù)制實際參數(shù)值并將其傳遞給形式參數(shù)。但是,當參數(shù)類型是對象時,它也是復(fù)制的參數(shù)值,并將其傳遞給形式參數(shù)。只復(fù)制對象的引用地址,即內(nèi)存中分配的存儲地址,而不是直接傳遞的引用地址。
此時,有些人可能會問為什么一個對象會被傳遞給另一個方法。在此方法中修改對象的屬性值時,原始調(diào)用方法中對象的屬性值將更改。這不就是參考傳遞嗎?
事實上,這是一個非常令人困惑的問題。如果你仔細看看上面的說法,事實并非如此。將一個對象傳遞給另一個方法會傳遞什么?傳遞對象引用的地址。對象引用的地址是否已在其他方法中修改?原始對象引用是否受影響?不
!因此,Java中沒有引用傳遞,只有值傳遞。不要犯任何錯誤!