簡單通俗的講,一個完整的java程序運行過程會涉及以下內存區域:
l 寄存器:JVM內部虛擬寄存器,存取速度非常快,程序不可控制。
l 棧:保存局部變量的值,包括:1.用來保存基本數據類型的值;2.保存類的實例,即堆區對象的引用(指針)。也可以用來保存加載方法時的幀。
l 堆:用來存放動態產生的數據,比如new出來的對象。注意創建出來的對象只包含屬于各自的成員變量,并不包括成員方法。因為同一個類的對象擁有各自的成員變量,存儲在各自的堆中,但是他們共享該類的方法,并不是每創建一個對象就把成員方法復制一次。
l 常量池:JVM為每個已加載的類型維護一個常量池,常量池就是這個類型用到的常量的一個有序集合。包括直接常量(基本類型,String)和對其他類型、方法、字段的符號引用(1)。池中的數據和數組一樣通過索引訪問。由于常量池包含了一個類型所有的對其他類型、方法、字段的符號引用,所以常量池在Java的動態鏈接中起了核心作用。常量池存在于堆中。
l 代碼段:用來存放從硬盤上讀取的源程序代碼。
l 數據段:用來存放static定義的靜態成員。
JAVA語言只有值傳遞。
函數的參數分配,需要分情況討論。
1、如果參數類型是原始類型,比如 public void func(int a) , 那么程序執行這個func方法的時候,會在棧中開辟空間,存放a的值。但是這樣的操作并不會改變棧中另一塊內存存在的a的值。棧內存之間互相不影響。
2、如果參數類型是引用類型,比如public void func(String a),那么開始程序執行String a="hello"的時候,在棧中開辟了空間,放a,a指向堆內存中常量池“hello”。 當a作為參數傳入func的時候,內存在棧中重新開辟空間,這個空間也指向a指向的那塊常量“hello”,這個時候如果函數里面改變了這個string,那么所有指向這個常量的引用的值都變了。
【http://www.cnblogs.com/lixiaolun/p/4311863.html】
【http://www.cnblogs.com/_popc/p/4025684.html】
具體的思路是:
1、首先定義一個Node節點類。成員變量1是next指針,指向后一個元素的指針。成員變量2是data,保存該節點的數據。
2、定義一個單連邊。首先Node一個頭節點。然后定義一個position來指明該節點的位置。
3、定義鏈表的相關方法。首先是初始化頭節點,this.first=null。 然后是插入和刪除頭節點。然后是一般節點的增刪查。
鏈接:https://www.nowcoder.com/questionTerminal/75e878df47f24fdc9dc3e400ec6058ca來源:??途W
public
class
Solution {
public
static
ListNode ReverseList(ListNode head) {
if
(head==
null
)
return
null
;
ListNode reversedHead=
null
;
ListNode current=head;
ListNode tmp=
null
;
ListNode PRe=
null
;
while
(current!=
null
){
tmp=current.next;
current.next=pre;
if
(tmp==
null
)
reversedHead=current;
pre=current;
current=tmp;
}
return
reversedHead;
}
}
鏈表的反轉操作很多,上面這個是典型的遞歸思想。遞歸的方法是,利用遞歸走到鏈表的末端,然后更新每一個node的next值,實現鏈表的反轉,而newhead的值沒有發生變化,為尾節點。
鏈表的反轉還有非遞歸思想的,三指針的,利用棧的。。。。
http://blog.csdn.net/youngchang06hpu/article/details/8009947
進程:一個程序在一個數據集合上的一次運行過程。
http://www.ruanyifeng.com/blog/2013/04/processes_and_threads.html
假設CPU是一座工廠,假設CPU是單核的,一次只能運行一個任務的那種。 那就進程就像是工廠里的一個車間,單核的CPU一個確切的時間只允許一個車間工作,其他車間休息。一個車間里可以有很多工人,這些工人就叫線程。工人們在同一個車間里工作,所以進程的內存空間是被線程共享的。
因此,操作系統可以總結為:
1、以多進程的形式,允許多個任務同時運行。
2、以多線程的形式,允許單個任務分成不同的部分運行。
3、提供協調機制,防止進程間的沖突,允許線程之間共享數據。
http://jingyan.baidu.com/article/3a2f7c2e17e12b26afd611cb.html
進程之間有8種通信方式:
1、信號sinal :信號處理器
2、信號量 semophore :本質上是一個計數器。P、V操作
3、消息隊列 message queue :一個消息隊列可以被多個進程共享。 本質上是消息的鏈接表。
4、共享內存 shared memory :多個進程可以訪問同一塊內存。
5、套接字 socket: 可用于不同機器之間的進程間通信。
6、管道 pipe 只能在父子進程中使用,是一種半雙工的通信方式。
7、高級管道 popen :將一個程序當做一個新的進程在當前程序進程中啟動。
8、有名管道 named pipe :允許無親緣關系的進程間半雙工通信。
新聞熱點
疑難解答