1. JDK和JRE有什么區(qū)別叠蝇?
JRE:JRE是Java Runtime Environment的縮寫蜕该,顧名思義是java運行時環(huán)境绢淀,包含了java虛擬機费薄,java基礎類庫召廷。是使用java語言編寫的程序運行所需要的軟件環(huán)境,是提供給想運行java程序的用戶使用的泡孩,還有所有的Java類庫的class文件,都在lib目錄下,并且都打包成了jar。
至于在Windows上的虛擬機是哪個文件呢县遣?就是<JRE安裝目錄>/bin/client中的jvm.dll夸政。
JDK:Jdk是Java Development Kit的縮寫朋譬,顧名思義是java開發(fā)工具包狡赐,是程序員使用java語言編寫java程序所需的開發(fā)工具包搀擂,是提供給程序員使用的威恼。JDK包含了JRE,同時還包含了編譯java源碼的編譯器javac附迷,還包含了很多java程序調(diào)試和分析的工具:jconsole捻悯,jvisualvm等工具軟件,還包含了java程序編寫所需的文檔和demo例子程序妥衣。
如果你需要運行java程序熙暴,只需安裝JRE就可以了狞谱。如果你需要編寫java程序叭莫,需要安裝JDK辩蛋。
2.==和equals的區(qū)別是什么颖医?
==:
對于基本類型和引用類型==的作用效果是不同的感昼,如下所示:
- 基本類型:比較的是值是否相同层玲;
- 引用類型:比較的是引用是否相同憨愉。所以植袍,除非是同一個new出來的對象贷笛,他們的比較后的結果為true掀淘,否則比較后結果為false首尼。 JAVA當中所有的類都是繼承于Object這個基類的范舀,在Object中的基類中定義了一個equals的方法蛾茉,這個方法的初始行為是比較對象的內(nèi)存地 址,但在一些類庫當中這個方法被覆蓋掉了疾党,如String,Integer,Date在這些類當中equals有其自身的實現(xiàn),而不再是比較類在堆內(nèi)存中的存放地址了。
String x = "string";
String y = "string";
String z = new String("string");
System.out.println(x==y); // true
System.out.println(x==z); // false
System.out.println(x.equals(y)); // true
System.out.println(x.equals(z)); // true
代碼解讀:程序在運行的時候會創(chuàng)建一個字符串緩沖池永脓,當使用y=”string"這樣的表達式創(chuàng)建字符串的時候似芝,程序首先會在這個String緩沖池中尋找相同值的對象寞奸,由于x先被放到了緩沖池中,所以在y被創(chuàng)建的時候聚凹,程序找到了具有相同值的x,將x的引用交給了y旗们。而z使用的new操作符漓库,它告訴程序我需要一個新的茂装,于是創(chuàng)建了一個新對象到內(nèi)存中怠蹂。
修改下程序:
String x = "string";
String z = new String("string");
z=z.intern();
System.out.println(x==z); //true
System.out.println(x.equals(z)); // true
java.lang.String的intern()方法"string".intern()方法的返回值還是字符串"string",表面上看起來好像這個方 法沒什么用處少态。但實際上城侧,它做了個小動作:檢查字符串池里是否存在"string"這么一個字符串,如果存在彼妻,就返回池里的字符串嫌佑;如果不存在,該方法會 把"string"添加到字符串池中侨歉,然后再返回它的引用歧强。
equals:
equals 本質(zhì)上就是 ==,只不過 String 和 Integer 等重寫了 equals 方法为肮,把它變成了值比較摊册。
總結 :== 對于基本類型來說是值比較,對于引用類型來說是比較的是引用颊艳;而 equals 默認情況下是引用比較茅特,只是很多類重寫了 equals 方法,比如 String棋枕、Integer 等把它變成了值比較白修,所以一般情況下 equals 比較的是值是否相等。
3.兩個對象的hashCode()相同重斑,則equals()也一定為 true兵睛,對嗎?
不對窥浪。
String str1 = "通話";
String str2 = "重地";
System.out.println(String.format("str1:%d | str2:%d", str1.hashCode(),str2.hashCode()));
System.out.println(str1.equals(str2));
執(zhí)行結果:
str1:1179395 | str2:1179395
false
JDK中關于hashCode的規(guī)定:
hashCode
public int hashCode()返回該對象的哈希碼值祖很。支持此方法是為了提高哈希表(例如 Java.util.Hashtable 提供的哈希表)的性能。
hashCode 的常規(guī)協(xié)定是:
在 Java 應用程序執(zhí)行期間漾脂,在對同一對象多次調(diào)用 hashCode 方法時假颇,必須一致地返回相同的整數(shù),前提是將對象進行 equals 比較時所用的信息沒有被修改骨稿。從某一應用程序的一次執(zhí)行到同一應用程序的另一次執(zhí)行笨鸡,該整數(shù)無需保持一致。
如果根據(jù) equals(Object) 方法坦冠,兩個對象是相等的形耗,那么對這兩個對象中的每個對象調(diào)用 hashCode 方法都必須生成相同的整數(shù)結果。
如果根據(jù) equals(java.lang.Object) 方法辙浑,兩個對象不相等激涤,那么對這兩個對象中的任一對象上調(diào)用 hashCode 方法不 要求一定生成不同的整數(shù)結果。但是例衍,程序員應該意識到昔期,為不相等的對象生成不同整數(shù)結果可以提高哈希表的性能已卸。
實際上,由 Object 類定義的 hashCode 方法確實會針對不同的對象返回不同的整數(shù)硼一。(這一般是通過將該對象的內(nèi)部地址轉(zhuǎn)換成一個整數(shù)來實現(xiàn)的累澡,但是 JavaTM 編程語言不需要這種實現(xiàn)技巧。)
JDK規(guī)定當你調(diào)用equals方法比較兩個對象相等時般贼,他們調(diào)用hashcode方法時愧哟,都應該返回相同的整數(shù)值,也就是hashcode相等哼蛆。記住蕊梧,是應該相同。為什么應該腮介?下面這段紅色字體說了肥矢,必須重寫hashcode方法維護協(xié)定!如果你不重寫叠洗,那么就不能保證hashcode返回相同結果甘改。
換句話說:重寫equals方法時請必須重寫hashcode方法,以保證equals方法相等時兩個對象hashcode返回相同的值灭抑。如果沒有重寫hashcode方法的話十艾,hashcode的值就不一定相等了。
4.final在java中有什么作用腾节?
- final修飾的類叫最終類忘嫉,該類不能被繼承。
- final修飾的方法不能被重寫案腺。
- final修飾的變量叫常量庆冕,常量必須初始化,初始化之后值就不能被修改救湖。
final的一些重點知識:
1.final成員變量必須在聲明的時候初始化或者在構造器中初始化愧杯,否則就會報編譯錯誤。
2.不能夠?qū)inal變量再次賦值鞋既。
3.在匿名類中所有變量都必須是final變量。
4.final和abstract這兩個關鍵字是反相關的耍铜,final類就不可能是abstract的邑闺。
5.final方法在編譯階段綁定,稱為靜態(tài)綁定棕兼。
6.對于集合對象聲明為final指定是引用不能被更改陡舅,但是你可以向其中增加,刪除或者修改內(nèi)容伴挚。
5.java 中的 Math.round(-1.5) 等于多少靶衍?
等于 -1灾炭,因為在數(shù)軸上取值時,中間值(0.5)向右取整颅眶,所以正 0.5 是往上取整蜈出,負 0.5 是直接舍棄。
Math類的幾個常見方法:
- ceil():返回大于等于(>=)給定參數(shù)的最小整數(shù)涛酗。
- floor():返回小于等于(<=)給定參數(shù)的最大整數(shù)铡原。
- rint():返回與參數(shù)最接近的整數(shù)。返回類型為double商叹。
- round():6它表示四舍五入燕刻,算法為Math.floor(x+0.5),即將原來的數(shù)字加上0.5后再向下取整剖笙。
6.String 屬于基礎的數(shù)據(jù)類型嗎卵洗?
Strng不屬于基礎類型,基礎類型有8種:byte弥咪,boolean忌怎,char,short酪夷,int榴啸,float,long晚岭,double鸥印。String屬于對象。
7.java 中操作字符串都有哪些類坦报?它們之間有什么區(qū)別库说?
操作字符串的類有:String、StringBuffer片择、StringBuilder潜的。
String 和 StringBuffer、StringBuilder 的區(qū)別在于 String 聲明的是不可變的對象字管,每次操作都會生成新的 String 對象啰挪,然后將指針指向新的 String 對象,而 StringBuffer嘲叔、StringBuilder 可以在原有對象的基礎上進行操作亡呵,所以在經(jīng)常改變字符串內(nèi)容的情況下最好不要使用 String。
StringBuffer 和 StringBuilder 最大的區(qū)別在于硫戈,StringBuffer 是線程安全的锰什,而 StringBuilder 是非線程安全的,但 StringBuilder 的性能卻高于 StringBuffer,所以在單線程環(huán)境下推薦使用 StringBuilder汁胆,多線程環(huán)境下推薦使用 StringBuffer梭姓。
8.String str="i"與 String str=new String("i")一樣嗎?
不一樣嫩码,因為內(nèi)存的分配方式不一樣誉尖。String str="i"的方式,java 虛擬機會將其分配到常量池中谢谦;而 String str=new String("i") 則會被分到堆內(nèi)存中释牺。
9.接口和抽象類有什么區(qū)別?
- 接口能夠多實現(xiàn)回挽,而抽象類只能單獨被繼承没咙,其本質(zhì)就是,一個類能繼承多個接口千劈,而只能繼承一個抽象類祭刚。
- 方法上,抽象類的方法可以用abstract和public或者protect修飾墙牌。而接口默認為public abstract修飾涡驮。
- 抽象類的方法可以有需要子類實現(xiàn)的抽象方法,也可以有具體的方法喜滨。而接口在老版本的jdk中捉捅,只能有抽象方法,但是Java8版本的接口中虽风,接口可以帶有默認方法棒口。
- 屬性上,抽象類可以用各種各樣的修飾符修飾辜膝。而接口的屬性是默認的public static final无牵。
- 抽象類中可以含有靜態(tài)代碼塊和靜態(tài)方法,而接口不能含有靜態(tài)方法和靜態(tài)代碼塊厂抖。
- 抽象類可以含有構造方法茎毁,接口不能含有構造方法。
10.面向?qū)ο蟮奶卣鳎?/h2>
- 封裝
- 抽象
- 繼承
- 多態(tài)
11.int 和 Integer 有什么區(qū)別忱辅?
Integer是int的包裝類七蜘,int的初值為0,Integer的初值為null耕蝉。
int i = 128;
Integer i2 = 128;
Integer i3 = new Integer(128);
//Integer會自動拆箱為int崔梗,所以為true
System.out.println(i == i2);
System.out.println(i == i3);
System.out.println("**************");
Integer i5 = 127;//java在編譯的時候,被翻譯成-> Integer i5 = Integer.valueOf(127);
Integer i6 = 127;
System.out.println(i5 == i6);//true
/*Integer i5 = 128;
Integer i6 = 128;
System.out.println(i5 == i6);//false
*/ Integer ii5 = new Integer(127);
System.out.println(i5 == ii5); //false
Integer i7 = new Integer(128);
Integer i8 = new Integer(123);
System.out.println(i7 == i8); //false
首先,i和i2垒在,i3比較都會輸出true,這是因為Integer和int比都會自動拆箱。
i5和i6第一次比較輸出的是true场躯,而第二次輸出的就是false谈为,這是為什么呢?在java編譯的時候踢关,Integer i5=127會被翻譯為Integer.valueOf(127)伞鲫。以下是valueOf方法的源碼:
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
private static class IntegerCache {
static final int low = -128;
static final int high;
static final Integer cache[];
static {
// high value may be configured by property
int h = 127;
String integerCacheHighPropValue =
sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
if (integerCacheHighPropValue != null) {
try {
int i = parseInt(integerCacheHighPropValue);
i = Math.max(i, 127);
// Maximum array size is Integer.MAX_VALUE
h = Math.min(i, Integer.MAX_VALUE - (-low) -1);
} catch( NumberFormatException nfe) {
// If the property cannot be parsed into an int, ignore it.
}
}
high = h;
cache = new Integer[(high - low) + 1];
int j = low;
for(int k = 0; k < cache.length; k++)
cache[k] = new Integer(j++);
// range [-128, 127] must be interned (JLS7 5.1.7)
assert IntegerCache.high >= 127;
}
private IntegerCache() {}
}
從源代碼可以看出-128到127之間的值,會直接返回緩存中對應的值签舞,并不會new秕脓,所以第二次比較為false。
總結:
- 無論如何儒搭,Integer和new Integer都不會相等吠架。不會經(jīng)歷拆箱過程,類似i2和i3搂鲫,i5和ii5的比較傍药。
- 如果兩個都是非new出來的Integer,如果數(shù)在-128到127之間魂仍,則為true拐辽,否則為false。
- int和Integer(無論是通過什么創(chuàng)建)擦酌,都為true俱诸,因為會把Integer自動拆箱為int再去比。
12.重載和重寫的區(qū)別?
重載是編譯時的多態(tài)性赊舶,重寫是運行時的多態(tài)性睁搭。對于重載而言,是發(fā)生在一個類中锯岖,同名的方法如果有不同的參數(shù)列表(類型介袜,數(shù)量)則視為重載;重寫發(fā)生在子類和父類之間出吹,重寫要求子類與父類被重寫方法有相同的參數(shù)列表遇伞,兼容的返回類型,比父類方法更好訪問捶牢,不能比父類聲明更多的異常鸠珠。重載對返回類型沒有特殊的要求,不能根據(jù)返回類型進行區(qū)分秋麸。
13.session 與 cookie 區(qū)別渐排?
- session是保存在服務器端,理論上是沒有大小限制灸蟆,只要內(nèi)存夠大驯耻。
- 瀏覽器第一次訪問服務器的時候后創(chuàng)建一個session對象并返回一個JSESSIONID=ID的值,創(chuàng)建一個Cookie對象key為JISSIONID,value為ID的值是可缚,將這個Cookie協(xié)會瀏覽器霎迫。
- 瀏覽器在第二次訪問服務器的時候攜帶Cooike信息JSESSIONID=ID的值,如果該JESSIONID的session已經(jīng)銷毀帘靡,那么會重新創(chuàng)建一個新的session再返回一個新的JSESSIONID通過Cookie返回到瀏覽器知给。
- 針對一個web項目,一個瀏覽器是共享一個session描姚,就算有兩個web項目部署在同一個服務器上涩赢,針對兩個項目的session是不同的。
- session是基于Cookie技術實現(xiàn)轩勘,重啟瀏覽器后再次訪問原有的連接依然會創(chuàng)建一個新的session筒扒,因為Cookie在關閉瀏覽器后就會消失,但是原來服務器的Session還在赃阀,只有等到了銷毀的時間會自動銷毀霎肯。
- 如果瀏覽器端禁用了Cookie,那么每次訪問都會創(chuàng)建一個新的Session榛斯,但是我們可以通過服務器端程序重寫URL即可观游,如果頁面多連接多,會增加不必要的工作量驮俗,
那可以強制讓你用戶開啟接收Cookie后再讓其訪問即可懂缕。
說說Cookie和Session的區(qū)別?
1王凑、Cookie和Session都是會話技術搪柑,Cookie是運行在客戶端,Session是運行在服務器端索烹。
2工碾、Cookie有大小限制以及瀏覽器在存cookie的個數(shù)也有限制,Session是沒有大小限制和服務器的內(nèi)存大小有關百姓。
3渊额、Cookie有安全隱患,通過攔截或本地文件找得到你的cookie后可以進行攻擊垒拢。
4旬迹、Session是保存在服務器端上會存在一段時間才會消失,如果session過多會增加服務器的壓力求类。
14.HTTP 請求的 GET 與 POST 方式的區(qū)別奔垦?
- GET在瀏覽器回退時是無害的,而POST會再次提交請求尸疆。
- GET產(chǎn)生的URL地址可以被Bookmark椿猎,而POST不可以惶岭。
- GET請求會被瀏覽器主動cache,而POST不會鸵贬,除非手動設置俗他。
- GET請求只能進行url編碼脖捻,而POST支持多種編碼方式阔逼。
- GET請求參數(shù)會被完整保留在瀏覽器歷史記錄里,而POST中的參數(shù)不會被保留地沮。
- GET請求在URL中傳送的參數(shù)是有長度限制的嗜浮,而POST么有。
- 對參數(shù)的數(shù)據(jù)類型摩疑,GET只接受ASCII字符危融,而POST沒有限制。
- GET比POST更不安全雷袋,因為參數(shù)直接暴露在URL上吉殃,所以不能用來傳遞敏感信息。
- GET參數(shù)通過URL傳遞楷怒,POST放在Request body中蛋勺。
GET和POST是什么?HTTP協(xié)議中的兩種發(fā)送請求的方法鸠删。
HTTP是什么抱完?HTTP是基于TCP/IP的關于數(shù)據(jù)如何在萬維網(wǎng)中如何通信的協(xié)議。
HTTP的底層是TCP/IP刃泡。所以GET和POST的底層也是TCP/IP巧娱,也就是說,GET/POST都是TCP鏈接烘贴。GET和POST能做的事情是一樣一樣的禁添。你要給GET加上request body,給POST帶上url參數(shù)桨踪,技術上是完全行的通的老翘。
GET和POST還有一個重大區(qū)別,簡單的說:
GET產(chǎn)生一個TCP數(shù)據(jù)包馒闷;POST產(chǎn)生兩個TCP數(shù)據(jù)包酪捡。
對于GET方式的請求,瀏覽器會把http header和data一并發(fā)送出去纳账,服務器響應200(返回數(shù)據(jù))逛薇;
而對于POST,瀏覽器先發(fā)送header疏虫,服務器響應100 continue永罚,瀏覽器再發(fā)送data啤呼,服務器響應200 ok(返回數(shù)據(jù))。
也就是說呢袱,GET只需要汽車跑一趟就把貨送到了官扣,而POST得跑兩趟,第一趟羞福,先去和服務器打個招呼“嗨惕蹄,我等下要送一批貨來,你們打開門迎接我”治专,然后再回頭把貨送過去卖陵。
因為POST需要兩步,時間上消耗的要多一點张峰,看起來GET比POST更有效泪蔫。因此Yahoo團隊有推薦用GET替換POST來優(yōu)化網(wǎng)站性能。但這是一個坑喘批!跳入需謹慎撩荣。為什么?
- GET與POST都有自己的語義饶深,不能隨便混用餐曹。
- 據(jù)研究,在網(wǎng)絡環(huán)境好的情況下粥喜,發(fā)一次包的時間和發(fā)兩次包的時間差別基本可以無視凸主。而在網(wǎng)絡環(huán)境差的情況下,兩次包的TCP在驗證數(shù)據(jù)包完整性上额湘,有非常大的優(yōu)點卿吐。
- 并不是所有瀏覽器都會在POST中發(fā)送兩次包,F(xiàn)irefox就只發(fā)送一次锋华。
15.Anonymous Inner Class(匿名內(nèi)部類)是否可以繼承其他類嗡官,是否可以實現(xiàn)接口?
匿名內(nèi)部類是沒有名字的內(nèi)部類毯焕,不能繼承其他類衍腥,但一個內(nèi)部類可以作為一個接口,由另一個內(nèi)部類實現(xiàn)纳猫。
16.Collection和Collections的區(qū)別婆咸?
Collection是集合類的接口,繼承該接口的主要有Set和List芜辕。
Collections是針對集合類的一個幫助類尚骄,他提供一系列靜態(tài)方法實現(xiàn)對各種集合的搜索,排序侵续,線程安全化等操作倔丈。
17. += 和 = +的區(qū)別憨闰?
+=是復合賦值操作符,= +是簡單賦值操作符需五。復合賦值表達式可以自動將所執(zhí)行計算的結果I轉(zhuǎn)型為其左側變量的類型鹉动。如果左側變量比右側變量要窄,復合賦值操作符會自動進行類型轉(zhuǎn)換宏邮,而簡單賦值操作符需要強制類型轉(zhuǎn)換泽示。
18.jdk1.8和jdk1.7下的ConcurrentHashMap
jdk1.7
- 將數(shù)據(jù)分為一段一段的存儲,然后給每一段數(shù)據(jù)配一把鎖蜀铲,當一個線程占用鎖訪問其中一個段數(shù)據(jù)時边琉,其他段的數(shù)據(jù)也能被其他線程訪問。
- 由Segment數(shù)組結構和HashEntry數(shù)組結構組成记劝。
- 一個ConcurrentHashMap里包含一個Segment數(shù)組。Segment的結構和HashMap類似族扰,是一種數(shù)組和鏈表結構厌丑,一個Segment包含一個HashEntry數(shù)組,每個HashEntry是一個鏈表結構的元素渔呵,每個Segment守護著一個HashEntry數(shù)組里的元素,當對HashEntry數(shù)組的數(shù)據(jù)進行修改時,必須首先獲得對應的Segment的鎖践瓷。
jdk1.8
- 采用CAS和synchronized來保證并發(fā)安全
- 數(shù)據(jù)結構是:數(shù)組+鏈表/紅黑二叉樹
- synchronized只鎖定當前鏈表或紅黑二叉樹的首節(jié)點炸卑。
19.Java對象的實例化順序?
- 父類的靜態(tài)成員變量和靜態(tài)代碼塊
- 子類的靜態(tài)成員變量和靜態(tài)代碼塊
- 父類成員變量和方法塊加載
- 父類構造函數(shù)加載
- 子類成員變量和方法塊加載
- 子類的構造函數(shù)加載
20.不用final還可以用什么辦法使得這個類不被繼承录豺?
構造函數(shù)私有化朦肘。
21.Exception與error的差別?
都繼承于Throwable双饥。
Error類一般指與虛擬機相關的問題媒抠,如系統(tǒng)崩潰、虛擬機錯誤咏花、內(nèi)存空間不足趴生、方法調(diào)用棧溢等。對于這類錯誤的導致的應用程序中斷昏翰,僅靠程序本身無法恢復和預防苍匆,遇到這樣的錯誤,建議讓程序終止棚菊。
Exception類表示程序可以處理的異常浸踩,可以捕獲且可能恢復。遇到這類異常窍株,應該盡可能處理異常民轴,使程序恢復運行攻柠,而不應該隨意終止異常。
Exception類又分為運行時異常(Runtime Exception)和受檢查的異常(Checked Exception )后裸,運行時異常;ArithmaticException,IllegalArgumentException瑰钮,編譯能通過,但是一運行就終止了微驶,程序不會處理運行時異常浪谴,出現(xiàn)這類異常,程序會終止因苹。而受檢查的異常苟耻,要么用try。扶檐。凶杖。catch捕獲,要么用throws字句聲明拋出款筑,交給它的父類處理智蝠,否則編譯不會通過。
22.string的最大長度奈梳?
編譯時65535杈湾,運行時Integer.MAX_VALUE。(與堆內(nèi)存大小有關)
23.lambad表達式和匿名類的區(qū)別攘须?
- 匿名類的this關鍵字指向匿名類漆撞,而lambda表達式的this關鍵字指向包圍lambda表達式的類。
- Java編譯器將lambda編譯成類的私有方法于宙。
24.什么是函數(shù)式接口(@FunctionInterface)浮驳?
函數(shù)式接口就是一個有且僅有一個抽象方法,但是可以有多個非抽象方法的接口限煞。
25. static方法能不能被重寫抹恳?
不能。重寫是運行時多態(tài)署驻,而static方法是在編譯期綁定的奋献,不存在多態(tài)。靜態(tài)方法從程序開始運行后就已經(jīng)分配了內(nèi)存旺上,所有引用到該方法的對象所指向的都是同一塊內(nèi)存中的數(shù)據(jù)瓶蚂,也就是該靜態(tài)方法。子類中如果定義了相同名稱的靜態(tài)方法宣吱,并不會重寫窃这,而應該是在內(nèi)存中又分配了一塊給子類的靜態(tài)方法。
26.多態(tài)
事物在運行過程中存在不同的狀態(tài)征候。
27.為什么內(nèi)部類實現(xiàn)的單例模式是線程安全的杭攻?
當?shù)谝淮渭虞dSingleton類時并不會初始化instance祟敛,只有在第一次調(diào)用getInstance方法時才會導致instance被初始化。
虛擬機會保證一個類的構造器<client>()方法在多線程環(huán)境中被正確的加載兆解,同步馆铁,如果多個線程同時去初始化一個類,那么只有一個線程去執(zhí)行這個類的構造器<client>()方法锅睛,其他線程都需要阻塞等待埠巨,直到活動線程執(zhí)行<client>()方法完畢。
29.BIO NIO AIO
29.1 BIO
同步阻塞I/O模式现拒,數(shù)據(jù)的讀取寫入阻塞在一個線程內(nèi)等待完成辣垒。
Java中由一個獨立的Acceptor線程負責監(jiān)聽客戶端的連接。通過在while循環(huán)調(diào)用accept()方法等待客戶端連接印蔬,請求一旦接收到一個連接請求勋桶,就通過線程池進行連接處理。
29.2 NIO
同步非阻塞I/O扛点,通過多路復用器不斷輪詢各個連接的狀態(tài)哥遮,當有讀或?qū)憰r,才會處理它陵究。
29.3 AIO
異步非阻塞I/O,在相應的狀態(tài)發(fā)生改變時奥帘,會通知對應的線程來處理铜邮。
30. 序列化
序列化就是將對象的狀態(tài)(各個屬性量)保存起來,以便存儲在文件中或在網(wǎng)絡上傳輸寨蹋。
31. transient關鍵字的作用松蒜?
讓成員變量不被初始化。