Java面試

什么是不可變對象

  • 不可變對象是指對象一旦被創(chuàng)建,狀態(tài)就不能再改變。任何修改都會創(chuàng)建一個新的對象,如String,Integer及其它包裝類

& 和 && 的區(qū)別

  • &是位運算符,而&&是邏輯運算符。邏輯運算符具有短路特性,而&不具備短路特性

final與static關鍵字可以用于哪里?他們的作用是什么

  • final:修飾變量,值不可被修改;修飾方法,方法無法被重寫;修飾類無法被繼承
  • static修飾變量,靜態(tài)變量可直接用類名訪問;修飾方法,可直接通過類名調(diào)用

抽象類是否可以繼承具體類

  • 抽象類可以繼承具體類,但前提是實體類必須有明確的構造函數(shù)

抽象類中是否可以用靜態(tài)的main方法

抽象類中可以用靜態(tài)的main方法,如果定義一個抽象方法test(),并且在main方法中用到這個抽象方法test()時就不能用了

HashMap和HashTable的區(qū)別

  • HashTable是線程安全的,HashMap不是;HashMap中允許存在null鍵和null值,而HashTable中不允許

什么是類的反射機制

  • 動態(tài)獲得對象
  • 通過類(Class對象),可以得出當前類的fields、method、construtor、interface、superClass、modified等,同時可以通過類實例化一個實例、設置屬性、喚醒方法。Spring中一切都是反射、struts、Hibernate等都是通過反射進行開發(fā)的

類的反射機制中的包及核心類

  • java.lang.Class
  • java.lang.refrection.Method
  • java.lang.refrection.Field
  • java.lang.refrection.Constructor
  • java.lang.refrection.Modifier
  • java.lang.refrection.Interface

Servlet的生命周期

  • Servlet生命周期包括三部分:
  • 初始化:web容器加載servlet,調(diào)用init()方法
  • 處理請求:通過調(diào)用service()方法實現(xiàn),根據(jù)請求的不同調(diào)用不同的do***()(doGet()或doPost())方法
  • 銷毀:當服務器決定將實例銷毀的時候調(diào)用其destroy()方法

什么情況下調(diào)用doGet()和doPost()?

  • jsp頁面中的form標簽里的method屬性為get時調(diào)用doGet(),為post時調(diào)用doPost()

JSP與Servlet有什么區(qū)別

  • Servlet是服務器端的程序,動態(tài)生成html頁面發(fā)送到客戶端,但是這樣程序里會有很多out.println(),java與html語言混在一起很亂,所以后來sun公司推出了JSP,其實JSP就是Servlet,每次運行的時候JSP都首先被編譯成servlet文件,然后再被編譯成.class文件運行。有了JSP,在MVC項目中servlet不再負責動態(tài)生成頁面,轉而去負責控制程序邏輯的作用,控制JSP與JavaBean之間的流轉

四種會話跟蹤技術作用域

  • page:一個頁面
  • request:一次請求
  • session:一次會話
  • application:服務器從啟動到停止

四種會話跟蹤技術

  • page:是代表與一個頁面相關的對象和屬性。一個頁面由一個編譯好的Java Servlet類(可以帶有任何的include指令,但是沒有include動作)表示。這即包括Servlet又包括被編譯成Servlet的頁面
  • request是代表與web客戶端發(fā)送的一個請求相關的對象和屬性。一個請求可以跨越多個頁面,涉及多個web組件
  • session代表與用于某個web客戶端的一個用戶體驗相關的對象和屬性,一個web會話可以也經(jīng)常會跨越多個客戶機請求
  • application是代表與整個web應用程序相關的對象和屬性,這實際上是跨越多個web應用程序,包括多個頁面、請求和會話的一個全局作用域

forward和redirect的區(qū)別

