1 .Java 程序運(yùn)行時(shí)內(nèi)存的邏輯分配
? ? ? method area虽画, stack 蝉绷,heap 缤灵,native method stack
? ? ? In method area------ there are information about class which loaded.
? ? ? In heap------there are array and obj created by new operation
? ? ? In stack------local variance area ,operater number stack
? ? ? In native method stack 內(nèi)存------
內(nèi)存結(jié)構(gòu)
2. Java 棧(JVM stack)
? ?Jvm stack 是程序運(yùn)行時(shí)的單位
? ?just like this
jvm stack
In java多望,每個(gè)thread 都有自己的jvm stack剧蹂,因?yàn)?jvm stack 存儲(chǔ)著thread的執(zhí)行邏輯确徙。
3. let us talk about ?Java Heap.
? ?Firstly,Java Heap divided to different generations.just like this:
Java ? ?Heap
Then we can see when we create a String obj,how it stored in java heap:just like this:
obj and value
extends:String str=new String("123");
if there is no 123 in constant var in pool ,it will create in pool firstly, then create it in heap,just like this:
creat string
please think when string is local variance,what happens?
4:we can talk about 值傳遞和引用傳遞 now
摘自知乎:鏈接:
? ? https://www.zhihu.com/question/31203609/answer/50992895
in order to know what is 值傳遞 and what is 引用傳遞醒串,we make sense the difference between 基本類(lèi)型 和 引用類(lèi)型
基本類(lèi)型和引用類(lèi)型
其中a是基本類(lèi)型,值就保存在變量a中鄙皇,而string是引用類(lèi)型芜赌,變量中保持的是實(shí)際對(duì)象的地址。一般稱(chēng)這種變量為引用伴逸。
how the “=” work
if?
? ? ? ? ?int num = 10;
? ? ? ? ?String str = "hello";
state1
now we do this
? ? ? ? ? ? ? ? num = 20;
? ? ? ? ? ? ? ? str = "java";
it works just like this:
state2
from above two pictures,the conclusion is:
對(duì)于基本類(lèi)型 num 缠沈,賦值運(yùn)算符會(huì)直接改變變量的值,原來(lái)的值被覆蓋掉违柏。
對(duì)于引用類(lèi)型 str博烂,賦值運(yùn)算符會(huì)改變引用中所保存的地址,原來(lái)的地址被覆蓋掉漱竖。但是原來(lái)的對(duì)象不會(huì)被改變(重要)禽篱。
? ? ?調(diào)用方法時(shí)發(fā)生了什么?馍惹?躺率?
? ? ? ------參數(shù)傳遞基本上就是賦值操作------
example 1 :基本類(lèi)型
? ? ?void foo(int value) {
? ? ? ? ? value = 100;
? ? ? ? ? }
foo(num); // num 沒(méi)有被改變,因?yàn)閭鬟f只是num的值万矾。
example2 :引用類(lèi)型悼吱,但該引用類(lèi)型沒(méi)有提供改變自身的方法。如String
void foo(String text) {
? ? ? ? ? ? ? text = "windows";
? ? ? ? ? ? ? }
foo(str); // str 也沒(méi)有被改變
example 3:引用類(lèi)型良狈,該類(lèi)型提供了改變自身的方法后添。
StringBuilder sb = new StringBuilder("iphone");
? ? ? void foo(StringBuilder builder) {
? ? ? builder.append("4");
? ? ? }
foo(sb); // sb 被改變了,變成了"iphone4"薪丁。
example4:同example3遇西,提供改變自身方法的引用類(lèi)型,但是不使用严嗜,使用賦值運(yùn)算粱檀。
? ?StringBuilder sb = new StringBuilder("iphone");
? void foo(StringBuilder builder) {
? builder = new StringBuilder("ipad");
? ? ? ? }
? ? ? ?foo(sb); // sb 沒(méi)有被改變,還是 "iphone"漫玄。
?