區別主要答兩點:java
條件操做只能操做
布爾型
的,而邏輯操做不只能夠操做布爾型
,並且能夠操做數值型
;c++邏輯操做不會產生
短路
,而條件操做符會產生短路,短路是指當進行條件操做符運算時,前面條件若是肯定了條件表達式值的話,就不在進行後面條件的判斷
。程序員
位邏輯運算
一般是針對兩個數而言,執行位操做; 條件邏輯運算
是針對兩個條件表達式而言,執行條件操做;算法
其實,位邏輯操做符同樣能夠實現條件操做
,可是此時有一個重要的區別: 用位操做符時,無論操做符兩邊的條件表達式成不成立,它都要統統進行運算判斷,而條件邏輯操做符不同了,若是經過左側的操做數就能夠 進行它們須要的判斷,那麼它就不會再計算右側的操做數了,這種狀況叫短路
。編程
若是一個
類被聲明爲final
,意味着它不能再派生出新的子類,不能做爲父類被繼承。所以一個類既不能被聲明爲 abstract的,又被聲明爲final的。數組將
變量或方法聲明爲final
,能夠保證它們在使用中不被改變。被聲明爲final的變量必須在聲明時給定初值,而在之後的引用中只能讀取,不可修改。被聲明爲final的方法也一樣只能使用,不能重載。安全
finally塊
:在異常處理時提供 finally 塊來執行任何清除操做。若是拋出一個異常,那麼相匹配的 catch 子句就會執行,而後無論是否會發生異常
控制都會進入 finally 塊(若是有的話)。網絡
finalize 方法名
:Java 技術容許使用 finalize() 方法在垃圾收集器將對象從內存中清除出去以前作必要的清理工做
。這個方法是由垃圾收集器在肯定這個對象沒有被引用而清理時對這個對象調用的。它是在 Object 類中定義的,所以全部的類都繼承了它。子類覆蓋finalize() 方法以整理系統資源或者執行其餘清理工做。finalize() 方法是在垃圾收集器刪除對象以前對這個對象調用的
。僅能會被JVM執行一次
。數據結構
匿名內部類是指沒有名字的內部類,其自己就是經過繼承類或者接口來實現的。可是不能再顯式的extends 或者implements了。框架
Nested Class (通常是C++的說法),Inner Class (通常是JAVA的說法)。
Java Nested Class 分爲兩大類:
- Static Nested Class;
- Non-static Nested Class。
Non-Static Nested Class 纔是真正的Inner Class。
Static Nested Class是被聲明爲靜態內部類,它能夠不依賴於外部類實例而被實例化。而一般的內部類須要在外部類實例化後才能實例化。
靜態內部類(Inner Class)
:1. 建立一個static內部類的對象,不須要一個外部類對象;2. 不能從一個static內部類的一個對象訪問一個外部類對象。
內部類
:1. 建立一個內部類的對象,必須須要一個外部類對象;
HashMap是Hashtable的輕量級實現(非線程安全的實現),它們都實現了Map接口
,主要區別在於HashMap容許空(null)鍵值
,因爲非線程安全,效率上可能高於Hashtable。HashMap容許將null做爲一個entry的key或者value,而Hashtable不容許
。
HashMap把Hashtable的contains方法
去掉了,改爲了containsvalue和containskey
。由於contains方法容易讓人引發誤解。
Hashtable繼承自Dictionary類
,而HashMap是Java1.2引進的Map interface的一個實現。最大的不一樣是,Hashtable的方法是Synchronize的
,而HashMap不是,在多個線程訪問Hashtable時,不須要本身爲它的方法實現同步,而HashMap就必須爲之提供外同步(若是是ArrayList:List lst = Collections.synchronizedList(new ArrayList());若是是HashMap:Map map = Collections.synchronizedMap(new HashMap());)
。
Hashtable和HashMap採用的hash/rehash算法
大概都同樣,因此性能不會有很大的差別。
Collection是
集合類的父接口
,繼承與它的接口主要有Set和List。Collections是針對
集合類的一個幫助類
,它提供一系列靜態方法實現對各類集合的搜索,排序,線程安全化等操做。
GC 是垃圾收集的意思(Gabage Collection),內存處理是編程人員容易出現問題的地方,忘記或者錯誤的內存回收會致使程序或系統的不穩定甚至崩潰,Java提供的GC功能能夠自動的監測對象是否超過做用域從而達到自動回收內存的目的,Java語言沒有提供釋放以分配內存的顯示操做方法。
兩個對象,一個是「xyz」,另外一個是s;
short s1 = 1; s1 = s1 + 1;有錯,s1是short型,s1+1是int型,不能顯式轉化爲short型
。可修改成s1 =(short)(s1 + 1) 。short s1 = 1; s1 += 1正確。
sleep是線程類(Thread)的方法
,致使此線程暫停執行指定時間,到時間後會自動恢復,調用sleep不會釋放對象鎖
。
wait是Object類的方法
,對此對象調用wait方法致使本線程釋放對象鎖
,進入等待此對象的等待鎖定池,只有針對此對象調用notify方法或notifyAll方法後
,本線程才進入對象鎖定池準備得到對象鎖進入運行狀態。
方法的重寫Overriding和重載Overloading是Java多態性的不一樣表現
。
重寫Overriding是父類與子類之間多態性
的一種表現,重載Overloading是一個類中多態性
的一種表現。若是在子類中定義某方法與其父類有相同的名稱和參數,咱們說該方法被重寫 (Overriding)。子類的對象使用這個方法時,將調用子類中的定義,對它而言,父類中的定義如同被"屏蔽"了。若是在一個類中定義了多個同名的方 法,它們或有不一樣的參數個數或有不一樣的參數類型,則稱爲方法的重載(Overloading)。Overloaded的方法是能夠改變返回值的類型。
Set裏的元素是不能重複的。equals()是判讀兩個Set是否相等。 equals()和==方法決定引用值是否指向同一對象。equals()在類中被覆蓋,爲的是當兩個分離的對象的內容和類型相配的話,返回真值。
error 表示恢復不是不可能但很困難的狀況下的一種嚴重問題。好比說內存溢出。不可能期望程序能處理這樣的狀況。
exception 表示一種程序設計或實現問題。也就是說,它表示若是程序運行正常,從不會發生的狀況。
List,Set是。Map不是 。
聲明方法的存在而不去實現它的類被叫作抽象類(abstract class)
,它用於要建立一個體現某些基本行爲
的類,併爲該類聲明方法,但不能在該類中實現該類的狀況。不能建立abstract類的實例
。然而能夠建立一個變量,其類型是一個抽象類,並讓它指向具體子類的一個實例。不能有抽象構造函數或抽象靜態方法
。Abstract 類的子類爲它們父類中的全部抽象方法提供實現,不然它們也是抽象類。取而代之,在子類中實現該方法。知道其行爲的其它類能夠在類中實現這些方法。
接口(interface)是抽象類的變體
。在接口中,全部方法都是抽象的。多繼承性可經過實現這樣的接口而得到
。接口中的全部方法都是抽象的,沒有一個有程序體。接口只能夠定義static final成員變量
。接口的實現與抽象類類似,除了該實現類不能從接口定義中繼承行爲。當類實現特殊接口時,它定義(即將程序體給予)全部這種接口的方 法。 而後,它能夠在實現了該接口的類的任何對象上調用接口的方法。因爲有抽象類,它容許使用接口名做爲引用變量的類型。引用能夠轉換到接口類型或從接口類型轉換,instanceof 運算符
能夠用來決定某對象的類是否實現了接口。
接口能夠繼承接口。抽象類能夠實現(implements)接口,抽象類是可繼承實體類,但前提是實體類必須有明確的構造函數
。
啓動一個線程是調用start()方法,使線程所表明的虛擬處理機處於可運行狀態
,這意味着它能夠由JVM調度並執行。這並不意味着線程就會當即運行
。run()方法能夠產生必須退出的標誌來中止一個線程。
構造器Constructor不能被繼承,所以不能重寫Overriding,但能夠被重載Overloading
。
String類是final類故不能夠繼承。
不能,一個對象的一個synchronized方法只能由一個線程訪問。
會執行,在return前執行
。
是值傳遞。Java 編程語言只有值傳遞參數。當一個對象實例做爲一個參數被傳遞到方法中時,參數的值就是對該對象的引用
。對象的內容能夠在被調用的方法中改變,但對象的引用是永遠不會改變的。
switch(expr1)中,expr1是一個整數表達式。所以傳遞給 switch 和 case 語句的參數應該是 short、 int、 byte、char 。
long,String 都不能做用於swtich
。
抽象
:抽象就是忽略一個主題中與當前目標無關的那些方面,以便更充分地注意與當前目標有關的方面。抽象並不打算了解所有問題,而只是選擇其中的一部分,暫時不用部分細節。抽象包括兩個方面,一是過程抽象,二是數據抽象。
繼承
: 繼承是一種聯結類的層次模型,而且容許和鼓勵類的重用,它提供了一種明確表述共性的方法。對象的一個新類能夠從現有的類中派生,這個過程稱爲類繼承。新類 繼承了原始類的特性,新類稱爲原始類的派生類(子類),而原始類稱爲新類的基類(父類)。派生類能夠從它的基類那裏繼承方法和實例變量,而且類能夠修改或 增長新的方法使之更適合特殊的須要。
封裝
:封裝是把過程和數據包圍起來,對數據的訪問只能經過已定義的界面。面向對象計算始於這個基本概念,即現實世界能夠被描繪成一系列徹底自治、封裝的對象,這些對象經過一個受保護的接口訪問其餘對象。
多態性
:多態性是指容許不一樣類的對象對同一消息做出響應。多態性包括參數化多態性和包含多態性。多態性語言具備靈活、抽象、行爲共享、代碼共享的優點,很好的解決了應用程序函數同名問題。
不是,基本數據類型包括byte、int、char、long、float、double、boolean和short。
java.lang.String類是final類型的,所以不能夠繼承這個類、不能修改這個類。爲了提升效率節省空間,咱們應該用StringBuffer類。
Java 提供兩種不一樣的類型:引用類型和原始類型(或內置類型)
。int是java的原始數據類型,Integer是java爲int提供的封裝類。Java爲每一個原始類型提供了封裝類。
原始類型 | 封裝類 |
---|---|
boolean | Boolean |
char | Character |
byte | Byte |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
引用類型和原始類型的行爲徹底不一樣,而且它們具備不一樣的語義。引用類型和原始類型具備不一樣的特徵和用法,它們包括:大小和速度問題,這種類型以哪一種類型的數據結構存儲,當引用類型和原始類型用做某個類的實例數據時所指定的缺省值。對象引用實例變量的缺省值爲 null,而原始類型實例變量的缺省值與它們的類型有關
。
JAVA 平臺提供了兩個類:String和StringBuffer,它們能夠儲存和操做字符串,即包含多個字符的字符數據。這個String類提供了數值不可改變的字符串。而這個StringBuffer類提供的字符串進行修改。當你知道字符數據要改變的時候你就可使用StringBuffer。典型地,你可使用StringBuffers來動態構造字符數據。
異常表示程序運行過程當中可能出現的非正常狀態,運行時異常表示虛擬機的一般操做中可能遇到的異常,是一種常見運行錯誤。java編譯器要求方法必須聲明拋出可能發生的非運行時異常,可是並不要求必須聲明拋出未被捕獲的運行時異常。
ArrayList 和Vector都是使用數組方式存儲數據
,此數組元素數大於實際存儲的數據以便增長和插入元素,它們都容許直接按序號索引元素,可是插入元素要涉及數組元素移動等內存操做
,因此索引數據快而插入數據慢
。
Vector因爲使用了synchronized方法(線程安全)
,一般性能上較ArrayList差, 而LinkedList使用雙向鏈表實現存儲
,按序號索引數據須要進行前向或後向遍歷,可是插入數據時只須要記錄本項的先後項便可,因此插入速度較快
。
棧是一種線形集合
,其添加和刪除元素的操做應在同一段完成。棧按照後進先出的方式進行處理。
當 JAVA程序違反了JAVA的語義規則時,JAVA虛擬機就會將發生的錯誤表示爲一個異常。違反語義規則包括2種狀況。一種是JAVA類庫內置的語義檢查
。例如數組下標越界,會引起IndexOutOfBoundsException;訪問null的對象時會引起 NullPointerException。另外一種狀況就是JAVA容許程序員擴展這種語義檢查
,程序員能夠建立本身的異常,並自由選擇在什麼時候用 throw關鍵字引起異常。全部的異常都是java.lang.Thowable的子類。
Java 語言中一個顯著的特色就是引入了垃圾回收機制,使c++程序員最頭疼的內存管理的問題迎刃而解,它使得Java程序員在編寫程序的時候再也不須要考慮內存管 理。因爲有個垃圾回收機制,Java中的對象再也不有「做用域」的概念,只有對象的引用纔有「做用域」。垃圾回收能夠有效的防止內存泄露,有效的使用可使 用的內存。垃圾回收器一般是做爲一個單獨的低級別的線程運行,不可預知的狀況下對內存堆中已經死亡的或者長時間沒有使用的對象進行清楚和回收,程序員不能 實時的調用垃圾回收器對某個對象或全部對象進行垃圾回收
。回收機制有分代垃圾回收
和標記垃圾回收
,增量垃圾回收
。
最經常使用的集合類是 List 和 Map
。 List 的具體實現包括 ArrayList 和 Vector
,它們是可變大小的列表,比較適合構建、存儲和操做任何類型對象的元素列表。 List 適用於按數值索引訪問元素的情形。 Map 提供了一個更通用的元素存儲方法。 Map 集合類用於存儲元素對(稱做「鍵」和「值」)
,其中每一個鍵映射到一個值。
可以定義成爲一箇中文的,由於java中以unicode編碼,一個char佔16個字節,因此放一箇中文是沒問題的
。
主要相同點:Lock能完成synchronized所實現的全部功能
。 主要不一樣點:Lock有比synchronized更精確的線程語義和更好的性能
。
synchronized會自動釋放鎖,而Lock必定要求程序員手工釋放,而且必須在finally從句中釋放
。
Java 經過面向對象的方法進行異常處理,把各類不一樣的異常進行分類,並提供了良好的接口。在Java中,每一個異常都是一個對象,它是Throwable類或其它子類的實例
。當一個方法出現異常後便拋出一個異常對象,該對象中包含有異常信息,調用這個對象的方法能夠捕獲到這個異常並進行處理。Java的異常處理是經過5個關鍵詞來實現的:try、catch、throw、throws和finally
。通常狀況下是用try來執行一段程序,若是出現異常,系統會拋出(throws)一個異常,這時候你能夠經過它的類型來捕捉(catch)它,或最後(finally)由缺省處理器來處理。
用try來指定一塊預防全部「異常」的程序。緊跟在try程序後面,應包含一個catch子句來指定你想要捕捉的「異常」的類型
。
throw語句用來明確地拋出一個「異常」
。 throws用來標明一個成員函數可能拋出的各類「異常」
。 finally爲確保一段代碼無論發生什麼「異常」都被執行一段代碼
。
能夠在一個成員函數調用的外面寫一個try語句,在這個成員函數內部寫另外一個try語句保護其餘代碼。每當遇到一個try語句,「異常」的框架就放到堆棧上面,直到全部的try語句都完成。若是下一級的try語句沒有對某種「異常」進行處理,堆棧就會展開,直到遇到有處理這種「異常」的try語句。
能夠。必須只有一個類名與文件名相同。
有兩種實現方法,分別是繼承Thread類與實現Runnable接口;
用synchronized關鍵字修飾同步方法;
反對使用stop(),是由於它不安全
:它會解除由線程獲取的全部鎖定
,並且若是對象處於一種不連貫狀態
,那麼其餘線程能在那種狀態下檢查和修改它們。結果很難檢查出真正的問題所在。
suspend()方法容易發生死鎖
:調用suspend()的時候,目標線程會停下來,但卻仍然持有在這以前得到的鎖定
。此時,其餘任何線程都不能訪問鎖定的資源,除非被「掛起」的線程恢復運行
。對任何線程來講,若是它們想恢復目標線程,同時又試圖使用任何一個鎖定的資源,就會形成死鎖
。因此不該該使用suspend(),而應在本身的Thread類中置入一個標誌,指出線程應該活動仍是掛起。若標誌指出線程應該掛起,便用 wait()命其進入等待狀態。若標誌指出線程應當恢復,則用一個notify()從新啓動線程。
字節流,字符流。 字節流繼承於InputStream OutputStream,字符流繼承於InputStreamReader OutputStreamWriter。 在java.io包中還有許多其餘的流,主要是爲了提升性能和使用方便。
方法的重寫Overriding和重載Overloading是Java多態性的不一樣表現。重寫Overriding是父類與子類之間多態性的一種表現,重載Overloading是一個類中多態性的一種表現。
對於GC來講,當程序員建立對象時,GC就開始監控這個對象的地址、大小以及使用狀況。一般,GC採用有向圖的方式
記錄和管理堆(heap)中的全部對象。 經過這種方式肯定哪些對象是"可達的",哪些對象是"不可達的"。當GC肯定一些對象爲"不可達"時,GC就有責任回收這些內存空間。能夠。程序員能夠手動執行System.gc(),通知GC運行
,可是Java語言規範並不保證GC必定會執行
。
序列化
就是一種用來處理對象流的機制,所謂對象流也就是將對象的內容進行流化。能夠對流化後的對象進行讀寫操做,也可將流化後的對象傳輸於網絡之間。序列化是爲了解決在對對象流進行讀寫操做時所引起的問題。
序列化的實現
:將須要被序列化的類實現Serializable接口
,該接口沒有須要實現的方法,implements Serializable只是爲了標註該對象是可被序列化的,而後使用一個輸出流(如:FileOutputStream)來構造一個 ObjectOutputStream(對象流)對象,接着,使用ObjectOutputStream對象的writeObject(Object obj)方法就能夠將參數爲obj的對象寫出(即保存其狀態),要恢復的話則用輸入流。
不能夠,若是其中包含對象的method();不能保證對象初始化.
Clone 有缺省行爲,super.clone();他負責產生正確大小的空間,並逐位複製。
用break; return 方法。
List 以特定次序來持有元素,可有重複元素。 Set 沒法擁有重複元素,內部排序。 Map 保存key-value值,value可多值。
一個內部類對象能夠訪問建立它的外部類對象的內容
**就 ArrayList與Vector主要從二方面來講: **
- 同步性:Vector是線程安全的,也就是說是同步的,而ArrayList是線程序不安全的,不是同步的 ;
- 數據增加:當須要增加時,
Vector默認增加爲原來一培,而ArrayList倒是原來的一半
。
就HashMap與HashTable 主要從三方面來講:
- 歷史緣由:Hashtable是基於陳舊的Dictionary類的,HashMap是Java 1.2引進的Map接口的一個實現 ;
- 同步性:Hashtable是線程安全的,也就是說是同步的,而HashMap是線程序不安全的,不是同步的 ;
- 值:只有HashMap可讓你將空值做爲一個表的條目的key或value。
public:類自己和任何包的任何類都訪問; private 只有類自己能夠訪問,其餘類想訪問能夠經過該類的成員方法訪問如getter/setter; protected:保護的,這個和缺省的比較容易混淆,記住最主要區別是:protected能夠在不一樣包的子類被訪問,而friendly不能夠; protected能夠在類自己、同包的子類,不一樣包的子類,同包的非子類被訪問; 默認不寫的時候是friendly;
final關鍵字的目的就是爲了保證內部類和外部函數對變量「認識」的一致性
;