java 里如何实现逻辑返回值_☆技术问答集锦(五)
1 簡述邏輯操作(&,|,^)與條件操作(&&,||)的區別
區別主要答兩點:
條件操作只能操作布爾型的,而邏輯操作不僅可以操作布爾型,而且可以操作數值型;
邏輯操作不會產生短路,而條件操作符會產生短路,短路是指當進行條件操作符運算時,前面條件如果確定了條件表達式值的話,就不在進行后面條件的判斷。
位邏輯運算通常是針對兩個數而言,執行位操作;
條件邏輯運算是針對兩個條件表達式而言,執行條件操作;
其實,位邏輯操作符一樣可以實現條件操作,但是此時有一個重要的區別: 用位操作符時,不管操作符兩邊的條件表達式成不成立,它都要通通進行運算判斷,而條件邏輯操作符不一樣了,如果通過左側的操作數就可以 進行它們需要的判斷,那么它就不會再計算右側的操作數了,這種情況叫短路。
2 談談final, finally, finalize的區別
如果一個類被聲明為final,意味著它不能再派生出新的子類,不能作為父類被繼承。因此一個類既不能被聲明為 abstract的,又被聲明為final的。
將變量或方法聲明為final,可以保證它們在使用中不被改變。被聲明為final的變量必須在聲明時給定初值,而在以后的引用中只能讀取,不可修改。被聲明為final的方法也同樣只能使用,不能重載。
finally塊:在異常處理時提供 finally 塊來執行任何清除操作。如果拋出一個異常,那么相匹配的 catch 子句就會執行,然后不管是否會發生異常控制都會進入 finally 塊(如果有的話)。
finalize 方法名:Java 技術允許使用 finalize() 方法在垃圾收集器將對象從內存中清除出去之前做必要的清理工作。這個方法是由垃圾收集器在確定這個對象沒有被引用而清理時對這個對象調用的。它是在 Object 類中定義的,因此所有的類都繼承了它。子類覆蓋finalize() 方法以整理系統資源或者執行其他清理工作。finalize() 方法是在垃圾收集器刪除對象之前對這個對象調用的。僅能會被JVM執行一次。
3 Anonymous Inner Class (匿名內部類) 是否可以extends(繼承)其它類,是否可以implements(實現)interface(接口)
匿名內部類是指沒有名字的內部類,其本身就是通過繼承類或者接口來實現的。但是不能再顯式的extends 或者implements了。
4 Static Nested Class 和 Inner Class的不同,說得越多越好
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. 創建一個內部類的對象,必須需要一個外部類對象;
5 HashMap和Hashtable的區別
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算法大概都一樣,所以性能不會有很大的差異。
6 Collection 和 Collections的區別
Collection是集合類的父接口,繼承與它的接口主要有Set和List。
Collections是針對集合類的一個幫助類,它提供一系列靜態方法實現對各種集合的搜索,排序,線程安全化等操作。
7 GC是什么? 為什么要有GC?
GC 是垃圾收集的意思(Gabage Collection),內存處理是編程人員容易出現問題的地方,忘記或者錯誤的內存回收會導致程序或系統的不穩定甚至崩潰,Java提供的GC功能可以自動的監測對象是否超過作用域從而達到自動回收內存的目的,Java語言沒有提供釋放以分配內存的顯示操作方法。
8 String s = new String("xyz");創建了幾個String Object?
兩個對象,一個是“xyz”,另一個是s;
10 short s1 = 1; s1 = s1 + 1;有什么錯? short s1 = 1; s1 += 1;有什么錯?
short s1 = 1; s1 = s1 + 1;有錯,s1是short型,s1+1是int型,不能顯式轉化為short型。可修改為s1 =(short)(s1 + 1) 。short s1 = 1; s1 += 1正確。
11 sleep() 和 wait() 有什么區別?
sleep是線程類(Thread)的方法,導致此線程暫停執行指定時間,到時間后會自動恢復,調用sleep不會釋放對象鎖。
wait是Object類的方法,對此對象調用wait方法導致本線程釋放對象鎖,進入等待此對象的等待鎖定池,只有針對此對象調用notify方法或notifyAll方法后,本線程才進入對象鎖定池準備獲得對象鎖進入運行狀態。
14 Overload和Override的區別。Overloaded的方法是否可以改變返回值的類型?
方法的重寫Overriding和重載Overloading是Java多態性的不同表現。
重寫Overriding是父類與子類之間多態性的一種表現,重載Overloading是一個類中多態性的一種表現。如果在子類中定義某方法與其父類有相同的名稱和參數,我們說該方法被重寫 (Overriding)。子類的對象使用這個方法時,將調用子類中的定義,對它而言,父類中的定義如同被"屏蔽"了。如果在一個類中定義了多個同名的方 法,它們或有不同的參數個數或有不同的參數類型,則稱為方法的重載(Overloading)。Overloaded的方法是可以改變返回值的類型。
15 Set里的元素是不能重復的,那么用什么方法來區分重復與否呢? 是用==還是equals()? 它們有何區別?
Set里的元素是不能重復的。equals()是判讀兩個Set是否相等。 equals()和==方法決定引用值是否指向同一對象。equals()在類中被覆蓋,為的是當兩個分離的對象的內容和類型相配的話,返回真值。
16 error和exception有什么區別?
error 表示恢復不是不可能但很困難的情況下的一種嚴重問題。比如說內存溢出。不可能指望程序能處理這樣的情況。
exception 表示一種程序設計或實現問題。也就是說,它表示如果程序運行正常,從不會發生的情況。
17 List, Set, Map是否繼承自Collection接口?
List,Set是。Map不是 。
18 abstract class和interface有什么區別?
聲明方法的存在而不去實現它的類被叫做抽象類(abstract class),它用于要創建一個體現某些基本行為的類,并為該類聲明方法,但不能在該類中實現該類的情況。不能創建abstract類的實例。然而可以創建一個變量,其類型是一個抽象類,并讓它指向具體子類的一個實例。不能有抽象構造函數或抽象靜態方法。Abstract 類的子類為它們父類中的所有抽象方法提供實現,否則它們也是抽象類。取而代之,在子類中實現該方法。知道其行為的其它類可以在類中實現這些方法。
接口(interface)是抽象類的變體。在接口中,所有方法都是抽象的。多繼承性可通過實現這樣的接口而獲得。接口中的所有方法都是抽象的,沒有一個有程序體。接口只可以定義static final成員變量。接口的實現與抽象類相似,除了該實現類不能從接口定義中繼承行為。當類實現特殊接口時,它定義(即將程序體給予)所有這種接口的方 法。 然后,它可以在實現了該接口的類的任何對象上調用接口的方法。由于有抽象類,它允許使用接口名作為引用變量的類型。引用可以轉換到接口類型或從接口類型轉換,instanceof 運算符可以用來決定某對象的類是否實現了接口。
19 接口是否可繼承接口? 抽象類是否可實現(implements)接口? 抽象類是否可繼承實體類(concrete class)?
接口可以繼承接口。抽象類可以實現(implements)接口,抽象類是可繼承實體類,但前提是實體類必須有明確的構造函數。
20 啟動一個線程是用run()還是start()?
啟動一個線程是調用start()方法,使線程所代表的虛擬處理機處于可運行狀態,這意味著它可以由JVM調度并執行。這并不意味著線程就會立即運行。run()方法可以產生必須退出的標志來停止一個線程。
21 構造器Constructor是否可被override?
構造器Constructor不能被繼承,因此不能重寫Overriding,但可以被重載Overloading。
22 是否可以繼承String類?
String類是final類故不可以繼承。
23 當一個線程進入一個對象的一個synchronized方法后,其它線程是否可進入此對象的其它方法?
不能,一個對象的一個synchronized方法只能由一個線程訪問。
24 try {}里有一個return語句,那么緊跟在這個try后的finally {}里的code會不會被執行,什么時候被執行,在return前還是后?
會執行,在return前執行。
25 當一個對象被當作參數傳遞到一個方法后,此方法可改變這個對象的屬性,并可返回變化后的結果,那么這里到底是值傳遞還是引用傳遞?
是值傳遞。Java 編程語言只有值傳遞參數。當一個對象實例作為一個參數被傳遞到方法中時,參數的值就是對該對象的引用。對象的內容可以在被調用的方法中改變,但對象的引用是永遠不會改變的。
26 swtich是否能作用在byte上,是否能作用在long上,是否能作用在String上?
switch(expr1)中,expr1是一個整數表達式。因此傳遞給 switch 和 case 語句的參數應該是 short、 int、 byte、char 。
long,String 都不能作用于swtich。
27 面向對象的特征有哪些方面
抽象:抽象就是忽略一個主題中與當前目標無關的那些方面,以便更充分地注意與當前目標有關的方面。抽象并不打算了解全部問題,而只是選擇其中的一部分,暫時不用部分細節。抽象包括兩個方面,一是過程抽象,二是數據抽象。
繼承: 繼承是一種聯結類的層次模型,并且允許和鼓勵類的重用,它提供了一種明確表述共性的方法。對象的一個新類可以從現有的類中派生,這個過程稱為類繼承。新類 繼承了原始類的特性,新類稱為原始類的派生類(子類),而原始類稱為新類的基類(父類)。派生類可以從它的基類那里繼承方法和實例變量,并且類可以修改或 增加新的方法使之更適合特殊的需要。
封裝:封裝是把過程和數據包圍起來,對數據的訪問只能通過已定義的界面。面向對象計算始于這個基本概念,即現實世界可以被描繪成一系列完全自治、封裝的對象,這些對象通過一個受保護的接口訪問其他對象。
多態性:多態性是指允許不同類的對象對同一消息作出響應。多態性包括參數化多態性和包含多態性。多態性語言具有靈活、抽象、行為共享、代碼共享的優勢,很好的解決了應用程序函數同名問題。
28 String是最基本的數據類型嗎?
不是,基本數據類型包括byte、int、char、long、float、double、boolean和short。
java.lang.String類是final類型的,因此不可以繼承這個類、不能修改這個類。為了提高效率節省空間,我們應該用StringBuffer類。
29 int 和 Integer 有什么區別
Java 提供兩種不同的類型:引用類型和原始類型(或內置類型)。int是java的原始數據類型,Integer是java為int提供的封裝類。Java為每個原始類型提供了封裝類。
原始類型
封裝類
boolean
Boolean
char
Character
byte
Byte
short
Short
int
Integer
long
Long
float
Float
double
Double
引用類型和原始類型的行為完全不同,并且它們具有不同的語義。引用類型和原始類型具有不同的特征和用法,它們包括:大小和速度問題,這種類型以哪種類型的數據結構存儲,當引用類型和原始類型用作某個類的實例數據時所指定的缺省值。對象引用實例變量的缺省值為 null,而原始類型實例變量的缺省值與它們的類型有關。
30 String 和StringBuffer的區別
JAVA 平臺提供了兩個類:String和StringBuffer,它們可以儲存和操作字符串,即包含多個字符的字符數據。這個String類提供了數值不可改變的字符串。而這個StringBuffer類提供的字符串進行修改。當你知道字符數據要改變的時候你就可以使用StringBuffer。典型地,你可以使用StringBuffers來動態構造字符數據。
31 運行時異常與一般異常有何異同?
異常表示程序運行過程中可能出現的非正常狀態,運行時異常表示虛擬機的通常操作中可能遇到的異常,是一種常見運行錯誤。java編譯器要求方法必須聲明拋出可能發生的非運行時異常,但是并不要求必須聲明拋出未被捕獲的運行時異常。
32 說出ArrayList,Vector, LinkedList的存儲性能和特性
ArrayList 和Vector都是使用數組方式存儲數據,此數組元素數大于實際存儲的數據以便增加和插入元素,它們都允許直接按序號索引元素,但是插入元素要涉及數組元素移動等內存操作,所以索引數據快而插入數據慢。
Vector由于使用了synchronized方法(線程安全),通常性能上較ArrayList差, 而LinkedList使用雙向鏈表實現存儲,按序號索引數據需要進行前向或后向遍歷,但是插入數據時只需要記錄本項的前后項即可,所以插入速度較快。
34 heap和stack有什么區別
棧是一種線形集合,其添加和刪除元素的操作應在同一段完成。棧按照后進先出的方式進行處理。
35 Java中的異常處理機制的簡單原理和應用
當 JAVA程序違反了JAVA的語義規則時,JAVA虛擬機就會將發生的錯誤表示為一個異常。違反語義規則包括2種情況。一種是JAVA類庫內置的語義檢查。例如數組下標越界,會引發IndexOutOfBoundsException;訪問null的對象時會引發 NullPointerException。另一種情況就是JAVA允許程序員擴展這種語義檢查,程序員可以創建自己的異常,并自由選擇在何時用 throw關鍵字引發異常。所有的異常都是java.lang.Thowable的子類。
36 垃圾回收的優點和原理。并考慮2種回收機制。
Java 語言中一個顯著的特點就是引入了垃圾回收機制,使c++程序員最頭疼的內存管理的問題迎刃而解,它使得Java程序員在編寫程序的時候不再需要考慮內存管 理。由于有個垃圾回收機制,Java中的對象不再有“作用域”的概念,只有對象的引用才有“作用域”。垃圾回收可以有效的防止內存泄露,有效的使用可以使 用的內存。垃圾回收器通常是作為一個單獨的低級別的線程運行,不可預知的情況下對內存堆中已經死亡的或者長時間沒有使用的對象進行清楚和回收,程序員不能 實時的調用垃圾回收器對某個對象或所有對象進行垃圾回收。回收機制有分代垃圾回收和標記垃圾回收,增量垃圾回收。
37 你所知道的集合類都有哪些?主要方法?
最常用的集合類是 List 和 Map。 List 的具體實現包括 ArrayList 和 Vector,它們是可變大小的列表,比較適合構建、存儲和操作任何類型對象的元素列表。 List 適用于按數值索引訪問元素的情形。
Map 提供了一個更通用的元素存儲方法。 Map 集合類用于存儲元素對(稱作“鍵”和“值”),其中每個鍵映射到一個值。
38 char型變量中能不能存貯一個中文漢字?為什么?
能夠定義成為一個中文的,因為java中以unicode編碼,一個char占16個字節,所以放一個中文是沒問題的。
39 簡述synchronized和java.util.concurrent.locks.Lock的異同?
主要相同點:Lock能完成synchronized所實現的所有功能。
主要不同點:Lock有比synchronized更精確的線程語義和更好的性能。
synchronized會自動釋放鎖,而Lock一定要求程序員手工釋放,并且必須在finally從句中釋放。
40 JAVA語言如何進行異常處理,關鍵字:throws,throw,try,catch,finally分別代表什么意義?在try塊中可以拋出異常嗎?
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語句。
41 一個“.java”源文件中是否可以包括多個類(不是內部類)?有什么限制?
可以。必須只有一個類名與文件名相同。
42 java中有幾種方法可以實現一個線程?用什么關鍵字修飾同步方法? stop()和suspend()方法為何不推薦使用?
有兩種實現方法,分別是繼承Thread類與實現Runnable接口;
用synchronized關鍵字修飾同步方法;
反對使用stop(),是因為它不安全:它會解除由線程獲取的所有鎖定,而且如果對象處于一種不連貫狀態,那么其他線程能在那種狀態下檢查和修改它們。結果很難檢查出真正的問題所在。
suspend()方法容易發生死鎖:調用suspend()的時候,目標線程會停下來,但卻仍然持有在這之前獲得的鎖定。此時,其他任何線程都不能訪問鎖定的資源,除非被“掛起”的線程恢復運行。對任何線程來說,如果它們想恢復目標線程,同時又試圖使用任何一個鎖定的資源,就會造成死鎖。所以不應該使用suspend(),而應在自己的Thread類中置入一個標志,指出線程應該活動還是掛起。若標志指出線程應該掛起,便用 wait()命其進入等待狀態。若標志指出線程應當恢復,則用一個notify()重新啟動線程。
43 java中有幾種類型的流?JDK為每種類型的流提供了一些抽象類以供繼承,請說出他們分別是哪些類?
字節流,字符流。
字節流繼承于InputStream OutputStream,字符流繼承于InputStreamReader OutputStreamWriter。
在java.io包中還有許多其他的流,主要是為了提高性能和使用方便。
44 java中實現多態的機制是什么?
方法的重寫Overriding和重載Overloading是Java多態性的不同表現。重寫Overriding是父類與子類之間多態性的一種表現,重載Overloading是一個類中多態性的一種表現。
45 垃圾回收器的基本原理是什么?垃圾回收器可以馬上回收內存嗎?有什么辦法主動通知虛擬機進行垃圾回收?
對于GC來說,當程序員創建對象時,GC就開始監控這個對象的地址、大小以及使用情況。通常,GC采用有向圖的方式記錄和管理堆(heap)中的所有對象。 通過這種方式確定哪些對象是"可達的",哪些對象是"不可達的"。當GC確定一些對象為"不可達"時,GC就有責任回收這些內存空間。可以。程序員可以手動執行System.gc(),通知GC運行,但是Java語言規范并不保證GC一定會執行。
46 什么是java序列化,如何實現java序列化?
序列化就是一種用來處理對象流的機制,所謂對象流也就是將對象的內容進行流化。可以對流化后的對象進行讀寫操作,也可將流化后的對象傳輸于網絡之間。序列化是為了解決在對對象流進行讀寫操作時所引發的問題。
序列化的實現:將需要被序列化的類實現Serializable接口,該接口沒有需要實現的方法,implements Serializable只是為了標注該對象是可被序列化的,然后使用一個輸出流(如:FileOutputStream)來構造一個 ObjectOutputStream(對象流)對象,接著,使用ObjectOutputStream對象的writeObject(Object obj)方法就可以將參數為obj的對象寫出(即保存其狀態),要恢復的話則用輸入流。
47 是否可以從一個static方法內部發出對非static方法的調用?
不可以,如果其中包含對象的method();不能保證對象初始化.
48 寫clone()方法時,通常都有一行代碼,是什么?
Clone 有缺省行為,super.clone();他負責產生正確大小的空間,并逐位復制。
49 在JAVA中,如何跳出當前的多重嵌套循環?
用break; return 方法。
50 List、Map、Set三個接口,存取元素時,各有什么特點?
List 以特定次序來持有元素,可有重復元素。
Set 無法擁有重復元素,內部排序。
Map 保存key-value值,value可多值。
51 內部類可以引用他包含類的成員嗎?有沒有什么限制?
一個內部類對象可以訪問創建它的外部類對象的內容
52 ArrayList和Vector的區別,HashMap和Hashtable的區別
**就 ArrayList與Vector主要從二方面來說: **
同步性:Vector是線程安全的,也就是說是同步的,而ArrayList是線程序不安全的,不是同步的 ;
數據增長:當需要增長時,Vector默認增長為原來一培,而ArrayList卻是原來的一半。
就HashMap與HashTable 主要從三方面來說:
歷史原因:Hashtable是基于陳舊的Dictionary類的,HashMap是Java 1.2引進的Map接口的一個實現 ;
同步性:Hashtable是線程安全的,也就是說是同步的,而HashMap是線程序不安全的,不是同步的 ;
值:只有HashMap可以讓你將空值作為一個表的條目的key或value。
53 關于java public private protected friendly(缺省)作用域
public:類本身和任何包的任何類都訪問;
private 只有類本身可以訪問,其他類想訪問可以通過該類的成員方法訪問如getter/setter;
protected:保護的,這個和缺省的比較容易混淆,記住最主要區別是:protected可以在不同包的子類被訪問,而friendly不可以;
protected可以在類本身、同包的子類,不同包的子類,同包的非子類被訪問;
默認不寫的時候是friendly;
54 為什么Java內部類訪問的局部變量是final的
final關鍵字的目的就是為了保證內部類和外部函數對變量“認識”的一致性;
總結
以上是生活随笔為你收集整理的java 里如何实现逻辑返回值_☆技术问答集锦(五)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 未来5年农村干啥挣钱 提前规划才能锁定收
- 下一篇: main java game,playg