對equals和 的一點理解

2021-06-23 04:32:48 字數 1585 閱讀 3113

概述:

簡單的來說,equals是比較內容,==是比較位址值

詳細:記憶體可以分為堆記憶體和棧記憶體,簡單的理解一般棧中主要存放一些基本型別的變數(,int, short, long, byte, float, double, boolean, char)和物件控制代碼(物件位址值),而堆記憶體一般存放具體的物件控制代碼內容。

棧記憶體還有乙個很重要的特性,資料可以共享。

int a=4;

int b=4;

這是兩個比較簡單賦值語句,編譯器先處理int a=4語句,現在棧記憶體建立乙個變數為a的引用,然後查詢棧記憶體中是否有4這個值,結果不存在,則建立4這個值,並指向a變數的引用。然後編譯器處理int b=4語句,先建立乙個變數為b的引用,然後查詢查詢棧記憶體中是否有4這個值,結果發現有,就直接將變數b的引用指向4這個值而不重新建立。

需要注意的是,這種棧記憶體的資料共享和兩個物件的物件引用指向乙個同乙個物件是不一樣的。棧記憶體的資料共享改變乙個變數值得時候不會影響其他,例如,改變a的值不會影響b的值,這個是jvm自動完成的。但是當改變乙個物件引用指向的物件的內部狀態時,另乙個物件引用變數也會發生改變。

string str = new string("abc"); 

string str = "abc"; 

兩種的形式來建立,第一種是用new()來新建物件的,它會在存放於堆中。每呼叫一次就會建立乙個新的物件。 而第二種是先在棧中建立乙個對string類的物件引用變數str,然後查詢棧中有沒有存放"abc",如果沒有,則將"abc"存放進棧,並令str指 向」abc」,如果已經有」abc」 則直接令str指向「abc」。 

比較類裡面的數值是否相等時,用equals()方法;當測試兩個包裝類的引用是否指向同乙個物件時,用==。

string str1 = "abc"; 

string str2 = "abc"; 

system.out.println(str1==str2); //true 

可以看出str1和str2是指向同乙個物件的。 

string str1 =new string ("abc"); 

string str2 =new string ("abc"); 

system.out.println(str1==str2); // false 

用new的方式是生成不同的物件。每一次生成乙個。

因此用第二種方式(string str1 ="abc")建立多個」abc」字串,在記憶體中其實只存在乙個物件而已. 這種寫法有利與節省記憶體空間. 同時它可以在一定程度上提高程式的執行速度,因為jvm會自動根據棧中資料的實際情況來決定是否有必要建立新物件。而對於string str = new string("abc")的**,則一概在堆中建立新物件,而不管其字串值是否相等,是否有必要建立新物件,從而加重了程式的負擔。

另一方面, 要注意: 我們在使用諸如string str = "abc";的格式定義類時,總是想當然地認為,建立了string類的物件str。擔心陷阱!物件可能並沒有被建立!而可能只是指向乙個先前已經建立的 物件。只有通過new()方法才能保證每次都建立乙個新的物件。 

由於string類的immutable性質,當string變數需要經常變換其值時,應該考慮使用stringbuffer類,以提高程式效率。

對 threadfence的一點理解

一直沒搞清楚,cuda 2.2版增加的 threadfence到底有何作用,直到今天看到sdk 3.0手冊 中的下面例子才恍然大悟.中文為我的理解,嘿嘿 乙個求和的例子 device unsigned int count 0 統計有幾個block結束的變數 shared bool islastblo...

對GBDT的一點理解

gbdt由一系列的回歸樹組成,如下圖所示 樹的深度未必都要一樣,下圖僅為示意圖 gbdt原理 針對每乙個類別訓練一系列的回歸樹,再累加每個類別回歸樹的 值得到針對每個類別的最終的 值。單獨拿乙個類別來說,訓練的過程中假設需要 的值為f xi 實際的值為yi 有loss function l yi,f...

對block的一點理解

對block的理解 block宣告的寫法 property strong,nonatomic void block void property copy,nonatomic void block void block的本質 就是oc的物件,內部也有isa指標,block是封裝了函式呼叫以及函式呼叫環...