學(xué)習(xí)啦 > 創(chuàng)業(yè)指南 > 職場 > 面試題 > javaweb常見面試題及參考答案(2)

javaweb常見面試題及參考答案(2)

時間: 如英753 分享

javaweb常見面試題及參考答案

  Hashtable和HashMap采用的hash/rehash算法都大概一樣,所以性能不會有很大的差異。就HashMap與HashTable主要從三方面來說。

  一.歷史原因:Hashtable是基于陳舊的Dictionary類的,HashMap是Java 1.2引進(jìn)的Map接口的一個實(shí)現(xiàn)

  二.同步性:Hashtable是線程安全的,也就是說是同步的,而HashMap是線程序不安全的,不是同步的

  三.值:只有HashMap可以讓你將空值作為一個表的條目的key或value 求質(zhì)數(shù)的多種優(yōu)化方式

  答:一般我們求質(zhì)數(shù)時都會去計算小于某一個數(shù)N的質(zhì)數(shù)而不會不加限定,現(xiàn)在我們以求小于N的質(zhì)數(shù)來說一說優(yōu)化方式。在我們求質(zhì)數(shù)的過程中一般會用到兩種方法試除法和篩選法兩種,現(xiàn)在下來說一下試除法:

 ?、?判斷小于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í)判斷一個數(shù)是否是質(zhì)數(shù),只需判斷一個數(shù)能不能被除了1

  ----->⑤最后,我們可以利用前面求出來的質(zhì)數(shù)來判斷,我們只需判斷X能不能

  再說篩選法:對于使用篩選法的優(yōu)化主要是從空間上考慮

 ?、俣x一個容器,將數(shù)據(jù)放入容器中,然后遍歷其中的數(shù)據(jù),將是合數(shù)的數(shù)據(jù)刪除,最后剩余的就是質(zhì)數(shù)了------>②我們可以定義一個布爾類型的數(shù)組容器,將其中的值都賦值為true,在篩選的過程中將不是質(zhì)數(shù)的數(shù)作為數(shù)組的下標(biāo)將對應(yīng)元素的值改為false,最后取出值為true的元素的下標(biāo)即可----->③構(gòu)造定長的byte數(shù)組,數(shù)組的每個byte存儲8個布爾值,這樣性能是不是又有了提

  (14) 簡述幾種排序方式(至少四種,可以從以下各個方面來比較這幾種算法,例如從時間復(fù)雜度和空間復(fù)雜度)

  高呢。冒泡排序:(Bubble Sort)冒泡排序方法是最簡單的排序方法。這種方法的基本思想是,將待排序的元素看作是豎著排列的“氣泡”,較小的元素比較輕,從而要往上浮。在冒泡排序算法中我們要對這個“氣泡”序列處理若干遍。所謂一遍處理,就是自底向上檢查一遍這個序列,并時刻注意兩個相鄰的元素的順序是否正確。如果發(fā)現(xiàn)兩個相鄰元素的順序不對,即“輕”的元素在下面,就交換它們的位置。顯然,處理一遍之后,“最輕”的元素就浮到了最高位置;處理二遍之后,“次輕”的元素就浮到了次高位置。在作第二遍處理時,由于最高位置上的元素已是“最輕”元素,所以不必檢查。一般地,第i遍處理時,不必檢查第i高位置以上的元素,因?yàn)榻?jīng)過前面i-1遍的處理,它們已正確地排好序。

  插入排序(Insertion Sort)插入排序的基本思想是,經(jīng)過i-1遍處理后,L[1..i-1]己排好序。第i遍處理僅將L插入L[1..i-1]的適當(dāng)位置,使得L[1..i]又是排好序的序列。要達(dá)到這個目的,我們可以用順序比較的方法。首

  先比較L和L[i-1],如果L[i-1]≤ L,則L[1..i]已排好序,第i遍處理就結(jié)束了;否則交換L與L[i-1]的位置,繼續(xù)比較L[i-1]和L[i-2],直到找到某一個位置j(1≤j≤i-1),使得L[j] ≤L[j+1]時為止。

  選擇排序(Selection Sort)選擇排序的基本思想是對待排序的記錄序列進(jìn)行n-1遍的處理,第 i 遍處理是將[i..n]中最小者與位置 i 交換位置。這樣,經(jīng)過 i 遍處理之后,前 i 個記錄的位置已經(jīng)是正確的了。

  快速排序(Quick Sort)快速排序是對冒泡排序的一種本質(zhì)改進(jìn)。它的基本思想是通過一趟掃描后,使得排序序列的長度能大幅度地減少。在冒泡排序中,一次掃描只能確保最大數(shù)值的數(shù)移到正確位置,而待排序序列的長度可能只減少

  1。快速排序通過一趟掃描,就能確保某個數(shù)(以它為基準(zhǔn)點(diǎn)吧)的左邊各數(shù)都比它小,右邊各數(shù)都比它大。然后又用同樣的方法處理它左右兩邊的數(shù),直到基準(zhǔn)點(diǎn)的左右只有一個元素為止。

  一、專業(yè)知識

  1、a0=1、a1=1、a2=a1+a0、a3=a2+a1,以

  此類推,請寫代碼用遞歸算出a30?

  3、簡述值類型和引用類型的區(qū)別

  值類型包括簡單 類型、結(jié)構(gòu)體類型和枚舉類型,引用類型包括自定義類、數(shù)組、接口、委托等

  他們兩在內(nèi)存中存儲的方式不同,值類型以棧的方式存儲的,引用類型以堆的方式;前者是真實(shí)的存儲空間,后者只是存儲地址的引用!

  4、簡述類中的靜態(tài)成員和非靜態(tài)成員的區(qū)別

  靜態(tài)變量使用 static 修飾符進(jìn)行聲明,在類被實(shí)例化時創(chuàng)建,通過類進(jìn)行訪問。不帶有 static 修飾符聲明的變量稱做非靜態(tài)變量,在對象被實(shí)例化時創(chuàng)建,通過對象進(jìn)行訪問。一個類的所有實(shí)例的同一靜態(tài)變量都是同一個值,同一個類的不同實(shí)例的同一非靜態(tài)變量可以是不同的值。靜態(tài)函數(shù)的實(shí)現(xiàn)里不能使用非靜態(tài)成員,如非靜態(tài)變量、非靜態(tài)函數(shù)等。

  5、什么是單例?

  一個類中只有一個實(shí)例并且自行化向整個系統(tǒng)提供這個實(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()指父類的無參構(gòu)造方法,this()指當(dāng)前類的無參構(gòu)造方法,兩者都必須寫在構(gòu)造方法的第一句

  2、Java中public,private,protected,和默認(rèn)

  的區(qū)別

  a、private修飾詞,表示成員是私有的,只有自身可以訪問;

  b、protected,表示受保護(hù)權(quán)限,體現(xiàn)在繼承,即子類可以訪問父類受保護(hù)成員,同時相同包內(nèi)的其他類也可以訪問protected成員。

  c、無修飾詞(默認(rèn)),表示包訪問權(quán)限(friendly, java語言中是沒有friendly這個修飾符的,這樣稱呼應(yīng)該是來源于c++ ),同一個包內(nèi)可以訪問,訪問權(quán)限是包級訪問權(quán)限;

  d、public修飾詞,表示成員是公開的,所有其他類都可以訪問;

  3、描述一下java的事件委托機(jī)制和垃圾回

  收機(jī)制

  java事件委托機(jī)制:一個源產(chǎn)生一個事件時,把他送到一個或多個監(jiān)聽器那里,在這種機(jī)制種,監(jiān)聽器只是等待,一旦收到事件,處理事件并返回;

  Java垃圾回收:是一種動態(tài)存儲管理技術(shù),它自動地釋放不再被程序引用的對象,按照特定的垃圾收集算法來實(shí)現(xiàn)資源自動回收的功能。當(dāng)一個對象不再被引用的時候,內(nèi)存回收它占領(lǐng)的空間,以便空間被后來的新對象使用,以免造成內(nèi)存泄露。

  什么是java序列化,如何事件java序列化 序列化就是一種用來處理對象流的機(jī)制,所謂對象流也就是將對象的內(nèi)容進(jìn)行流化。可以對流化后的對象進(jìn)行讀寫操作,也可將流化后的對象傳輸于網(wǎng)絡(luò)之間。序列化是為了解決在對對象流進(jìn)行讀寫操作時所引發(fā)的問題。

  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(重寫,覆蓋)

  1、方法名、參數(shù)、返回值相同。

  2、子類方法不能縮小父類方法的訪問權(quán)限。

  3、子類方法不能拋出比父類方法更多的異常(但子類方法可以不拋出異常)。

  4、存在于父類和子類之間。

  5、方法被定義為final不能被重寫。

  overload(重載,過載)

  1、參數(shù)類型、個數(shù)、順序至少有一個不相同。

  2、不能重載只有返回值不同的方法名。

  3、存在于父類和子類、同類中。

  Overloaded的方法不能改變返回值類型

  final類有什么特點(diǎn)

  該類不能被繼承

  寫出下面代碼的輸出結(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 的存儲性

  能好特性,HashMap和Hashtable的區(qū)別

  ArrayList和Vector都是使用數(shù)組方式存儲數(shù)據(jù),此數(shù)組元素數(shù)大于實(shí)際存儲的數(shù)據(jù)以便增加和插入元素,它們都允許直接按序號索引元素,但是插入元素要涉及數(shù)組元素移動等內(nèi)存操作,所以索引數(shù)據(jù)快而插入數(shù)據(jù)慢,Vector由于使用了synchronized方法(線程安全),通常性能上較ArrayList差,而LinkedList

  使用雙向鏈表實(shí)現(xiàn)存儲,按序號索引數(shù)據(jù)需要進(jìn)行前向或后向遍歷,但是插入數(shù)據(jù)時只需要記錄本項(xiàng)的前后項(xiàng)即可,所以插入速度較快。

  1.HashTable的方法是同步的,HashMap未經(jīng)同步,所以在多線程場合要手動同步HashMap這個區(qū)別就像Vector和ArrayList一樣。

  2.HashTable不允許null值(key和value都不可以),HashMap允許null值(key和value都可以)。

  3.HashTable有一個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"

  反對使用stop(),是因?yàn)樗话踩?。它會解除由線程獲取的所有鎖定,而且如果對象處于一種不連貫狀態(tài),那么其他線程能在那種狀態(tài)下檢查和修改它們。結(jié)果很難檢查出真正的問題所在。suspend()方法容易發(fā)生死鎖。 調(diào)用suspend()的時候,目標(biāo)線程會停下來,但卻仍然持有在這之前獲得的鎖定。此時,其他任何線程都不能訪問鎖定的資源,除非被"掛起"的線程恢復(fù) 運(yùn)行。對任何線程來說,如果它們想恢復(fù)目標(biāo)線程,同時又試圖使用任何一個鎖定的資源,就會造成

  死鎖。所以不應(yīng)該使用suspend(),而應(yīng)在自己的 Thread類中置入一個標(biāo)志,

  1.請闡述一下你對Java多線程中同步的幾

  種使用方式,區(qū)別,以及其重要性。

  同步有兩種實(shí)現(xiàn)方式

  1.同步方法

  2.同步代碼塊

  多線程的同步時為了能夠保證關(guān)鍵數(shù)據(jù)在單位時間能只能有一個線程操作,保證數(shù)據(jù)的同步性,安全性

  2.final ,finally , finalize 的區(qū)別。

  Final 有最終的不可改變的意思,可以用來修飾基本數(shù)據(jù)使之成為常

  量,該常量只能在編譯期進(jìn)行修改 。

  當(dāng)修飾對象時,則該對象引用不能改變,但該對象本身可以做修改。 當(dāng)修飾方法時,表示該方法在被繼承時不能被修改,或覆蓋

  當(dāng)修飾類時,表示該類不會別別的類繼承

  Finally 用于在Try-catch-finally語句中 finally 中的代碼塊時必須執(zhí)行的

  finalize 當(dāng)某個對象要被當(dāng)做垃圾回收時,會調(diào)用finalize()方法,該方法用于檢查對象不被運(yùn)行狀態(tài)的對象引用或間接地引用

  sleep() 和wait()有什么區(qū)別?

  Sleep()是線程中的一個方法,該方法用于控制自身線程的流程,當(dāng)

  執(zhí)行sleep()方法睡眠時保持對象鎖。

  Wait()方法是object類中的一個方法,該方法用于讓一個線程處于

  等待狀態(tài)并釋放對象鎖,當(dāng)該線程想要再次執(zhí)行時需要調(diào)用notity

  方法喚醒此線程

  4. abstact 的method是否可同時是static,

  是否可同時是native,是否可同時是synchronized ?

  不可以

  5當(dāng)一個線程進(jìn)入一個對象的Synchronized

  方法后,其他線程是否可進(jìn)入此對象的其他方法

  可以去訪問非Synchronized方法。

  6.當(dāng)一個對象被當(dāng)做參數(shù)傳遞到一個方法

  后,此方法可改變這個對象的屬性,并可返回變化后的結(jié)果,那么這里到底是值傳遞還是引用傳遞?

  值傳遞

  7.創(chuàng)建一個class對象有幾種方法?分別是

  什么?

  有三種:

  1. Class c=Class.for(“java.lang.String”);

  2. String str=new Stirng();

  Class c=Str.getClass();

  3.Class c=String.Class;

  9.如何獲取一個目錄下有多少個文件?

  File f=new File(“D://”);

  Int count=f.list().length;

  10.請寫出下列代碼的輸出結(jié)果:

  FatherClass Create

  ChildClass Create

  13.當(dāng)一個對象不再被使用時,如何才能從內(nèi)

  存中消失?

  將該對象引用值為空

點(diǎn)擊下頁還有更多>>>javaweb常見面試題及參考答案

1082023