轉發(fā)與重定向

  • 從地址欄顯示來說
    1)forward是服務器請求資源,服務器直接訪問目標地址的URL,把那個URL的響應內(nèi)容讀取過來,然后把這些內(nèi)容再發(fā)給瀏覽器。瀏覽器不知道服務器發(fā)送的內(nèi)容是從哪里來的,所以它的地址欄還是原來的地址。
    2)redirect是服務端根據(jù)邏輯,發(fā)送一個狀態(tài)碼,告訴瀏覽器重新去請求那個地址。所以地址欄顯示的是新的URL。
  • 從數(shù)據(jù)共享來說
    1)forward:轉發(fā)頁面和轉發(fā)到的頁面可以共享request里面的數(shù)據(jù)
    2)redirect:不能共享數(shù)據(jù)
  • 從運用地方來說
    1)forward:一般用于用戶登錄的時候,根據(jù)角色轉發(fā)到相應的模塊
    2)redirect:一般用于用戶注銷登錄時返回主頁和跳轉到其他的網(wǎng)站等
  • 從效率來說
    1)forward:高
    2)redirect:低

為什么在session少放對象

  • 因為session底層是由cookie實現(xiàn)的,當客戶端的cookie被禁用后,session也會失效,且應盡量少向session中保存信息,session的數(shù)據(jù)保存在服務器端

JSP和Servlet有哪些相同點和不同點

  • JSP時Servler技術的擴展,本質上是Servlet的簡易方式,更強調(diào)應用的外部表達。JSP編譯后是"類 Servlet"。Servlet和JSP最主要的不同點在于Servlet的應用邏輯是在Java文件中,并且完全從表達層中HTML里分離出來,而JSP是Java和HTML結合成一個擴展名為.jsp的文件,JSP側重于視圖,Servlet側重于控制邏輯。

Tomcat有幾種部署項目的方式

  • 部署項目的第一種方式(項目直接放入webapps目錄中)

    1、將編寫并編譯好的web項目(注意要是編譯好的,如果是eclipse,可以將項目達成war包放入),放入到webapps中
    image.png

2、啟動tomcat服務器(雙擊tomcat路徑\bin目錄下的startup.bat,啟動服務器)

image.png

3、在瀏覽器輸入:http://localhost:端口號/項目名/訪問的文件名
image.png

  • 部署項目的第二種方式(修改conf/server.xml文件)

    1、打開tomcat下conf/server.xml,在<Host></Host>標簽之間輸入項目配置信息
    image.png

    參數(shù)說明:

    ① path:瀏覽器訪問時的路徑名
    ② docBase:web項目的WebRoot所在的路徑,注意是WebRoot的路徑,不是項目的路徑。其實就是編譯后的項目
    ③reloadble:設定項目有改動時,tomcat是否重新加載該姓名

    2、雙擊startup.bat,啟動tomcat服務器然后在瀏覽器輸入訪問的項目名稱路徑
    image.png

注意:如果你配置的 path="/xx",那么訪問的時候就是這樣:

image.png

  • 部署項目的第三種方式(E:\apache-tomcat-9.0.12\conf\Catalina\localhost)

    1、進入到E:\apache-tomcat-9.0.12\conf\Catalina\localhost目錄,新建一個項目名.xml文件
    image.png

    2、在那個新建的xml中間中,添加下面配置語句(和上面的是一樣的,但是不需要 path 配置,加上也沒什么用)

<Context docBase="D:/WebProject" reloadable="true" />

image.png

3、在瀏覽器輸入路徑:localhost:8080/xml文件名/訪問的文件名
image.png

總結:

  • 第一種方法比較普通,但是我們需要將編譯好的項目重新 copy 到 webapps 目錄下,多出了兩步操作

  • 第二種方法直接在 server.xml 文件中配置,但是從 tomcat5.0版本開始后,server.xml 文件作為 tomcat 啟動的主要配置文件,一旦 tomcat 啟動后,便不會再讀取這個文件,因此無法再 tomcat 服務啟動后發(fā)布 web 項目

  • 第三種方法是最好的,每個項目分開配置,tomcat 將以\conf\Catalina\localhost 目錄下的 xml 文件的文件名作為 web 應用的上下文路徑,而不再理會 <Context>中配置的 path 路徑,因此在配置的時候,可以不寫 path。

通常使用第三種方法

