1. java代碼,創建字元串對象,內存中保存的是什麼
抄的
Java stores strings as UTF-16 internally.
"default encoding" isn't quite right. Java stores strings as UTF-16 internally, but the encoding used externally, the "system default encoding", varies from platform to platform, and can even be altered by things like environment variables on some platforms.
2. java中的,創建對象時, new是在內存的堆(heap)上為對象開辟空間, aPerson存在於內存的棧(stack)中。
棧是存放函數調用過程中的臨時變數的! 堆是程序運行過程中動態申請的內存的存放處的!比如new的對象就在堆上
在函數中定義的一些基本類型的變數和對象的引用變數都是在函數的棧內存中分配。當在一段代碼塊中定義一個變數時,java就在棧中為這個變數分配內存空間,當超過變數的作用域後,java會自動釋放掉為該變數分配的內存空間,該內存空間可以立刻被另作他用。
堆內存用於存放由new創建的對象和數組。在堆中分配的內存,由java虛擬機自動垃圾回收器來管理。在
數組和對象在沒有引用變數指向它的時候,才變成垃圾,不能再被使用,但是仍然占著內存,在隨後的一個不確定的時間被垃圾回收器釋放掉。這個也是java比較占內存的主要原因。
按照編譯原理的觀點,程序運行時的內存分配有三種策略,分別是靜態的,棧式的,和堆式的.
靜態存儲分配是指在編譯時就能確定每個數據目標在運行時刻的存儲空間需求,因而在編譯時就可以給他們分配固定的內存空間.
棧式存儲分配也可稱為動態存儲分配,棧式存儲分配要求在過程的入口處必須知道所有的存儲要求,而堆式存儲分配則專門負責在編譯時或運行時模塊入口處都無法確定存儲要求的數據結構的內存分配。
從堆和棧的功能和作用來通俗的比較,堆主要用來存放對象的,棧主要是用來執行程序的.
3. java中關於創建對象這個機制在內存變化的問題
打個比方:
日本鬼子找八路軍要地下黨名單(雖然藏著個名單滿世界跑是個蠢事,電視劇情就這樣)。
日本鬼子最起碼先要確定他是八路,再確定他叫什麼名字,最後才好下手
共產黨 張三 =new 共產黨();
張三是共產黨,未必屬於他們定義共產黨的這個圈,他們所找的共產黨是活動在周邊藏有人員名單的一種特殊的屬性。
前面的Dog dog;只是說明他是Dog類型而已;後面new Dog(),是給他示例,new關鍵詞是給他這個類,把他套進這個圈子,這個圈子內早定好了屬性,這些屬性叫成員變數也好、叫屬性也好,都是程序開發環境或者用戶自定義特有的屬性。示例化過後就可以調用他的成員變數了。
dog.成員(變數); //執行操作
如果不示例化,那就不能廣泛使用,dog如果沒在過程用有過定義,就再也沒有成員了。
這就好比你 自稱是某個變數,在編譯環境里是不承認的,實例化一下,給他個公證
4. java 中new一個對象佔多少內存
Object
o=new
Object():
在java中空對象佔八個位元組,對象的引用佔四個位元組。所以上面那條語句所佔的空間是4byte+8byte=12byte.java中的內存是以8的倍數來分配的,所以分配的內存是16byte.
舉個例子:
Class
O{
int
i;
byte
j;
String
s;
}
其所佔內存的大小是空對象(8)+int(4)+byte(1)+String引用(4)=17byte,因要是8的整數倍,所以其佔大小為24byte.
當然,如果類里有其他對象的話,也要把其他對象的空間算進去。
其實這個在javaeye的電子期刊上有。
5. java的方法中new的對象存儲在內存中那個區域
這個對象存在堆中,還是棧中?
答:堆,new一個對象,一定是在堆中
方法內部new出來的對象,在哪裡存著?
答:堆,new出來對象的實例變數都存在堆上面。
棧,這個東西,需要理解為:線程運行時,才會創建,執行完,就沒了。
Person p = new Person();
上面這段代碼,在執行時,p壓入棧,通過局部變數表,找到對應的【實例數據】,執行完畢後釋放。
6. java中使用類創建對象後,該對象的方法在堆內存中是怎樣存儲的
方法不存在在堆內存中,是放在代碼區,只有在調用的時候,才會構建該方法的運行時環境,包括參數,局部變數等,當然,這些也都是在棧內存中的。對內存只存放被new出來的東西。
你可以讀讀編譯原理相關的書,這種問題就清楚了。
7. java創建對象底層原理是什麼,java中的對象到底在內存中是什麼,別說什麼類的具體實例化
對象是類的實例,同一個類的不同實例當然擁有相同的機器指令(相同的方法行為),不同的實例擁有不同的屬性內存,相同的指令操作不同的內存得到各自的結果。
舉個例子:
我們描述一個類:水果,它有兩個屬性,名稱和數量,一個方法設置數量(setNum)。
現在,我們實例兩個水果,一個蘋果和一個西瓜(假如初始是一個),此時得為蘋果和西瓜各自准備一個不同的存放空間(不能重疊了是吧,這就是為不同對象分配不同的堆內存),然後我們為兩個對象都執行設置數量方法(都是setNum,同一個行為),假如蘋果改為2,西瓜
改為5,此時兩個不同對象執行了同一個方法得到個各自的結果。
下面補充一些官方描述:
java創建類時,也即是你所說的原類,其實只是對那個類的對象的外觀與行為的描述(此時並未開辟堆內存,當然static例外)。只有當使用new創建那個類的對象時才會分配數據存儲空間,其方法才供外界調用。
java為指定類創建對象,其實就是為類的描述創建屬性值存儲空間並初始化,並在堆棧中創建其指針,如果有方法局部變數,方法也會有自己的臨時堆棧。
一個對象是一個堆棧地址所指向的一組堆內存,然後對象的行為則是java語言編譯後的機器指令代碼,指令執行操縱內存的數據。
如果有更合理的理解,或者認為我的理解有不對的地方歡迎指正,學習就是不斷接近真相。
8. 在java中生成對象分配的內存幾種詳細解釋
堆內存和棧內存,一個類,創建實例後,成員變數和方法聲明被分配到堆內存,方法體分配到棧內存。明白這個就能很好的解釋多態、繼承、覆蓋方面的問題了。
9. Java創建一個空的ConcurrentHashMap對象佔多大內存空間
1、
ConcurrentHashMap不指定大小默認是16;
10. JAVA基礎問題求解【創建對象的具體過程在內存中是怎麼進行的】
這個問題我回答你。
學過匯編語言的人都知道。
一個應用程序一般分為3個部分。
1.數據段
2.棧段
3.代碼段
有關上面的具體含義,解釋起來用的文字較多。你可以網路搜多一下。
或看看8086匯編
有關下面這個問題:
(1)
Stringa=newString("abcdef");
與
(2)
Stringa="abcdef";
他們是不一樣的。
(2)是在編譯器決定的,(1)是在運行期間決定的。
(2)中的abcdef存放在「棧」中。
而(1)中new出來的String存放在「堆」中
「棧」的大小是編譯器確定下來的。(存取速相對"堆"較快)
而「堆」是動態創建的(Java中通過new創建的對象都是放在堆中的)
注意:我這里說的是創建出來的對象,而非存放對象引用的變數
(例如Stringa;)
SomeClassa=newSomeClass();
a=newSomeClass();
newSomeClass();
這3個的區別和聯系。
區別就是在內存中創建了3個對象。
不同的就是,這3個對象有的存在引用關系(例如:a=newSomeClass();)
有則則沒有(newSomeClass();)
沒有存在引用關系的對象,將會在內存負載過大的時候,自動由Java的內存回收機制。將此塊內存釋放。
從匯編角度來講:
什麼是類呢?什麼是對象?
看似一個很書面的問題。
其實不然!
我們可以把「類」看做一個飛機的設計圖紙
而把對象是為按照這個圖紙設計出來的一個實實在在看得見摸得著的「飛機」
對於這個例子:
SomeClassa=newSomeClass();
SomeClassb=newSomeClass();
他們有不同之處,也有相同之處。
從底層來講。相同之處,是指他們用的都是同一塊」代碼段「
不同之處在於「數據」有所不同。
可能聽起來有些不好理解。
其實你知道理解我最上面所講的內容就足夠了。
想學習更深入的內容,等以後有時間學習學習80x86匯編。
看看《深入Java虛擬機》等相關書籍
我寫的字有些多了。。。我也該看看新聞去了。。。再見哦~~