1.反射、clone、反序列化創(chuàng)建對(duì)象 ,深拷貝(復(fù)制原型中對(duì)象的內(nèi)存copy)和淺拷貝? (復(fù)制原型的引用)
cloneable接口 點(diǎn)擊這里?
2. 匿名內(nèi)部類(lèi):
可以繼承其他類(lèi),但不能用extends。
可以實(shí)現(xiàn)某接口,但不能用implements。
如 class A{public void a()};
class B{public void b(){new A(){重寫(xiě)a方法}}
3. public private
4. jre叫java運(yùn)行時(shí)環(huán)境,要運(yùn)行java程序,必須安裝jre,這也是跨平臺(tái)的保障,只有裝了jre才能運(yùn)行java命令,要進(jìn)行開(kāi)發(fā)需要安裝jdk,安裝了jdk才能編譯java程序,也就是執(zhí)行javac等命令,jdk自帶jre
5.抽象方法只能在抽象類(lèi)和接口中有,為什么只有內(nèi)部類(lèi)可以是靜態(tài)的抽象類(lèi),別的抽象類(lèi)不能是靜態(tài)的,抽象方法都不能是靜態(tài)的。static方法中不能出現(xiàn)this,因?yàn)閠his是一個(gè)對(duì)象,而static是全局的,是屬于這個(gè)類(lèi)的。接口中不能有變量,所有的成員都是final,抽象類(lèi)可以不是為final,因?yàn)榻涌诘哪康木褪抢锩嬉恍┎粫?huì)變的東西,只能有staic和final ,所有的方法都是Public? abastract
反之一個(gè)抽象類(lèi)卻可以沒(méi)有抽象方法,你或許奇怪那這是抽的什么象呢?這種用法還是存在的,其目的是不希望這個(gè)類(lèi)被實(shí)例化。這種形式在Spring源碼中實(shí)現(xiàn)單例模式就用到了。
抽象類(lèi)也可以繼承實(shí)體類(lèi),也可以實(shí)現(xiàn)接口,沒(méi)有什么特別的限制。
抽象方法,接口里的方法,必須被重寫(xiě)實(shí)現(xiàn),所以必須是public的。接口里可以有成員變量,但是必須(默認(rèn))是public static final的。
我們會(huì)在抽象類(lèi)的非抽象方法中看到this。this代表的是對(duì)象本身,是和實(shí)例化有關(guān)的。如果抽象類(lèi)不能被實(shí)例化,那么方法中的this是指什么呢?static方法,抽象方法中肯定不能有this,所以普通方法中的this肯定是由實(shí)例化對(duì)象調(diào)用的,所以這里的this,就是繼承抽象類(lèi)的實(shí)體類(lèi)本身。
ps:實(shí)際上在普通類(lèi)之間的繼承,子類(lèi)調(diào)用父類(lèi)方法時(shí)碰到this也是指之類(lèi)本身。
抽象類(lèi)可以是static的(內(nèi)部類(lèi)才能使用static),但是抽象方法卻不能是static的,因?yàn)槌橄蠓椒ň褪菫榱酥貙?xiě)。
6.子類(lèi)繼承父類(lèi),構(gòu)造函數(shù)
1.如果父類(lèi)有構(gòu)造函數(shù)帶參數(shù)的,則子類(lèi)必須要重寫(xiě)父類(lèi)的這個(gè)帶參數(shù)的構(gòu)造函數(shù),如果沒(méi)有帶參數(shù)則不用重寫(xiě),因?yàn)橄到y(tǒng)只會(huì)默認(rèn)生成一個(gè)不參數(shù)的構(gòu)造函數(shù),帶參數(shù)的是不會(huì)繼承的。
2.初始化子類(lèi)時(shí),必須先調(diào)用父類(lèi)的構(gòu)造函數(shù),是無(wú)參的構(gòu)造函數(shù),如果寫(xiě)了super,則看情況調(diào)用父類(lèi)的一個(gè)構(gòu)造函數(shù)
3.寫(xiě)子類(lèi)的帶有參數(shù)的構(gòu)造函數(shù)時(shí),如果父類(lèi)自己寫(xiě)了無(wú)參的構(gòu)造函數(shù),不是默認(rèn)生成的那個(gè),是自己寫(xiě)的,則可以不有super,首先調(diào)用父類(lèi)無(wú)參的構(gòu)造函數(shù),如果沒(méi)有定義父類(lèi)的無(wú)參的構(gòu)造函數(shù),則會(huì)編譯錯(cuò)誤。
4.子類(lèi)沒(méi)有顯示調(diào)用父類(lèi)構(gòu)造函數(shù),不管子類(lèi)構(gòu)造函數(shù)是否帶參數(shù)都默認(rèn)調(diào)用父類(lèi)無(wú)參的構(gòu)造函數(shù),若父類(lèi)沒(méi)有則編譯出錯(cuò)。
7.接口可以繼承接口,在實(shí)現(xiàn)接口的類(lèi)重寫(xiě)所有的方法即可。抽象類(lèi)可繼承具體類(lèi),但前提是具體類(lèi)必須有明確?
的構(gòu)造函數(shù)。
8.asset的用法
9.NAN比較
10.字節(jié)流和字符流的比較?Unicode
11.有沒(méi)有哪種情況用 + 做字符串連接比調(diào)用 StringBuffer / StringBuilder 對(duì)象的 append 方法
性能更好?
如果連接后得到的字符串在靜態(tài)存儲(chǔ)區(qū)中是早已存在的,那么用+做字符串連接是優(yōu)于 StringBuffer /StringBuilder 的 append 方法的。String a="111"是放在棧中,String a=new String("aaa")是放在堆中 第5章12題目
如:但是有特殊情況: String str = “abc” + “def”;StringBuffer Sb = new StringBuilder(“abc”).append(“ def”);這時(shí)這種情況下:String的速度就要比StringBuffer的速度要快,因?yàn)檫@時(shí)jvm認(rèn)為String str = “abc” + “def”;其實(shí)是:String str = “abcdef”;所以速度當(dāng)然很快,這里說(shuō)的是當(dāng)String保存的字符串中有其他String的字符串時(shí),速度就會(huì)變慢。
12.序列化時(shí)哪些東西是能被序列化的?
java中的序列化時(shí)transient變量(這個(gè)關(guān)鍵字的作用就是告知JAVA我不可以被序列化)和靜態(tài)變量不會(huì)被序列化
13.java單例,與靜態(tài)類(lèi)的區(qū)別???只有內(nèi)部類(lèi)可以是靜態(tài)的啊呢
誤解一:靜態(tài)方法常駐內(nèi)存而實(shí)例方法不是。
實(shí)際上,特殊編寫(xiě)的實(shí)例方法可以常駐內(nèi)存,而靜態(tài)方法需要不斷初始化和釋放。????
誤解二:靜態(tài)方法在堆(heap)上,實(shí)例方法在棧(stack)上。
實(shí)際上,都是加載到特殊的不可寫(xiě)的代碼內(nèi)存區(qū)域中????不知道
1) 單例可以繼承和被繼承,方法可以被override,而靜態(tài)方法不可以。
2)靜態(tài)方法中產(chǎn)生的對(duì)象會(huì)在執(zhí)行后被釋放,進(jìn)而被GC清理,不會(huì)一直存在于內(nèi)存中。
3.)靜態(tài)類(lèi)會(huì)在第一次運(yùn)行時(shí)初始化,單例模式可以有其他的選擇,即可以延遲加載。
4.)基于2, 3條,由于單例對(duì)象往往存在于DAO層(例如sessionFactory),如果反復(fù)的初始化和釋放,則會(huì)占用很多資源,而使用單例模式將其常駐于內(nèi)存可以更加節(jié)約資源。
5. 靜態(tài)方法有更高的訪問(wèn)效率。
6. 單例模式很容易被測(cè)試。
14.Iterator的快速失敗機(jī)制 點(diǎn)擊這里? Iterator是Collection所繼承的接口,因此所有的集合類(lèi)都實(shí)現(xiàn)了這個(gè)接口,有hasNext().next(),remove()方法。源碼是點(diǎn)擊這里 ,next方法返回當(dāng)前的元素,并且將指針后移一位,remove()方法刪除當(dāng)前的元素。并修改元素的個(gè)數(shù)? 再看一下吧
15.Map的遍歷 點(diǎn)擊這里
兩種:一種是把Key先轉(zhuǎn)換為Set,keySet(),再把Set轉(zhuǎn)換為Iterator,再遍歷這個(gè),第二種是把Key和Value一起存儲(chǔ)在Map.entrySet()中,直接得到key和value
16.Person p = new Person();
1,因?yàn)閚ew用到了Person.class.所以會(huì)先找到Person.class文件并加載到內(nèi)存中。
2,執(zhí)行該類(lèi)中的static代碼塊,如果有的話,給Person.class類(lèi)進(jìn)行初始化。
3,在堆內(nèi)存中開(kāi)辟空間,分配內(nèi)存地址。
4,在堆內(nèi)存中建立對(duì)象的特有屬性。并進(jìn)行默認(rèn)初始化。
5,對(duì)屬性進(jìn)行顯示初始化。
6,對(duì)對(duì)象進(jìn)行構(gòu)造代碼塊初始化。
7,對(duì)對(duì)象進(jìn)行對(duì)應(yīng)的構(gòu)造函數(shù)初始化。
8,將內(nèi)存地址付給棧內(nèi)存中的p變量。
static會(huì)在第一次使用這個(gè)類(lèi)時(shí)加載,再初始化則不會(huì)再加載了,如單例的懶漢式
靜態(tài)方法是不能調(diào)用非靜態(tài)方法和屬性,前提是不能調(diào)用沒(méi)有確定實(shí)例化對(duì)象的非靜態(tài)方法和屬性,而new Person()并不是一個(gè)單純的非靜態(tài)方法,它是在構(gòu)建一個(gè)類(lèi)對(duì)象及其初始化對(duì)象,返回的是一個(gè)對(duì)象實(shí)例,相當(dāng)于調(diào)用的是一個(gè)以構(gòu)建好的實(shí)例化對(duì)象。對(duì)象都確定了,靜態(tài)方法當(dāng)然可以使用了...,如果Person是一個(gè)內(nèi)部類(lèi)則不可以直接在外部?jī)?nèi)的靜態(tài)方法中使用,因?yàn)橥獠款?lèi)并還沒(méi)有初始化,則內(nèi)部類(lèi)無(wú)法獨(dú)立于外部類(lèi)
17.comparable,comparator(可以排序,分組還沒(méi)有看) 點(diǎn)擊這里
comparable的用法:如果一個(gè)數(shù)組里面存的是一個(gè)對(duì)象,則這個(gè)對(duì)象的類(lèi)需要實(shí)現(xiàn)comparable接口。然后重寫(xiě)compareTo()方法,如果要升序,則前一個(gè)數(shù)如果大于另一個(gè)數(shù),則返回正數(shù),降序則相反。然后用Collection.sort()方法直接對(duì)存儲(chǔ)該對(duì)象的數(shù)組排序即可。
comparator的用法:排序。在Collection.sort(list,new Comparator())接口,然后實(shí)現(xiàn)它的compare()方法,與上面的一樣。
18.點(diǎn)擊這里 Enumeration(枚舉)接口的作用和Iterator類(lèi)似,只提供了遍歷Vector和HashTable類(lèi)型集合元素的功能(這兩個(gè)都是線程安全的),不支持元素的移除操作。
Enumeration 速度是 Iterator 的2倍,同時(shí)占用更少的內(nèi)存。但是,Iterator 遠(yuǎn)遠(yuǎn)比 Enumeration 安全,因?yàn)槠渌€程不能夠修改正在被 iterator 遍歷的集合里面的對(duì)象。同時(shí),Iterator 允許調(diào)用者刪除底層集合里面的元素,這對(duì) Enumeration 來(lái)說(shuō)是不可能的。
synchronizedList修飾的list如下:private static List TEST_LIST = Collections.synchronizedList(new ArrayList());
synchronizedList在迭代的時(shí)候,需要開(kāi)發(fā)者自己加上線程鎖控制代碼,因?yàn)樵谡麄€(gè)迭代的過(guò)程中如果在循環(huán)外面不加同步代碼,在一次次迭代之間,其他線程對(duì)于這個(gè)容器的add或者remove會(huì)影響整個(gè)迭代的預(yù)期效果,所以這里需要用戶(hù)在整個(gè)循環(huán)外面加上synchronized(list);
對(duì)象初始化以后,才能得到其class.
19.泛型只在編譯階段起作用:泛型只在編譯階段有效
AyyayList a =new ArrayList();
ArrayList?b?=new?ArrayList();
Class?c1?=?a.getClass();
Class?c2?=?b.getClass();
System.out.println(a?==?b);//true
?所有反射的操作都是在運(yùn)行時(shí)的,既然為true,就證明了編譯之后,程序會(huì)采取去泛型化的措施,也就是說(shuō)Java中的泛型,只在編譯階段有效。在編譯過(guò)程中,正確檢驗(yàn)泛型結(jié)果后,會(huì)將泛型的相關(guān)信息擦出,并且在對(duì)象進(jìn)入和離開(kāi)方法的邊界處添加類(lèi)型檢查和類(lèi)型轉(zhuǎn)換的方法。也就是說(shuō),成功編譯過(guò)后的class文件中是不包含任何泛型信息的。兩個(gè)class一樣。泛型信息不會(huì)進(jìn)入到運(yùn)行時(shí)階段。
List <String>[] lsa =new List<String>[10];錯(cuò)誤 都不知道這是什么寫(xiě)法
List<?> [] lsa =new List<?>[10];用通配符正確
20。http://blog.csdn.net/q1406689423/article/details/60772217
?樹(shù)的概念等。深度、度、葉子節(jié)點(diǎn)、子節(jié)點(diǎn)、滿(mǎn)二叉樹(shù)、完全二叉樹(shù)
21。 點(diǎn)擊這里? 類(lèi)加載
java內(nèi)存管理 點(diǎn)擊這里?點(diǎn)擊這里?
程序計(jì)數(shù)器:
棧(Java虛擬機(jī)棧、本地方法棧)
堆
方法區(qū)(里面有常量池)
22.反射的使用:(把.class文件反射為.java文件,得到一個(gè)類(lèi),就可以獲得它的方法、屬性等)
創(chuàng)建一個(gè)對(duì)象
得到方法,并調(diào)用方法
利用反射改變一個(gè)對(duì)象的屬性值點(diǎn)擊這里?
得到一個(gè)類(lèi)的三種反射辦法:
//第一種方式:
Classc1?=?Class.forName("Employee");
//第二種方式:
//java中每個(gè)類(lèi)型都有class?屬性.
Classc2?=?Employee.class;
//第三種方式:
//java語(yǔ)言中任何一個(gè)java對(duì)象都有g(shù)etClass?方法
Employeee?=newEmployee();
Classc3?=?e.getClass();//c3是運(yùn)行時(shí)類(lèi)?(e的運(yùn)行
23. http://blog.csdn.net/ochangwen/article/details/52448553 異常和錯(cuò)誤,異常還有運(yùn)行時(shí)異常和非運(yùn)行時(shí)異常,非運(yùn)行時(shí)必須用Try-catch 否則運(yùn)行不通過(guò)。錯(cuò)誤與代碼無(wú)關(guān),與JVM有關(guān),如OutOfMemery
24 http://www.cnblogs.com/ivanfu/archive/2012/02/12/2347817.html? 靜態(tài)代碼不一定裝載類(lèi)的時(shí)候會(huì)調(diào)用,當(dāng)初始化過(guò)程為false時(shí)
25 http://blog.csdn.net/yuejingjiahong/article/details/6668265? 設(shè)置Activity背景為透明的,當(dāng)A>B (B為透明,則A就不會(huì)調(diào)用stop())
26.Java繼承不會(huì)重寫(xiě)成員變量,只會(huì)重寫(xiě)成員函數(shù)。Parent? A=Child B();
A.a//父親的
A.a()//孩子的
27. List nameList =new ArrayList<String>();//編譯通過(guò)
List <Object> nameList =new ArrayList<String>();編譯失敗
構(gòu)造器其實(shí)就是構(gòu)造對(duì)象實(shí)例的方法,無(wú)參數(shù)的構(gòu)造方法是默認(rèn)的,但是如果你創(chuàng)造了一個(gè)帶有參數(shù)的構(gòu)造方法,那么無(wú)參的構(gòu)造方法必須顯式的寫(xiě)出來(lái),否則會(huì)編譯失敗。
28.HashMap的原理? http://www.importnew.com/10620.html
HashMap有一個(gè)Table名字的數(shù)組,里面存的是Entry類(lèi)的對(duì)象,這個(gè)類(lèi)是HashMap的內(nèi)部類(lèi),是一個(gè)泛型類(lèi)<key,value>,用來(lái)存儲(chǔ)key-value對(duì)。存儲(chǔ)鍵值對(duì)的數(shù)組靠key的hasCode()方法返回hash值,根據(jù)hash值找到對(duì)應(yīng)的索引的位置。如果有兩個(gè)key相同,則計(jì)算出來(lái)的索引值一樣,這時(shí)候兩個(gè)對(duì)象還是會(huì)存一起,但它們?cè)谠撍饕奈恢靡枣湵淼男问酱鎯?chǔ)。如果重寫(xiě)key的equals()方法,當(dāng)兩個(gè)key 的equals()判斷為相等時(shí),則Put該key時(shí)后一個(gè)會(huì)覆蓋前面一個(gè),如果不相等,則就以鏈表的形式存儲(chǔ)在一起。get的時(shí)候也是這樣,如果equlas()一樣,則取出的為一個(gè)。當(dāng)key為一個(gè)對(duì)象時(shí),就要考慮其的hashcode()和equals()方法了。
EntrySet.Iterator().next()返回第一個(gè)元素的,類(lèi)型為Entry<key,value>
HashMap有一個(gè)叫做Entry的內(nèi)部類(lèi),它用來(lái)存儲(chǔ)key-value對(duì)。
上面的Entry對(duì)象是存儲(chǔ)在一個(gè)叫做table的Entry數(shù)組中。
table的索引在邏輯上叫做“桶”(bucket),它存儲(chǔ)了鏈表的第一個(gè)元素。
key的hashcode()方法用來(lái)找到Entry對(duì)象所在的桶。
如果兩個(gè)key有相同的hash值,他們會(huì)被放在table數(shù)組的同一個(gè)桶里面。
key的equals()方法用來(lái)確保key的唯一性。
value對(duì)象的equals()和hashcode()方法根本一點(diǎn)用也沒(méi)有。
29.java的安全性,效率(可以實(shí)時(shí)編譯,字節(jié)碼編譯成為本地的執(zhí)行碼):
Java 語(yǔ)言在安全性方面引入了實(shí)時(shí)內(nèi)存分配及布局來(lái)防止程序員直接修改物理內(nèi)存布局;通過(guò)字節(jié)代碼驗(yàn)證器對(duì)字節(jié)代碼的檢驗(yàn),以防止網(wǎng)絡(luò)病毒及其它非法代碼侵入。此外,Java 語(yǔ)言還采用了許多面向?qū)ο蟮?b>異常處理機(jī)制,負(fù)責(zé)對(duì)一些異常事件進(jìn)行處理,如內(nèi)存空間不夠,程序異常中止等的處理
30.Java 被設(shè)計(jì)成允許應(yīng)用程序可以運(yùn)行在任意的平臺(tái),而不需要程序員為每一個(gè)平臺(tái)單獨(dú)重寫(xiě)或者是重新編譯。Java 虛擬機(jī)讓這個(gè)變?yōu)榭赡埽驗(yàn)樗赖讓佑布脚_(tái)的指令長(zhǎng)度和其他特性。
31. new Object(){
? void show(){
???????????? System.out.println("show run");? ? ? ? ? ? ? ?
???????? }
?????? }.show();//正確
???????? //2
?????? Object obj = new Object(){
???????????? void show(){
???????????????? System.out.println("show run");
?????????? }
???????? };
?????? obj.show();//編譯錯(cuò)誤
1和2的寫(xiě)法正確嗎?有區(qū)別嗎?說(shuō)出原因。
? ? 寫(xiě)法是正確,1和2都是在通過(guò)匿名內(nèi)部類(lèi)建立一個(gè)Object類(lèi)的子類(lèi)對(duì)象。? 區(qū)別:? 第一個(gè)可是編譯通過(guò),并運(yùn)行。? 第二個(gè)編譯失敗,因?yàn)槟涿麅?nèi)部類(lèi)是一個(gè)子類(lèi)對(duì)象,當(dāng)用Object的obj引用指向時(shí),就被提升為了Object類(lèi)型,而編譯時(shí)檢查Object類(lèi)中是否有show方法,所以編譯失敗。
32.內(nèi)部類(lèi)當(dāng)一個(gè)類(lèi)是在一個(gè)函數(shù)中被定義時(shí),定義在方法中,比方法的范圍還小。是內(nèi)部類(lèi)中最少用到的一種類(lèi)型。像局部變量一樣,不能被public, protected, private和static修飾。只能訪問(wèn)方法中定義的final類(lèi)型的局部變量。方法內(nèi)部類(lèi)在方法中定義,所以只能在方法中使用,即只能在方法當(dāng)中生成方法內(nèi)部類(lèi)的實(shí)例并且調(diào)用其方法
33.對(duì)于繼承來(lái)說(shuō),如果某一方法在父類(lèi)中是訪問(wèn)權(quán)限是 priavte,那么就不能在子類(lèi)對(duì)其進(jìn)行重載,如果定義的話,也只是定義了一個(gè)新方法,而不會(huì)達(dá)到重載的效
34.接口的方法默認(rèn)是 public abstract;
接口中不可以定義變量即只能定義常量(加上final修飾就會(huì)變成常量)。所以接口的屬性默認(rèn)是 public static final常量,且必須賦初值。
注意:final 和 abstract 不能同時(shí)出現(xiàn)
35.子類(lèi)沒(méi)有顯示調(diào)用父類(lèi)構(gòu)造函數(shù),不管子類(lèi)構(gòu)造函數(shù)是否帶參數(shù)都默認(rèn)調(diào)用父類(lèi)無(wú)參的構(gòu)造函數(shù),若父類(lèi)沒(méi)有則編譯出錯(cuò)。
35.靜態(tài)內(nèi)部類(lèi)里面的成員變量必須是static的,但方法可以不是的,靜態(tài)方法不可以使用該類(lèi)的內(nèi)部類(lèi),只能使用靜態(tài)方法和靜態(tài)成員、靜態(tài)內(nèi)部類(lèi)。
36.https:
1)客戶(hù)端發(fā)出加密請(qǐng)求
2)服務(wù)器端用CA的私鑰加密自己的公鑰(還有一些信息,如時(shí)間等等)發(fā)送給客戶(hù)端(數(shù)字證書(shū))
3) 客戶(hù)端檢查證書(shū)是否可信任(),用CA的公鑰進(jìn)行解密得到服務(wù)器端的公鑰
這部分工作是有客戶(hù)端的TLS來(lái)完成的,首先會(huì)驗(yàn)證公鑰是否有效,比如頒發(fā)機(jī)構(gòu),過(guò)期時(shí)間等等,如果發(fā)現(xiàn)異常,則會(huì)彈出一個(gè)警告框,提示證書(shū)存在問(wèn)題。如果證書(shū)沒(méi)有問(wèn)題,那么就生成一個(gè)隨即值。
4)用該公鑰隨機(jī)生成一個(gè)對(duì)稱(chēng)密鑰(會(huì)話密鑰),然后用公鑰機(jī)加密該密鑰,發(fā)送給服務(wù)器端
5)服務(wù)器端得到該消息,用私鑰解密得到通信的會(huì)話密鑰
6)以后通信都用該會(huì)話密鑰加密
37.進(jìn)程通信拷貝次數(shù)
消息隊(duì)列和管道基本上都是4次拷貝,而共享內(nèi)存(mmap, shmget)只有兩次。
4次:1,由用戶(hù)空間的buf中將數(shù)據(jù)拷貝到內(nèi)核中。2,內(nèi)核將數(shù)據(jù)拷貝到內(nèi)存中。3,內(nèi)存到內(nèi)核。4,內(nèi)核到用戶(hù)空間的buf.
2次: 1,用戶(hù)空間到內(nèi)存。 2,內(nèi)存到用戶(hù)空間。
消息隊(duì)列和管道都是內(nèi)核對(duì)象,所執(zhí)行的操作也都是系統(tǒng)調(diào)用,而這些數(shù)據(jù)最終是要存儲(chǔ)在內(nèi)存中執(zhí)行的。因此不可避免的要經(jīng)過(guò)4次數(shù)據(jù)的拷貝。但是共享內(nèi)存不同,當(dāng)執(zhí)行mmap或者shmget時(shí),會(huì)在內(nèi)存中開(kāi)辟空間,然后再將這塊空間映射到用戶(hù)進(jìn)程的虛擬地址空間中,即返回值為一個(gè)指向一個(gè)內(nèi)存地址的指針。當(dāng)用戶(hù)使用這個(gè)指針時(shí),例如賦值操作,會(huì)引起一個(gè)從虛擬地址到物理地址的轉(zhuǎn)化,會(huì)將數(shù)據(jù)直接寫(xiě)入對(duì)應(yīng)的物理內(nèi)存中,省去了拷貝到內(nèi)核中的過(guò)程。當(dāng)讀取數(shù)據(jù)時(shí),也是類(lèi)似的過(guò)程,因此總共有兩次數(shù)據(jù)拷貝。
Binder:
IPC 中最基本的問(wèn)題在于進(jìn)程間使用的虛擬地址空間是相互獨(dú)立的,不能直接訪問(wèn),所以要相互訪問(wèn),就要借助 kernel ,就是要讓數(shù)據(jù)用用戶(hù)空間進(jìn)入到內(nèi)核空間,然后再去到另一個(gè)進(jìn)程的用戶(hù)空間。傳統(tǒng)的 IPC 是這樣的,其實(shí) binder 也是這樣的,不過(guò)它把內(nèi)核空間的地址和用戶(hù)空間的虛擬地址映射到了同一段物理地址上,所以就只需要把數(shù)據(jù)從原始用戶(hù)空間復(fù)制到內(nèi)核空間,把目標(biāo)進(jìn)程用戶(hù)空間和內(nèi)核空間映射到同一段物理地址,這樣第一次復(fù)制到內(nèi)核空間,其實(shí)目標(biāo)的用戶(hù)空間上也有這段數(shù)據(jù)了。這就是 binder 比傳統(tǒng) IPC 高效的一個(gè)原因。
38.RelativeLayout比LinearLayout效率低的原理
https://www.cnblogs.com/qitian1/p/6461473.html