Servlet相關API

  1. request.getParameter() 返回客戶端的請求參數(shù)的值
  2. request.getParameterNames() 返回所有可用屬性名的枚舉
  3. request.getParameterValues() 返回包含參數(shù)的所有值的數(shù)組
  • request.getAttribute()request.getParameter()區(qū)別
    用途上:
    • request.getAttribute(),一般用于獲取request域對象的數(shù)據(jù)(在跳轉之前把數(shù)據(jù)實用setAttribute來放到request對象上)
    • request.getParameter(),一般用于獲取客戶端提交的參數(shù)
      存儲數(shù)據(jù)上:
    • request.getAttribute()可以獲取Object對象
    • request.getParameter() 只能獲取字符串(這就是為什么它一般用于獲取客戶端提交數(shù)據(jù))

session和cookie的區(qū)別

  • 從隱式安全上比較
    • cookie存儲在瀏覽器中,對客戶端是可見的。信息容易泄露出去。如果使用cookie最好將cookie加密
    • session存儲在服務器上,對客戶端是透明的。不存在敏感信息泄露問題
  • 從有效期上比較
    • cookie保存在硬盤中,只需要設置maxAge屬性為比較大的正整數(shù),即使關閉瀏覽器,cookie還是存在的
    • session的保存在服務器中,設置maxInactiveInterval屬性值來確定session的有效期。并且session依賴于名為JSESSIONID的cookie,該cookie默認的maxAge屬性為-1。如果關閉了瀏覽器,該session雖然沒有從服務器中消亡,但也失效了。

Servlet安全性問題

  • 由于Servlet是單例的,當多個 用戶訪問Servlet的時候,服務器會為每個用戶創(chuàng)建一個線程。當多個用戶并發(fā)訪問Servlet共享資源的時候就會出現(xiàn)線程安全問題。
  • 規(guī)則:
    1. 如果一個變量需要多個用戶共享,則應當在訪問該變量的時候,加同步機制synchronized(對象){}
    2. 如果一個變量不需要共享,則直接在doGet()或者doPost(),這樣不會存在線程安全問題

JSP有哪些動作以及作用是什么?

  • jsp:include:在頁面被請求的時候引入一個文件
  • jsp:useBean:尋找或者實例化 一個JavaBean
  • jsp:setProperty:設置JavaBean的屬性
  • jsp:getProperty:輸出某個JavaBean的屬性
  • jsp:forwar:把請求轉到一個新的頁面
  • jsp:plugin:根據(jù)瀏覽器類型為Java查詢生成OBJECT或EMBED標記
  • jsp:param:動作(傳遞參數(shù)):到達跳轉頁面也可以通過request.getParameter("參數(shù)名")方式取出參數(shù)值

jsp有哪些內(nèi)置對象

  • request
  • response
  • pageContext
  • session
  • application
  • out
  • config
  • page
  • exception

如何配置Servlet

  • Servlet的聲明:
<servlet>
    <servlet-name>servlet的名字</servlet-name>
    <servlet-class>servlet的完整類名</servlet-class>
</servlet>
  • Servlet訪問方式的聲明
<servlet-mapping>
    <servlet-name>servlet的名字(應該和聲明的名字保持一致)</servlet-name>
    <url-pattern>訪問路徑</url-pattern>
</servlet-mapping>

JSP中動態(tài)include和靜態(tài)include有什么區(qū)別?

  • 靜態(tài)include指令用于把另一個頁面包含到當前頁面中,在轉換成servlet的時候包含進去的。
    動態(tài)include用jsp:include動作失效<jsp:include page="included.jsp" flush="true"/>它總是會檢查所含文件中的變化,適合用于包含動態(tài)頁面,并且可以帶參數(shù)
  • 靜態(tài)包含:將兩個頁面編譯成一個class,里面的資源可共享
    動態(tài)包含:將兩個頁面編譯成兩個獨立的class,里面的資源無法共享

JSP如何處理JSON

  • 在JSP總處理JSON,通常需要配套使用jQuery控件,并且導入一些Common jar包。使用jQuery控件是因為它能有效的解析并且展示JSON數(shù)據(jù)。

