字串(修正版)

2022-07-12 06:39:08 字數 1652 閱讀 4269

前面說到引用資料型別的儲存方式與基本資料型別不一致,這裡做進一步更規範的說明。

先看**:

1

public

class

string01

10 }

為何會出現這樣的情況?

記憶體可以分為棧、堆、方法區。而方法區裡面又有一塊地方稱之為執行常量區。而像上面的"yyds",是儲存在方法區的執行常量區的。上面第4、5行**都是相當於在棧裡宣告了變數。若僅宣告而不賦值,其位址為空。當初始化為"yyds"之後,"yyds"便儲存在方法區的執行常量區,同時其位址會賦值給str1.假設其為089.再來看str2.因為str2也是賦值為"yyds",首先計算機會檢測執行常量區是否有這個常量。已經有了的話,就不會再新開闢一塊記憶體區域了,沒有才會。因為在執行常量區已經有乙個"yyds"了,所以它們會使用相同的記憶體區域。因此str2裡面儲存的也是089,與str1指向同一塊記憶體區域。而str3就不一樣了。所有new出來的物件都是儲存在堆裡面的(類的物件都是需要new的)。堆裡面的物件就儲存了乙個位址,同樣也是089,指向執行常量區的"yyds".堆裡面這個物件儲存的是位址,值是089,這個物件同樣也是有位址的,假設其為045.我們是把new出來的物件賦值給了str3,所以str3指向堆裡面的這個物件,而堆裡面的物件又指向了執行常量區的字串

因此,上面比較str1和str2,其實比較的是引用。由於其指向的都是同一塊引用,位址是一樣的,所以輸出true.而str3指向的是堆裡面的一塊記憶體區域,str2指向的是執行常量區裡面的一塊記憶體區域,所以比較這兩個字串的話,肯定是不相等的,於是輸出false.

注意equals這個方法比較的是字串裡面的字元,沒有上面那麼複雜。

示意圖如下:

插入:對於陣列的一點說明:

首先看**:

1

public

class

arraydemo ;

5int b = null

;6 b =a;

7 b[1] = 80;

8 system.out.println(a[1]+" "+b[1]);9}

10 }

執行效果如下:

出現這種情況的原因是因為,陣列是屬於引用資料型別,第6行**的b = a這個操作相當於把a的位址賦給了b,所以它倆就指向了堆裡面的同一塊記憶體區域,當修改b[1]的值時,是把這塊記憶體區域裡面索引為1的那個值修改了。所以輸出a[1]和b[1]時,它們都變為了80.

總結:

基本資料變數宣告出來不管是否賦值,都已經分配了記憶體;

引用資料變數的建立分為兩步:宣告和初始化。其中宣告只在棧內分配記憶體(儲存引用,或者說,儲存記憶體位址),而初始化在堆或者方法區分配記憶體(儲存實際的資料),new出來的東西放在堆裡面,程式執行常量放在方法區。

anaconda安裝cafe修正版

建立新環境 conda create n caffe fzp python 2.7 c defaults 注意 此處 c default 表示使用defaults 的channel安裝。否則會因為依賴庫channel不一致,產生如下問題 import caffe traceback most rec...

ExtJs Grid匯出到Excel 修正版

posted 週日,03 22 2009 23 13 by admin 以下的幾個問題我都已經整理和修改 1 沒有考慮到含有序號和選擇框的grid,2 utf8轉換bug.3 寬度的bug 4 不支援ie6 ie7和safari 修改後的 見附件的gridtoexcel.js.zip 注 我的檔案編...

extjs基礎操作修正版本

顯示編輯檢視 record 編輯介面上的資料 title 編輯介面上顯示的標題 xtype 編輯介面的別名 datelist 時間控制項 radiolist radio集合 checklist 核取方塊 comstore 下拉框store的id字串,以 分割 params引數 showeditin ...