1活喊、B/S與C/S的區(qū)別
? ? B/S:即Browser/Server(瀏覽器/服務器)結構,就是只安裝維護一個服務器(Server)麸祷,而客戶端采用瀏覽器(Browse)運行軟件佃延。
? ? 主要特點是交互性強、具有安全的存取模式泼各、網(wǎng)絡通信量低鞍时、響應速度快、利于處理大量數(shù)據(jù)扣蜻。但是該結構的程序是針對性開發(fā)逆巍,變更不夠靈活,維護和管理的難度較大莽使。通常只局限于小型局域網(wǎng)锐极,不利于擴展。并且芳肌,由于該結構的每臺客戶機都需要安裝相應的客戶端程序灵再,分布功能弱且兼容性差肋层,不能實現(xiàn)快速部署安裝和配置,因此缺少通用性翎迁,具有較大的局限性栋猖。
? ? C/S:CS即Client/Server(客戶機/服務器)結構。
? ? 主要特點是分布性強汪榔、維護方便蒲拉、開發(fā)簡單且共享性強、總體擁有成本低痴腌。但數(shù)據(jù)安全性問題雌团、對服務器要求過高、數(shù)據(jù)傳輸速度慢士聪、軟件的個性化特點明顯降低锦援。
2、Linux軟鏈接與硬鏈接的區(qū)別
? ? 硬鏈接(hard-link):若A是B的硬鏈接戚嗅,則A與B指向的是相同的inode節(jié)點雨涛。這里的“硬”我理解為物理上的,指向同一塊存儲地址懦胞。兩個文件名指向同一個文件替久,A和B對文件系統(tǒng)來說是完全平等的。如果刪除了其中一個躏尉,對另外一個沒有影響蚯根。每增加一個文件名,inode節(jié)點上的鏈接數(shù)增加一胀糜,每刪除一個對應的文件名颅拦,inode節(jié)點上的鏈接數(shù)減一,直到為0教藻,inode節(jié)點和對應的數(shù)據(jù)塊被回收距帅。注:文件和文件名是不同的東西,rm A刪除的只是A這個文件名括堤,而A對應的數(shù)據(jù)塊(文件)只有在inode節(jié)點鏈接數(shù)減少為0的時候才會被系統(tǒng)回收碌秸。
? ? 由于硬鏈接是有著相同 inode 號僅文件名不同的文件,因此硬鏈接存在以下幾點特性:
? ? ? ? 1悄窃、文件有相同的 inode 及 data block讥电;
? ? ? ? 2、只能對已存在的文件進行創(chuàng)建轧抗;
? ? ? ? 3恩敌、不能交叉文件系統(tǒng)進行硬鏈接的創(chuàng)建;
? ? ? ? 4横媚、不能對目錄進行創(chuàng)建纠炮,只可對文件創(chuàng)建月趟;
? ? ? ? 5、刪除一個硬鏈接文件并不影響其他有相同 inode 號的文件抗碰。
? ? 軟鏈接(soft-link):又稱符號鏈接狮斗,若A是B的軟連接,則A的數(shù)據(jù)區(qū)存放的就是B的文件路徑弧蝇。這里的“軟”我理解為邏輯上的。
? ? 軟鏈接有著自己的 inode 號以及用戶數(shù)據(jù)塊折砸。因此軟鏈接的創(chuàng)建與使用沒有類似硬鏈接的諸多限制:
? ? ? ? 1看疗、軟鏈接有自己的文件屬性及權限等;
? ? ? ? 2睦授、可對不存在的文件或目錄創(chuàng)建軟鏈接两芳;
? ? ? ? 3、軟鏈接可交叉文件系統(tǒng)去枷;
? ? ? ? 4怖辆、軟鏈接可對文件或目錄創(chuàng)建;
? ? ? ? 5删顶、創(chuàng)建軟鏈接時竖螃,鏈接計數(shù) i_nlink 不會增加;
? ? ? ? 6逗余、刪除軟鏈接并不影響被指向的文件特咆,但若被指向的原文件被刪除,則相關軟連接被稱為死鏈接(即 dangling link录粱,若被指向路徑文件被重新創(chuàng)建腻格,死鏈接可恢復為正常的軟鏈接)。
? ? 相關命令:
硬:ln 源文件 鏈接名
軟:ln -s 源文件 鏈接名
3啥繁、Linux進程內存空間各段分布(stack 菜职,heap,bss segment旗闽,code segment/text segment酬核,data segment)
代碼段:代碼段是用來存放可執(zhí)行文件的操作指令,也就是說是它是可執(zhí)行程序在內存種的鏡像宪睹。代碼段需要防止在運行時被非法修改愁茁,所以只準許讀取操作,而不允許寫入(修改)操作——它是不可寫的亭病。
數(shù)據(jù)段:數(shù)據(jù)段用來存放可執(zhí)行文件中已初始化全局變量鹅很,換句話說就是存放程序靜態(tài)分配的變量和全局變量。
BSS段:BSS段包含了程序中未初始化全局變量罪帖,在內存中bss段全部置零促煮。
堆(heap):堆是用于存放進程運行中被動態(tài)分配的內存段邮屁,它大小并不固定,可動態(tài)擴張或縮減菠齿。當進程調用malloc/new等函數(shù)分配內存時佑吝,新分配的內存就被動態(tài)添加到堆上(堆被擴張);當利用free等函數(shù)釋放內存時绳匀,被釋放的內存從堆中被剔除(堆被縮減)
棧(stack):棧是用戶存放程序臨時創(chuàng)建的局部變量芋忿,也就是說我們函數(shù)括弧“{}”中定義的變量(但不包括static聲明的變量,static意味這在數(shù)據(jù)段中存放變量)疾棵。除此以外在函數(shù)被調用時戈钢,其參數(shù)也會被壓入發(fā)起調用的進程棧中,并且待到調用結束后是尔,函數(shù)的返回值也回被存放回棧中殉了。由于棧的先進先出特點,所以棧特別方便用來保存/恢復調用現(xiàn)場拟枚。從這個意義上將我們可以把堆椥酵看成一個臨時數(shù)據(jù)寄存诗舰、交換的內存區(qū)酷誓。
4、快速排序
? ? 核心思想是找到一個基準值坎背,使得其左邊的值都小于它暴匠,右邊的都大于它(實質是每次排序都讓一個值處于正確的位置)鞍恢。這樣劃分一次后產(chǎn)生兩個區(qū)間,再分別對這兩個區(qū)間做同樣的事每窖。
? ? 假設對序列7帮掉,15,8窒典,54蟆炊,2,6瀑志,9進行快速排序涩搓,以第一個數(shù)7作為基準數(shù),分別設兩個指針left劈猪、right昧甘,left指向基準數(shù)后面一個數(shù),right指向最后一個數(shù)战得。
1充边、從右邊開始,找到第一個比基準數(shù)小的數(shù)(這里為6),用right標記位置
2浇冰、從左邊開始贬媒,找到第一個比基準數(shù)大的數(shù)(這里為15),用left標記位置肘习,注意际乘,right不能越過left的位置,若相交漂佩,跳到第4步
3脖含、交換left與right對應的值,right-1投蝉,left+1
4器赞、重復上面的步驟,直到left=right墓拜,將基準數(shù)與right標記的數(shù)交換位置,第一輪交換結束
接下來對小于基準數(shù)的部分和大于基準數(shù)的部分都做這個操作请契。
Java代碼(引自最通俗易懂的快速排序算法詳解 - yugenhai - 博客園)
public static int Partition(int[] a, int p, int r) {
? ? ? ? int x = a[r - 1];
? ? ? ? int i = p - 1;
? ? ? ? int temp;
? ? ? ? for (int j = p; j <= r - 1; j++) {
? ? ? ? ? ? if (a[j - 1] <= x) {
? ? ? ? ? ? ? ? // 交換(a[j-1],a[i-1]);
? ? ? ? ? ? ? ? i++;
? ? ? ? ? ? ? ? temp = a[j - 1];
? ? ? ? ? ? ? ? a[j - 1] = a[i - 1];
? ? ? ? ? ? ? ? a[i - 1] = temp;
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? // 交換(a[r-1,a[i+1-1]);
? ? ? ? temp = a[r - 1];
? ? ? ? a[r - 1] = a[i + 1 - 1];
? ? ? ? a[i + 1 - 1] = temp;
? ? ? ? return i + 1;
? ? }
? ? public static void QuickSort(int[] a,int p,int r){
? ? ? ? if(p < r) {
? ? ? ? ? ? int q = Partition(a, p, r);
? ? ? ? ? ? QuickSort(a, p, q-1);
? ? ? ? ? ? QuickSort(a, q + 1, r);
? ? ? ? }
? ? }
? ? // main方法中將數(shù)組傳入排序方法中處理,之后打印新的數(shù)組
? ? public static void main(String[] stra) {
? ? ? ? int[] a = { 7, 10, 3, 5, 4, 6, 2, 8, 1, 9 };
? ? ? ? QuickSort(a, 1, 10);
? ? ? ? for (int i = 0; i < a.length; i++)
? ? ? ? ? ? System.out.print(a[i]+" ");
? ? }
5咳榜、二叉樹的遍歷
? ? 前序遍歷:根結點 ---> 左子樹 ---> 右子樹
? ? 中序遍歷:左子樹--->根結點 ---> 右子樹
? ? 后序遍歷:左子樹 ---> 右子樹 ---> 根結點
? ? 已知3種遍歷序列中任意兩個,即可還原出二叉樹爽锥。
引自已知二叉樹的前序遍歷和中序遍歷涌韩,如何得到它的后序遍歷? - 經(jīng)歡非常道 - 博客園
利用以下幾個特性:
特性A氯夷,對于前序遍歷臣樱,第一個肯定是根節(jié)點;
特性B腮考,對于后序遍歷雇毫,最后一個肯定是根節(jié)點;
特性C踩蔚,利用前序或后序遍歷棚放,確定根節(jié)點,在中序遍歷中馅闽,根節(jié)點的兩邊就可以分出左子樹和右子樹飘蚯;
特性D,對左子樹和右子樹分別做前面3點的分析和拆分福也,相當于做遞歸局骤,我們就可以重建出完整的二叉樹;
我們以一個例子做一下這個過程暴凑,假設:
前序遍歷的順序是: CABGHEDF
中序遍歷的順序是: GHBACDEF
第一步峦甩,我們根據(jù)特性A,可以得知根節(jié)點是C搬设,然后穴店,根據(jù)特性C撕捍,我們知道左子樹是:GHBA,右子樹是:DEF泣洞。
第二步忧风,取出左子樹,左子樹的前序遍歷是:ABGH球凰,中序遍歷是:GHBA狮腿,根據(jù)特性A和C,得出左子樹的父節(jié)點是A呕诉,并且A沒有右子樹缘厢。
第三步,使用同樣的方法甩挫,前序是BGH贴硫,中序是GHB,得出父節(jié)點是B伊者,B的左子樹是GH英遭,且B沒有右子樹。
第四步亦渗,GH的前序是GH挖诸,中序是GH,得出父節(jié)點是G法精,G沒有左子樹多律,右子樹為H。
第五步搂蜓,回到右子樹狼荞,它的前序是EDF,中序是DEF洛勉,依然根據(jù)特性A和C粘秆,得出父節(jié)點是E,左右節(jié)點是D和F收毫。
到此攻走,我們得到了這棵完整的二叉樹。因此此再,它的后序遍歷就是:HGBADFEC昔搂。
6、Java關鍵字synchronized
? ? synchronized關鍵字最主要有以下3種應用方式输拇,下面分別介紹
修飾實例方法摘符,作用于當前實例加鎖,進入同步代碼前要獲得 當前實例 的鎖
? ? 所謂的實例對象鎖就是用synchronized修飾實例對象中的實例方法,注意是實例方法不包括靜態(tài)方法
修飾靜態(tài)方法逛裤,作用于當前類對象加鎖瘩绒,進入同步代碼前要獲得 當前類對象 的鎖
? ? 當synchronized作用于靜態(tài)方法時,其鎖就是當前類的class對象鎖带族。由于靜態(tài)成員不專屬于任何一個實例對象锁荔,是類成員,因此通過class對象鎖可以控制靜態(tài)成員的并發(fā)操作蝙砌。需要注意的是如果一個線程A調用一個實例對象的非static synchronized 方法阳堕,而線程B需要調用這個實例對象所屬類的靜態(tài) synchronized方法,是允許的择克,不會發(fā)生互斥現(xiàn)象恬总,因為訪問靜態(tài) synchronized 方法占用的鎖是當前類的 class 對象,而訪問非靜態(tài) synchronized 方法占用的鎖是當前實例對象鎖肚邢。
修飾代碼塊壹堰,指定加鎖對象,對給定對象加鎖骡湖,進入同步代碼庫前要獲得 給定對象 的鎖
? ? 除了使用關鍵字修飾實例方法和靜態(tài)方法外缀旁,還可以使用同步代碼塊,在某些情況下勺鸦,我們編寫的方法體可能比較大,同時存在一些比較耗時的操作目木,而需要同步的代碼又只有一小部分换途,如果直接對整個方法進行同步操作,可能會得不償失刽射,此時我們可以使用同步代碼塊的方式對需要同步的代碼進行包裹军拟,這樣就無需對整個方法進行同步操作了。