如何處理Servlet的線程不安全問題

  • 不適用字段變量
  • 使用final修飾變量
  • 線程安全就是多線程操作同一個對象不會有問題,線程同步一般來保護線程安全

判斷瀏覽器是否支持Cookie

  • 可以使用JavaScript的方法navigator.cookieEnabled判斷瀏覽器是否支持cookie

JSP頁面跳轉

  • JSP頁面跳轉有兩種方式,forward和redirect(轉發(fā)和重定向)

404、500、304分別是什么意思

  • 404:找不到URL請求的路徑,一般是工程名不對或者拼寫錯誤
  • 500:服務器內(nèi)部錯誤,一般是服務器內(nèi)部代碼編寫錯誤,也有可能是拋異常導致
  • 304:表示瀏覽器端有緩存,并且服務端未更新,不用向服務器端請求資源

Servlet監(jiān)聽器的作用

  • Servlet監(jiān)聽器對特定的事件進行監(jiān)聽,當產(chǎn)生這些事件的時候,會執(zhí)行監(jiān)聽器的代碼??梢詫玫募虞d、卸載,對session的初始化、銷毀,對session中值的變化等事件進行監(jiān)聽

四大共享范圍:

  • application:全局作用范圍,整個應用程序共享,就是在部署文件總的同一個webApp共享,生命周期為:應用程序啟動到停止
  • session:會話作用域,當用戶首次訪問時,產(chǎn)生一個新的會話,以后服務器就可以記住這個會話狀態(tài)。生命周期:會話超時,或者服務器強制使session會話失效
  • request:請求作用,就是客戶端的一次請求
  • page:一個JSP頁面
    以上作用范圍越來越小,request和page的生命周期都是短暫的,它們之間的區(qū)別就是:一個request可以包含多個page頁(include、forward和filter)

我們沒有寫Servlet的構造方法,那么容器是怎么創(chuàng)建Servlet的實例?

  • 容器會自動為Servlet寫一個無參的構造方法,并通過Class.forName(className).newInstance()來創(chuàng)建Servlet實例。

Document對象常用方法:

  • getElementById():返回擁有指定id的第一個對象的引用
  • getElementsByName():返回帶有指定名稱的對象的集合
  • getElementsByTagName():返回帶有指定標簽名的對象的集合
  • getElementsByClassName():返回帶有指定類名的對象的集合
  • write():向文檔寫文本、HTML或JavaScript代碼

spring中BeanFactory和ApplicationContext的區(qū)別

BeanFactory ApplicationContext
使用懶加載 使用即使加載
使用語法顯示提供資源對象 自己創(chuàng)建和管理資源對象
不支持國際化 支持國際化
不支持基于依賴的注解 支持基于依賴的注解

Ajax的原理和實現(xiàn)步驟

  • Ajax即"Asynchronous JavaScript And XML"(異步JavaScript和XML),通過在后臺與服務器進行少量數(shù)據(jù)交換,可以使網(wǎng)頁實現(xiàn)異步更新。這意味著可以在不重新加載整個網(wǎng)頁的情況下,對網(wǎng)頁的某部分進行跟新
  • 原理:HTTP協(xié)議的異步通信
  • 實現(xiàn)步驟:
    創(chuàng)建XMLHttpRequest對象
    注冊回調(diào)函數(shù)
    設置連接信息
    發(fā)送數(shù)據(jù),與服務器開始交互
    接受服務器返回數(shù)據(jù)

數(shù)據(jù)庫的分類及常用的數(shù)據(jù)庫

  • 數(shù)據(jù)庫分為:關系型數(shù)據(jù)庫和非關系型數(shù)據(jù)庫
  • 關系型:MySQL、Oracle、SQL server等
  • 非關系型:redis、memcache、mogodb、Hadoop等

事務四個基本特征或ACID特性

事務必須滿足四大特征:原子性、一致性、隔離性、持久性/持續(xù)性

  • 原子性:表示事務內(nèi)操作不可分割。要么都成功、要么都是失敗
  • 一致性:要么都成功、要么都是失敗。后面的失敗了要對前面的操作進行回滾
  • 隔離性:一個事務開始后,不能被其他事務干擾
  • 持久性/持續(xù)性:表示事務開始了,就不能終止

