javaweb常見(jiàn)面試題及參考答案(2)
javaweb常見(jiàn)面試題及參考答案
Hashtable和HashMap采用的hash/rehash算法都大概一樣,所以性能不會(huì)有很大的差異。就HashMap與HashTable主要從三方面來(lái)說(shuō)。
一.歷史原因:Hashtable是基于陳舊的Dictionary類的,HashMap是Java 1.2引進(jìn)的Map接口的一個(gè)實(shí)現(xiàn)
二.同步性:Hashtable是線程安全的,也就是說(shuō)是同步的,而HashMap是線程序不安全的,不是同步的
三.值:只有HashMap可以讓你將空值作為一個(gè)表的條目的key或value 求質(zhì)數(shù)的多種優(yōu)化方式
答:一般我們求質(zhì)數(shù)時(shí)都會(huì)去計(jì)算小于某一個(gè)數(shù)N的質(zhì)數(shù)而不會(huì)不加限定,現(xiàn)在我們以求小于N的質(zhì)數(shù)來(lái)說(shuō)一說(shuō)優(yōu)化方式。在我們求質(zhì)數(shù)的過(guò)程中一般會(huì)用到兩種方法試除法和篩選法兩種,現(xiàn)在下來(lái)說(shuō)一下試除法:
?、?判斷小于N的數(shù)X是否是質(zhì)數(shù),就是從2一直嘗試到X-1,這種做法效率最差,并不可取----->②如果X是質(zhì)數(shù),那么它如果不能被小于X/2的數(shù)整除即可,這樣算法效率提高一些---->③除了2以外,所有的質(zhì)數(shù)都只能是奇數(shù),所以我們可以將數(shù)X先試除2,然后嘗試從3一直到X/2的所有奇數(shù)----->④其實(shí)判斷一個(gè)數(shù)是否是質(zhì)數(shù),只需判斷一個(gè)數(shù)能不能被除了1
----->⑤最后,我們可以利用前面求出來(lái)的質(zhì)數(shù)來(lái)判斷,我們只需判斷X能不能
再說(shuō)篩選法:對(duì)于使用篩選法的優(yōu)化主要是從空間上考慮
?、俣x一個(gè)容器,將數(shù)據(jù)放入容器中,然后遍歷其中的數(shù)據(jù),將是合數(shù)的數(shù)據(jù)刪除,最后剩余的就是質(zhì)數(shù)了------>②我們可以定義一個(gè)布爾類型的數(shù)組容器,將其中的值都賦值為true,在篩選的過(guò)程中將不是質(zhì)數(shù)的數(shù)作為數(shù)組的下標(biāo)將對(duì)應(yīng)元素的值改為false,最后取出值為true的元素的下標(biāo)即可----->③構(gòu)造定長(zhǎng)的byte數(shù)組,數(shù)組的每個(gè)byte存儲(chǔ)8個(gè)布爾值,這樣性能是不是又有了提
(14) 簡(jiǎn)述幾種排序方式(至少四種,可以從以下各個(gè)方面來(lái)比較這幾種算法,例如從時(shí)間復(fù)雜度和空間復(fù)雜度)
高呢。冒泡排序:(Bubble Sort)冒泡排序方法是最簡(jiǎn)單的排序方法。這種方法的基本思想是,將待排序的元素看作是豎著排列的“氣泡”,較小的元素比較輕,從而要往上浮。在冒泡排序算法中我們要對(duì)這個(gè)“氣泡”序列處理若干遍。所謂一遍處理,就是自底向上檢查一遍這個(gè)序列,并時(shí)刻注意兩個(gè)相鄰的元素的順序是否正確。如果發(fā)現(xiàn)兩個(gè)相鄰元素的順序不對(duì),即“輕”的元素在下面,就交換它們的位置。顯然,處理一遍之后,“最輕”的元素就浮到了最高位置;處理二遍之后,“次輕”的元素就浮到了次高位置。在作第二遍處理時(shí),由于最高位置上的元素已是“最輕”元素,所以不必檢查。一般地,第i遍處理時(shí),不必檢查第i高位置以上的元素,因?yàn)榻?jīng)過(guò)前面i-1遍的處理,它們已正確地排好序。
插入排序(Insertion Sort)插入排序的基本思想是,經(jīng)過(guò)i-1遍處理后,L[1..i-1]己排好序。第i遍處理僅將L插入L[1..i-1]的適當(dāng)位置,使得L[1..i]又是排好序的序列。要達(dá)到這個(gè)目的,我們可以用順序比較的方法。首
先比較L和L[i-1],如果L[i-1]≤ L,則L[1..i]已排好序,第i遍處理就結(jié)束了;否則交換L與L[i-1]的位置,繼續(xù)比較L[i-1]和L[i-2],直到找到某一個(gè)位置j(1≤j≤i-1),使得L[j] ≤L[j+1]時(shí)為止。
選擇排序(Selection Sort)選擇排序的基本思想是對(duì)待排序的記錄序列進(jìn)行n-1遍的處理,第 i 遍處理是將[i..n]中最小者與位置 i 交換位置。這樣,經(jīng)過(guò) i 遍處理之后,前 i 個(gè)記錄的位置已經(jīng)是正確的了。
快速排序(Quick Sort)快速排序是對(duì)冒泡排序的一種本質(zhì)改進(jìn)。它的基本思想是通過(guò)一趟掃描后,使得排序序列的長(zhǎng)度能大幅度地減少。在冒泡排序中,一次掃描只能確保最大數(shù)值的數(shù)移到正確位置,而待排序序列的長(zhǎng)度可能只減少
1。快速排序通過(guò)一趟掃描,就能確保某個(gè)數(shù)(以它為基準(zhǔn)點(diǎn)吧)的左邊各數(shù)都比它小,右邊各數(shù)都比它大。然后又用同樣的方法處理它左右兩邊的數(shù),直到基準(zhǔn)點(diǎn)的左右只有一個(gè)元素為止。
一、專業(yè)知識(shí)
1、a0=1、a1=1、a2=a1+a0、a3=a2+a1,以
此類推,請(qǐng)寫(xiě)代碼用遞歸算出a30?
3、簡(jiǎn)述值類型和引用類型的區(qū)別
值類型包括簡(jiǎn)單 類型、結(jié)構(gòu)體類型和枚舉類型,引用類型包括自定義類、數(shù)組、接口、委托等
他們兩在內(nèi)存中存儲(chǔ)的方式不同,值類型以棧的方式存儲(chǔ)的,引用類型以堆的方式;前者是真實(shí)的存儲(chǔ)空間,后者只是存儲(chǔ)地址的引用!
4、簡(jiǎn)述類中的靜態(tài)成員和非靜態(tài)成員的區(qū)別
靜態(tài)變量使用 static 修飾符進(jìn)行聲明,在類被實(shí)例化時(shí)創(chuàng)建,通過(guò)類進(jìn)行訪問(wèn)。不帶有 static 修飾符聲明的變量稱做非靜態(tài)變量,在對(duì)象被實(shí)例化時(shí)創(chuàng)建,通過(guò)對(duì)象進(jìn)行訪問(wèn)。一個(gè)類的所有實(shí)例的同一靜態(tài)變量都是同一個(gè)值,同一個(gè)類的不同實(shí)例的同一非靜態(tài)變量可以是不同的值。靜態(tài)函數(shù)的實(shí)現(xiàn)里不能使用非靜態(tài)成員,如非靜態(tài)變量、非靜態(tài)函數(shù)等。
5、什么是單例?
一個(gè)類中只有一個(gè)實(shí)例并且自行化向整個(gè)系統(tǒng)提供這個(gè)實(shí)例叫單例
下面程序段的輸出結(jié)果是:
Void complicatedex(){
int x=20,y=30;
boolean b; b=x>50&&y>60||x>50&&y<-6||x<-50&&y>60||x<-50&&y<-60; system.out.println(b);}
結(jié)果為:fasle
super()和this()的區(qū)別
Super()指父類的無(wú)參構(gòu)造方法,this()指當(dāng)前類的無(wú)參構(gòu)造方法,兩者都必須寫(xiě)在構(gòu)造方法的第一句
2、Java中public,private,protected,和默認(rèn)
的區(qū)別
a、private修飾詞,表示成員是私有的,只有自身可以訪問(wèn);
b、protected,表示受保護(hù)權(quán)限,體現(xiàn)在繼承,即子類可以訪問(wèn)父類受保護(hù)成員,同時(shí)相同包內(nèi)的其他類也可以訪問(wèn)protected成員。
c、無(wú)修飾詞(默認(rèn)),表示包訪問(wèn)權(quán)限(friendly, java語(yǔ)言中是沒(méi)有friendly這個(gè)修飾符的,這樣稱呼應(yīng)該是來(lái)源于c++ ),同一個(gè)包內(nèi)可以訪問(wèn),訪問(wèn)權(quán)限是包級(jí)訪問(wèn)權(quán)限;
d、public修飾詞,表示成員是公開(kāi)的,所有其他類都可以訪問(wèn);
3、描述一下java的事件委托機(jī)制和垃圾回
收機(jī)制
java事件委托機(jī)制:一個(gè)源產(chǎn)生一個(gè)事件時(shí),把他送到一個(gè)或多個(gè)監(jiān)聽(tīng)器那里,在這種機(jī)制種,監(jiān)聽(tīng)器只是等待,一旦收到事件,處理事件并返回;
Java垃圾回收:是一種動(dòng)態(tài)存儲(chǔ)管理技術(shù),它自動(dòng)地釋放不再被程序引用的對(duì)象,按照特定的垃圾收集算法來(lái)實(shí)現(xiàn)資源自動(dòng)回收的功能。當(dāng)一個(gè)對(duì)象不再被引用的時(shí)候,內(nèi)存回收它占領(lǐng)的空間,以便空間被后來(lái)的新對(duì)象使用,以免造成內(nèi)存泄露。
什么是java序列化,如何事件java序列化 序列化就是一種用來(lái)處理對(duì)象流的機(jī)制,所謂對(duì)象流也就是將對(duì)象的內(nèi)容進(jìn)行流化??梢詫?duì)流化后的對(duì)象進(jìn)行讀寫(xiě)操作,也可將流化后的對(duì)象傳輸于網(wǎng)絡(luò)之間。序列化是為了解決在對(duì)對(duì)象流進(jìn)行讀寫(xiě)操作時(shí)所引發(fā)的問(wèn)題。
public class Cat implements Serializable {}„„
Try{FileOutputStream fos = new FileOutputStream("catDemo.out"); ObjectOutputStream oos = new ObjectOutputStream(fos);
System.out.println(" 1> " + cat.getName());
cat.setName("My Cat");
oos.writeObject(cat);
oos.close();
}catch(Exception e){„ }„„
overload和overrride的區(qū)別。Overloaded
的方法和是否可以改變返回值類型
override(重寫(xiě),覆蓋)
1、方法名、參數(shù)、返回值相同。
2、子類方法不能縮小父類方法的訪問(wèn)權(quán)限。
3、子類方法不能拋出比父類方法更多的異常(但子類方法可以不拋出異常)。
4、存在于父類和子類之間。
5、方法被定義為final不能被重寫(xiě)。
overload(重載,過(guò)載)
1、參數(shù)類型、個(gè)數(shù)、順序至少有一個(gè)不相同。
2、不能重載只有返回值不同的方法名。
3、存在于父類和子類、同類中。
Overloaded的方法不能改變返回值類型
final類有什么特點(diǎn)
該類不能被繼承
寫(xiě)出下面代碼的輸出結(jié)果
Package test;
Public class OuterClass{
Private class InterClass{
Public InterClass{
System.out.println(“interClass create”);}}
Public OuterClass(){
InterClass ic= new InterClass();
System.out.println(“outerclass create”);}
Public static void main(String[] args){
OuterClass oc=new OuterClass();}}
輸出:
interClass create
Outerclass create
如何格式化日期
java日期的格式話主要用的是SimpleDateFormat df = new SimpleDateFormat();
ArrayList Vector LinkedList 的存儲(chǔ)性
能好特性,HashMap和Hashtable的區(qū)別
ArrayList和Vector都是使用數(shù)組方式存儲(chǔ)數(shù)據(jù),此數(shù)組元素?cái)?shù)大于實(shí)際存儲(chǔ)的數(shù)據(jù)以便增加和插入元素,它們都允許直接按序號(hào)索引元素,但是插入元素要涉及數(shù)組元素移動(dòng)等內(nèi)存操作,所以索引數(shù)據(jù)快而插入數(shù)據(jù)慢,Vector由于使用了synchronized方法(線程安全),通常性能上較ArrayList差,而LinkedList
使用雙向鏈表實(shí)現(xiàn)存儲(chǔ),按序號(hào)索引數(shù)據(jù)需要進(jìn)行前向或后向遍歷,但是插入數(shù)據(jù)時(shí)只需要記錄本項(xiàng)的前后項(xiàng)即可,所以插入速度較快。
1.HashTable的方法是同步的,HashMap未經(jīng)同步,所以在多線程場(chǎng)合要手動(dòng)同步HashMap這個(gè)區(qū)別就像Vector和ArrayList一樣。
2.HashTable不允許null值(key和value都不可以),HashMap允許null值(key和value都可以)。
3.HashTable有一個(gè)contains(Object value),功能和containsValue(Object value)功能一樣。
4.HashTable使用Enumeration,HashMap使用Iterator。
String是基本數(shù)據(jù)類型嗎?
不是
多線程有幾種實(shí)現(xiàn)方式,同步有幾種實(shí)現(xiàn)方
式,stop()和suspend()方法為什么不推薦使用
多線程有兩種實(shí)現(xiàn)方法,分別是繼承Thread類與實(shí)現(xiàn)Runnable接口 同步的實(shí)現(xiàn)方面有兩種,分別是synchronized,wait與notify"
反對(duì)使用stop(),是因?yàn)樗话踩?。它?huì)解除由線程獲取的所有鎖定,而且如果對(duì)象處于一種不連貫狀態(tài),那么其他線程能在那種狀態(tài)下檢查和修改它們。結(jié)果很難檢查出真正的問(wèn)題所在。suspend()方法容易發(fā)生死鎖。 調(diào)用suspend()的時(shí)候,目標(biāo)線程會(huì)停下來(lái),但卻仍然持有在這之前獲得的鎖定。此時(shí),其他任何線程都不能訪問(wèn)鎖定的資源,除非被"掛起"的線程恢復(fù) 運(yùn)行。對(duì)任何線程來(lái)說(shuō),如果它們想恢復(fù)目標(biāo)線程,同時(shí)又試圖使用任何一個(gè)鎖定的資源,就會(huì)造成
死鎖。所以不應(yīng)該使用suspend(),而應(yīng)在自己的 Thread類中置入一個(gè)標(biāo)志,
1.請(qǐng)闡述一下你對(duì)Java多線程中同步的幾
種使用方式,區(qū)別,以及其重要性。
同步有兩種實(shí)現(xiàn)方式
1.同步方法
2.同步代碼塊
多線程的同步時(shí)為了能夠保證關(guān)鍵數(shù)據(jù)在單位時(shí)間能只能有一個(gè)線程操作,保證數(shù)據(jù)的同步性,安全性
2.final ,finally , finalize 的區(qū)別。
Final 有最終的不可改變的意思,可以用來(lái)修飾基本數(shù)據(jù)使之成為常
量,該常量只能在編譯期進(jìn)行修改 。
當(dāng)修飾對(duì)象時(shí),則該對(duì)象引用不能改變,但該對(duì)象本身可以做修改。 當(dāng)修飾方法時(shí),表示該方法在被繼承時(shí)不能被修改,或覆蓋
當(dāng)修飾類時(shí),表示該類不會(huì)別別的類繼承
Finally 用于在Try-catch-finally語(yǔ)句中 finally 中的代碼塊時(shí)必須執(zhí)行的
finalize 當(dāng)某個(gè)對(duì)象要被當(dāng)做垃圾回收時(shí),會(huì)調(diào)用finalize()方法,該方法用于檢查對(duì)象不被運(yùn)行狀態(tài)的對(duì)象引用或間接地引用
sleep() 和wait()有什么區(qū)別?
Sleep()是線程中的一個(gè)方法,該方法用于控制自身線程的流程,當(dāng)
執(zhí)行sleep()方法睡眠時(shí)保持對(duì)象鎖。
Wait()方法是object類中的一個(gè)方法,該方法用于讓一個(gè)線程處于
等待狀態(tài)并釋放對(duì)象鎖,當(dāng)該線程想要再次執(zhí)行時(shí)需要調(diào)用notity
方法喚醒此線程
4. abstact 的method是否可同時(shí)是static,
是否可同時(shí)是native,是否可同時(shí)是synchronized ?
不可以
5當(dāng)一個(gè)線程進(jìn)入一個(gè)對(duì)象的Synchronized
方法后,其他線程是否可進(jìn)入此對(duì)象的其他方法
可以去訪問(wèn)非Synchronized方法。
6.當(dāng)一個(gè)對(duì)象被當(dāng)做參數(shù)傳遞到一個(gè)方法
后,此方法可改變這個(gè)對(duì)象的屬性,并可返回變化后的結(jié)果,那么這里到底是值傳遞還是引用傳遞?
值傳遞
7.創(chuàng)建一個(gè)class對(duì)象有幾種方法?分別是
什么?
有三種:
1. Class c=Class.for(“java.lang.String”);
2. String str=new Stirng();
Class c=Str.getClass();
3.Class c=String.Class;
9.如何獲取一個(gè)目錄下有多少個(gè)文件?
File f=new File(“D://”);
Int count=f.list().length;
10.請(qǐng)寫(xiě)出下列代碼的輸出結(jié)果:
FatherClass Create
ChildClass Create
13.當(dāng)一個(gè)對(duì)象不再被使用時(shí),如何才能從內(nèi)
存中消失?
將該對(duì)象引用值為空
點(diǎn)擊下頁(yè)還有更多>>>javaweb常見(jiàn)面試題及參考答案