如何實現(xiàn)對象克隆

  • 1.實現(xiàn)Cloneable接口并重寫Object類中的clone()方法
  • 2.實現(xiàn)Serializable接口,通過對象的序列化和反序列化實現(xiàn)克隆

線程的生命周期

  • 新建(New)、就緒(Runnable)、運行(Running)、阻塞(Blocked)和死亡(Dead)五種狀態(tài)

Java類實現(xiàn)序列化有幾種方法

  • 實現(xiàn)Serializable接口或實現(xiàn)Externalizable

在Collection框架中實現(xiàn)排序,要實現(xiàn)什么樣的接口

  • Collection框架中實現(xiàn)比較要實現(xiàn)Comparable接口或Comparator接口,并實現(xiàn)比較方法

解釋Serializable接口的作用

  • Serializable接口描述啟動其序列化功能,未實現(xiàn)此接口的類將無法使其任何狀態(tài)序列化或反序列化。Serializable接口沒有方法或字段,僅用于標識可序列化,標識實現(xiàn)了該接口的對象屬性可被序列化

集合

  • 集合類存放于java.util包中
  • 集合類存放的都是對象的引用,,而非對象本身,出于表達上的便利,稱集合中的對象就是指集合中對象的引用(reference)
  • 集合類型主要有3種:set、list和map
  • 集合接口分為:Colleection和Map,list、set實現(xiàn)了Collection接口

實現(xiàn)Set接口的常用類有

  • HashSet類(底層數(shù)據(jù)結構是數(shù)組 + 單鏈表 + 紅黑樹,無序)
  • LinkedHashSet(底層數(shù)據(jù)結構是數(shù)組 + 單鏈表 + 紅黑樹 + 雙向鏈表,無序)
  • TreeSet(底層數(shù)據(jù)結構紅黑樹,有序)

什么是不可變對象

  • 不可變對象是指對象一旦被創(chuàng)建,狀態(tài)就不能再改變。任何修改都會創(chuàng)建一個新的對象,如String、Integer及其它包裝類

Java中的final關鍵字有哪些用法

  • 修飾類:表示該類不能被繼承
  • 修飾方法:表示方法不能被重寫
  • 修飾變量:表示變量只能一次賦值以后值不能被修改(常量)

常見的運行時異常

  • ArithmeticException(算術異常)
  • ClassCaseException(類轉換異常)
  • IllegalArgumentException(非法參數(shù)異常)
  • IndexOutOfBoundsException(下標越界異常)
  • NullPointerException(空指針異常)

什么是線程安全

  • 如果代碼所在的進程中有多個線程在同時運行,而這些線程可能會同時運行這段代碼。如果每次運行結果和單線程運行的結果是一樣的,而且其他的變量的值也和預期的是一樣的,就是線程安全的。一個線程安全的計數(shù)器類的同一個實例對象在被多個線程使用的情況下也不會出現(xiàn)計算失誤。

Vector是一個線程安全類?

  • Vector是用同步方法來實現(xiàn)線程安全的,而和它相似的ArrayList不是線程安全的

集合框架中的泛型有什么優(yōu)點

  • 避免了在運行時出現(xiàn)ClassCaseException
  • 使代碼更整潔
  • 不會產(chǎn)生類型檢查的字節(jié)碼指令,給運行時帶來好處

如果兩個建的hashcode相同,如何獲取值對象

  • 當我們調(diào)用get()方法,HashMap會使用鍵對象的hashcode找到bucket位置,然后會調(diào)用keys.equals()方法去找到鏈表中正確的節(jié)點,最終找到要找的值對象

為什么Map接口不繼承Collection接口

  • 盡管Map接口和它的實現(xiàn)也是集合框架的一部分,但Map不是集合,集合也不是Map。因此,Map繼承Collection毫無意義。如果Map繼承Collection接口,那么元素去哪兒?Map包含key-value鍵值對,它提供抽取key或value列表集合的方法,但是它不適合"一組對象"規(guī)范
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內(nèi)容