Java常見問題整理


servlet

簡述什么是狀態管理

將客戶端(瀏覽器)與服務器之間多次交互當做一個整體來看待,並且將多次交互所涉及的數據即狀態保存下來。

 

簡述什么是Cookie

瀏覽器向web服務器發送請求時,服務器會將少量的數據以set-Cookie消息頭的方式發送給瀏覽器,瀏覽器將這些數據保存下來;當瀏覽器再次訪問服務器時,會將這些數據以Cookie消息頭的方式發送給服務器。

 

簡述什么是sessionSession的工作原理

服務器為了保存用戶狀態而創建一個特殊的對象。

瀏覽器訪問Web服務器時,服務器會為每一個瀏覽器在服務器端的內存中分配空間,單獨創建一個Session對象,該對象有一個Id屬性,其值唯一,一般稱之為Session Id,並且服務器會將這個Session Id(使用Cookie的方式)發送給瀏覽器;瀏覽器再次訪問服務器時,會將Session Id發送給服務器,服務器可以依據Session Id找到對應的Session對象。

 

簡述什么是Session超時,如何修改缺省的時間限制

Session超時指的是:Web服務器會將空閑時間過長的Session對象刪除掉,以節省服務器內存空間資源。web服務器缺省的超時時間限制:一般是30分鍾。修改Session的缺省時間限制,有如下兩種方式:

  1. 通過修改tomcatconf/web.xml 文件的設置,代碼如下所示:

2.通過編程的方式來修改,通過調用Session對象的setMaxInactiveInterval方法來修改

 

簡述什么是轉發?以及如何實現轉發

轉發是一個Web組件(Servlet/JSP)將未完成的處理通過容器轉交給另外一個Web組件繼續完成。

可以按照以下三個步驟來實現轉發:

  1. 綁定數據到request對象        2.獲得轉發器       3.轉發

簡述轉發和重定向有什么區別?

轉發和重定向的區別有以下幾點:

1. 重定向是瀏覽器發送請求並收到響應以后再次向一個新地址發請求,轉發是服務器收到請求后為了完成響應轉到一個新的組件。

2. 重定向中有兩次請求,不共享數據,轉發只產生一次請求,且在組件間共享數據。

3. 重定向后地址欄地址改變,而轉發則不會。

4. 重定向的新地址可以是任意地址,轉發到的新地址必須是同一個應用內的某地址。

 

簡述什么是Servlet

SunOracle)公司制定的一種用來擴展Web服務器功能的組件規范。

 

簡述什么是HTTP協議

HTTP協議是HyperText Transfer Protocol的簡寫,它是由w3c(萬維網聯盟)制定的一種應用層協議,用來定義瀏覽器與web服務器之間如何通信以及通信的數據格式。

 

簡述GET和POST的區別。

GETPOST的區別如下:

1. 從提交的數據量上來說,get方式會將請求參數及參數值放在請求資源路徑里面,攜帶的數據大小有限制,不適合提交大量的數據;post方式會將請求參數及參數值放在實體內容里面,理論上沒有限制,適合大量數據的提交。

2.從安全上來講,post方式相對安全(因為請求參數及值存放在實體內容里面,而get方式會將請求參數及值顯示在瀏覽器地址欄)。但是要注意,post方式並沒有將數據加密。

 

簡述什么是重定向

服務器向瀏覽器發送一個302狀態碼及一個Location消息頭(該消息頭的值是一個地址,稱之為重定向地址),瀏覽器收到后會立即向重定向地址發出請求。

 

簡述URI和URL 的區別, 如何獲取

URI,是uniform resource identifier,統一資源標識符,用來唯一的標識一個資源。而URLuniform resource locator,統一資源定位器,它是一種具體的URI,即URL可以用來標識一個資源,而且還指明了如何定位這個資源。

JavaURI中,一個URI實例可以代表絕對的,也可以是相對的,只要它符合URI的語法規則。而URL類則不僅符合語義,還包含了定位該資源的信息,因此它不能是相對的。從HttpServletRequestjavadoc中可以看出,getRequestURI方法返回一個String,比如請求為“POST /some/path.html?a=b HTTP/1.1”,則該方法返回的值為”/some/path.html”。而getRequestURL返回一個StringBuffer,是完整的請求資源路徑,不包括querystring

 

Servlet生命周期分哪幾個階段?什么時候執行?

Servlet生命周期分為四個階段,依次是實例化、初始化、就緒以及銷毀。

階段一:實例化

容器調用Servlet的構造器,創建一個Servlet對象。容器創建Servlet對象的時機有以下兩種情形:

情形1,開始容器里面沒有Servlet對象,只有收到請求后才會創建Servlet對象。

情形2,容器啟動之后就立即創建相應的實例。

階段二:初始化

容器在創建好Servlet對象之后,會立即調用該對象的init方法。該方法只會執行一次。一般情況下,我們不用寫init方法,因為GenericServlet已經提供了init方法的實現(將容器傳遞過來的ServletConfig對象保存下來,並且,提供了getServletConfig方法來獲得ServletConfig對象)

階段三:就緒

容器收到請求之后調用Servlet對象的service方法來處理請求。

階段四:銷毀

容器依據自身的算法刪除Servlet對象,刪除前會調用destroy方法。該方法只會執行一次。可以重寫destroy方法來實現自己的處理邏輯。

 

簡述什么是Servlet上下文,有哪些特點

定義:容器啟動之后,會為每一個Web應用創建唯一的一個符合ServletContext接口要求的對象,該對象就是servlet上下文。

作用:1.綁定數據 2.讀取全局的初始化參數

注:requestsessionservlet上下文都可以綁訂數據,有什么區別?

區別1: 綁訂的數據生存時間不一樣,按照生存時間的長短來排序,依次是request < session < servlet上下文。在滿足使用條件的情況下,優先使用生命周期短的。

區別2:綁訂到session對象上的數據,只有與之對應的用戶能訪問到,而綁訂到上下文上的數據,所有用戶都能訪問到。

 

Servlet是否是線程安全的,如何解決?

Servlet存在線程安全問題。容器搜到請求之后,會啟動一個線程來進行相應的處理。

默認情況下,容器只會為某個Servlet創建一個實例,如果同時有多個請求同時訪問某個Servlet則肯定會有多個線程訪問同一個Servlet實例。如果這些線程要修改Servlet實例的某個屬性,就有可能發生線程安全問題。

可以使用synchronized對代碼加鎖來解決Servlet的安全問題。

 

 簡述什么是過濾器?

過濾器是Servlet2.3規范中定義的一種小型的、可插入的Web組件。用來攔截Servlet容器的請求和響應過程,以便查看、提取客戶端和服務器之間正在交換的數據。過濾器通常是封裝了一些功能的Web組件,這些功能很重要,但對於處理客戶端請求或發送響應來說不是決定性的。典型的應用包括記錄請求和響應的數據、管理會話屬性等。

 

 簡述什么是監聽器

Servlet規范中定義的一種特殊的組件,用來監聽Servlet容器產生的事件並進行相應的處理。

 

簡述什么是EL表達式及作用

EL表達式是一套簡單的計算規則,用於給JSP標簽的屬性賦值,也可以直接用來輸出。

作用:1. 訪問Bean的屬性。  2. 輸出簡單的運算結果。  3. 獲取請求參數值。

 

簡述JSTL的作用

使用JSTL標簽的作用是可以降低代碼工作量,界面更加簡潔,便於維護。后台開發人員和前端開發人員可以分工合作,從而提高團隊開發的效率。

JSP

簡述什么是jsp

sun公司制訂的一種服務器端動態頁面技術規范。

jsp是一個以.jsp為后綴的文件,主要內容是html加少量的java代碼,容器會將jsp轉換成一個對應的Servlet然后執行。

 

什么是指令

通過指令,可以告訴容器,在將jsp轉換成Servlet時,做一些額外的處理,比如導包。

page指令(importpageEncodingpageEncodingsessionerrorPageisErrorPage

include指令(file taglib指令

 

簡述什么是pageContext(頁面上下文)

容器會為每一個jsp實例創建唯一的一個符合PageContext接口要求的對象,該對象我們可以稱之為頁面上下文。

作用:1.綁定數據(綁訂到pageContext上的數據,只有對應的jsp實例能夠訪問)

2.提供了一些方法用來獲得其它所有的隱含對象。

 

簡述jsp標簽的執行過程

容器依據標簽的命名空間找到標簽的描述文件(.tld文件),然后依據標簽的名稱找到標簽類,接下來,容器會將標簽類實例化並調用該實例的相應方法。

JDBC

 簡述JDBC的原理

JDBC( Java DataBase Connectivity,java數據庫連接 )是一種用於執行SQL語句的Java API , 可以為多種關系數據庫提供統一訪問 , 它由一組用Java語言編寫的類和接口組成。

JDBC 通過標准(一系列接口)定義了訪問數據庫的通用API,不同的數據庫廠商根據各自數據庫的特點提供了對JDBC的實現(實現類)。

 

為什么要使用數據庫連接池

如果沒有連接池,每一次業務都需要和數據庫服務器建立一次連接,業務處理完斷開連接,如果有上萬次業務就會有上萬次的開關連接,頻繁開關連接非常浪費資源,使用數據庫連接池,可以設置幾個初始連接,如果有業務需要使用連接,則從連接池中直接獲取,如果連接池中連接用光,則會等待連接歸還后再獲取連接。

 

DATABASE

簡述什么是數據庫

數據庫實際上就是一個文件集合,數據庫就是一個存儲數據的倉庫,本質就是一個文件系統,數據庫是按照特定的格式把數據存儲起來,用戶可以對存儲的數據進行增刪改查操作。

 

連接方式和關聯關系的區別

連接方式: 包括等值連接、內連接、外連接,是指關聯查詢的查詢方式

關聯關系: 指表設計時兩張表之間存在的邏輯關系包括 一對一,一對多和多對多

 

 什么是視圖,為什么使用視圖

數據庫中存在的表和視圖都是其內部的對象,視圖可以理解成是一個虛擬的表,數據來自原表,視圖本質上就是取代了一段sql語句。

因為有些數據查詢的SQL語句比較長,每次書寫比較麻煩,使用視圖可以起到sql語句重用的作用,提高開發效率,可以隱藏敏感信息。

 

什么叫數據污染

往視圖中插入一條 視圖中不可見但是在原表中存在的數據 稱為數據污染

 

什么是索引,為什么使用索引

索引是數據庫中用來提高查詢效率的技術,類似於目錄。

如果不使用索引,查詢數據時會依次遍歷每一個保存數據的磁盤塊,直到找到目標數據為止,使用索引后,磁盤塊會以樹狀結構保存,查詢數據時會大大降低磁盤塊的訪問量,從而提高查詢效率。

索引是越多越好嗎?

不是,因為索引會占用儲存空間,只對常用的查詢字段創建索引。

有索引就一定好嗎?

不一定,如果數據量小的話 添加索引反而會降低查詢效率。

 

什么叫做事務,有什么特點

數據庫中執行SQL語句的工作單元,不可拆分,可以保證同一業務中的所有SQL語句全部成功或全部失敗

事務的ACID特性

Atomicity:原子性,最小不可拆分,保證全部成功,全部失敗

Consistency:一致性,從一個一致狀態到另一個一致狀態

Isolation:隔離性, 多個事務之間互不影響

Durability:持久性,事務完成后數據提交到數據庫文件中 持久保存

Spring SpringMVC Mybatis

描述Spring框架的作用和優點

1. Spring是一個開源的輕量級的應用開發框架,其目的是用於簡化企業級應用程序開發,減少侵入;

2. Spring提供的IOC和AOP應用,可以將組件的耦合度降至最低,即解耦,便於系統日后的維護和升級;

3. Spring為系統提供了一個整體的解決方案,開發者可以利用它本身提供的功能外,也可以與第三方框架和技術整合應用,可以自由選擇采用哪種技術進行開發。

Spring的本質是管理軟件中的對象,即創建對象和維護對象之間的關系。

 

如何控制Bean對象的作用域,默認作用域是什么

1. 可以通過<bean>定義的scope屬性指定Bean對象的作用域或者使用注解@Scope指定Bean對象的作用域。

2. 默認Bean對象的作用域為singleton。

 

簡述IOC與DI

IOCInversion of control,表示控制反轉(由掌握創建並管理對象的主動權,變成了放棄創建並管理對象的主動權,而是只關心如何獲取對象,這樣的做法就叫做控制反轉。)

DIDependency Injection,表示依賴注入(由框架為屬性設置值的做法就叫做注入,為某個類依賴的對象去注入值叫做依賴注入)。

IOC是希望實現的目標,而DI是實現目標時使用的手段!即:通過使用依賴注入的做法實現了控制反轉

 

簡述SpringMVC的工作流程

1. 瀏覽器發出spring mvc請求,請求交給前端控制器DispatcherServlet處理。

2. 控制器通過HandlerMapping維護的請求和Controller映射信息,找到相應的Controller組件處理請求。

3. 執行Controller組件約定方法處理請求,在約定方法中可以調用ServiceDAO等組件完成數據庫操作。約定方法可以返回一個ModelAndView對象,封裝了模型數據和視圖名稱信息。

4. 控制器接收ModelAndView之后,調用ViewResolver組件,定位ViewJSP並傳遞Model信息,生成響應界面結果。

 

javaSE

什么是反射,有什么作用

Java反射機制是在運行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法;對於任意一個對象,都能夠調用它的任意一個方法和屬性;這種動態獲取信息以及動態調用對象的方法的功能成為java語言的反射機制。

Java反射機制主要提供了一下功能:在運行時判斷任意一個對象所屬的類;在運行時構造任意一個類的對象;在運行時判斷任意一個類所具有的成員變量和方法;在運行時調用任意一個對象的方法,生成動態代理。

 

簡述自動裝箱和拆箱的原理

裝箱和拆箱是編譯器認可的,而不是虛擬機。編譯器在生成類的字節碼時,插入必要的方法調用,自動裝箱時,調用了IntegervalueOf方法將int類型的值轉換成了Integer類型自動拆箱時,調用了IntegerintValue方法,將Integer類型的變量轉成了int類型。

 

簡述ArrayList和LinkedList的不同

List接口的兩個常見實現類為ArrayListLinkedList,分別用動態數組和鏈表的方式實現了List接口。

可以認為ArrayListLinkedList的方法在邏輯上完全一樣,只是在性能上有一定的差別,ArrayList更適合於隨機訪問而LinkedList更適合於插入和刪除;在性能要求不是特別苛刻的情形下可以忽略這個差別。

 

簡述隊列和棧的不同,以及在 Java語言中如何實現這兩個數據結構

隊列遵循先進先出(FIFOFirst Input First Output )的原則,而棧遵循先進后出(FILOFirst Input Last Output )的原則。

JDK中提供了Queue接口來實現隊列這個數據結構,同時使得LinkedList實現了該接口;同時,JDK中還提供了Deque接口來實現棧這個數據結構,而 LinkedList也實現了該接口。

 

簡述hashCode方法的意義

java.lang.Object來理解,JVM每實例化一個Object,它都會將這個Object放入到一個Hash哈希表中去,這樣的話,下次做Object的比較或者取這個對象的時候,它會根據對象的hashCode再從Hash表中取這個對象。這樣做的目的是提高取對象的效率。具體過程如下:

1) new Object(),JVM根據這個對象的hashCode值,放入到對應的Hash表對應的Key,如果不同的對象產生了相同的hash,也就是發生了Hash key相同導致沖突的情況,那么就在這個Hash key的地方產生一個鏈表,將所有產生相同hashCode的對象放到這個單鏈表上去,串在一起,就是Hash桶。

2) 比較兩個對象的時候,首先根據他們的hashCodehash表中找它的對象,當兩個對象的hashCode相同,也就是說這兩個對象放在Hash表中的同一個key,則他們一定在這個key上的鏈表上。那么此時就只能根據Objectequals方法來比較這個對象是否相等。當兩個對象的hashCode不同時,則這兩個對象一定不能相等。

 

簡述Java編譯及運行過程

首先,編譯,Java 源文件(*.java)經過Java的編譯器編譯成Java字節碼文件(*.class);然后,運行,先進行類加載和字節碼校驗,之后,Java字節碼經過JVM解釋為具體平台的具體指令,並執行。

 

名詞解釋JVM、JRE、JDK

JVM Java Virtual Machine)稱之為Java虛擬機,JVM是一種用於計算設備的規范,它是一個虛構出來的計算機,是通過在實際的計算機上仿真模擬各種計算機功能來實現的。JVM屏蔽了與具體操作系統平台相關的信息,使Java程序只需生成在Java虛擬機上運行的目標代碼(字節碼),就可以在多種平台上不加修改地運行。JVM在執行字節碼時,實際上最終還是把字節碼解釋成具體平台上的機器指令執行。

JREJava SE Runtime Environment)稱之為Java SE運行時環境,提供了運行Java應用程序所必須的軟件環境,包含有Java虛擬機(JVM)和豐富的類庫(Libraries)。運行一個已經開發好的Java應用必須安裝JRE

JDKJava Development Kit)稱為Java開發工具包,是JRE的超集,或者說JDK包含了JREJDK中除了包含有JRE的所有內容之外還提供了編寫Java程序所必須的編譯器和調試工具等。對於進行Java開發的人士一般需要下載JDK

 

請簡述while語句和do-while語句的區別

while語句和do-while語句的區別在於:while語句是先判斷循環條件,如果條件為真則執行循環體;而do-while語句則先執行一次循環體,然后才判斷循環條件,如果循環條件為真,則執行下一次循環,否則終止循環。

 

請描述類和對象的關系

對象是一個客觀存在的實體,是面向對象編程過程中分析與解決問題的出發點與基礎。對象的實質就是內存中的一塊數據存儲區域,其數據結構由定義它的類來決定。

類是用於構建對象的模板,對象通過類的實例化產生,一個類可以創建多個對象,每個對象擁有自己的數據和行為。

 

請描述引用類型和基本類型的區別

8種基本類型之外,用類名(接口、數組)聲明的變量稱為引用類型變量,簡稱“引用”。引用的功能在於訪問對象。

基本類型變量本身就包含了其實例數據,而引用類型變量中存儲的是某個對象在內存中的地址信息。當一個引用類型變量指向該類的對象時,就可以通過這個變量訪問對象。

 

簡述JVM垃圾回收機制

垃圾回收機制是Java提供的自動釋放內存空間的機制。

垃圾回收器(Garbage CollectionGC)是JVM自帶的一個線程,用於回收沒有被引用的對象。

Java程序是否會出現內存泄露

會出現內存泄漏。

一般來說內存泄漏有兩種情況。一是在堆中分配的內存,在沒有將其釋放掉的時候,就將所有能訪問這塊內存的方式都刪掉;另一種情況則是在內存對象明明已經不需要的時候,還仍然保留着這塊內存和它的訪問方式(引用)。第一種情況,在Java中已經由於垃圾回收機制的引入,得到了很好的解決。所以,Java中的內存泄漏,主要指的是第二種情況。

 

JVM如何管理內存,分成幾個部分?分別有什么用途?

JVM內存分為“堆”、“棧”和“方法區”三個區域,分別用於存儲不同的數據。

堆內存用於存儲使用new關鍵字所創建的對象;棧內存用於存儲程序運行時在方法中聲明的所有的局部變量;方法區用於存放類的信息,Java程序運行時,首先會通過類裝載器載入類文件的字節碼信息,經過解析后將其裝入方法區。類的各種信息(包括方法)都在方法區存儲。

 

簡述抽象類的意義

抽象類的意義在於:

1. 為其子類提供一個公共的父類型,避免該類被實例化;

2. 封裝子類中的重復內容(成員變量和方法);

3. 定義公共抽象方法,由子類提供不同的實現。

 

簡述接口與抽象類的區別

抽象類

1)抽象類不能被實例化

2)抽象類是對類的抽象,抽象所具有的共有特征和行為

3)抽象類所存在的目的就是用來被繼承,實現代碼的復用

4)抽象類可以有抽象方法也可以沒有抽象方法,可以像普通的類具有成員變量和方法

5)如果一個類繼承抽象類,必須實現抽象父類的抽象方法,或者子類也是一個抽象方法

接口

1)接口是比抽象類還抽象的存在,接口是抽象類的極致抽象。

2)接口中所有的方法都是public abstracht,接口中所有的變量都是public static final

3)接口主要用來定義標准。

4)接口可以多繼承。一個類可以實現多個接口。

5)接口的存在本身可以規避java不能多繼承的操作特點。

 

簡述contains方法和equals方法的關系

contains方法用於判斷給定的元素是否被包含在集合中。若包含則返回true,否則返回false。另外,在判斷給定的元素是否被包含在集合中,要使用元素的equals方法進行比較的

 

簡述RAF的兩種創建模式

RandomAccessFile在對文件進行隨機訪問操作時有兩個模式,分別為只讀模式(只讀取文件數據),和讀寫模式(對文件數據進行讀寫)

 

簡述RandomAccessFile類的read方法和write方法使用int類型存儲byte數據的方式和原因

1RandomAccessFile提供了一個可以從文件中讀取字節的方法:int read()

該方法會從文件中讀取一個byte(8) 填充到int的低八位, 24位為0, 返回值范圍正數: 0~255, 如果返回-1表示讀取到了文件末尾! 每次讀取后自動移動文件指針, 准備下次讀取。

2RandomAccessFile提供了一個可以向文件中寫出字節的方法:

void write(int d)

該方法會根據當前指針所在位置處寫入一個字節,是將參數int的”低8位”寫出。

3)使用int類型存儲byte數據,這是因為,RandomAccessFile類的read方法,能讀到的數據有257個數值,其中,0255表示數據,-1表示讀取到了文件末尾。而write方法與read方法是一對方法,因此write方法也采用了int類型。

 

簡述節點流和處理流的區別,以及Java流式輸入輸出的架構特點

1)按照流是否直接與特定的地方 (如磁盤、內存、設備等) 相連,分為節點流和處理流兩類。節點流可以從或向一個特定的地方(節點)讀寫數據;處理流是對一個已存在的流的連接和封裝,通過所封裝的流的功能調用實現數據讀寫。

2)處理流的構造方法總是以一個其他的流對象做參數。一個流對象經過其他流的多次包裝,稱為流的鏈接。

 

簡述RandomAccessFile和FileInputStream及FileOutputStream在使用中的區別

RandomAccessFile使用隨機訪問的方式,而FileInputStreamFileOutputStream使用的是流式訪問的方式。

 

簡述Serializable接口和transient關鍵字的意義

1ObjectOutputStream在對對象進行序列化時有一個要求,就是需要序列化的對象所屬的類必須實現Serializable接口。實現該接口不需要重寫任何方法。其只是作為可序列化的標志。

2)對象在序列化后得到的字節序列往往比較大,有時我們在對一個對象進行序列化時可以忽略某些不必要的屬性,從而對序列化后得到的字節序列”瘦身”。關鍵字 transient表示被該關鍵字修飾的屬性在序列化時其值將被忽略。

 

分別簡述ISR和OSW的工作原理

InputStreamReader字符輸入流。使用該流可以設置字符集,並按照指定的字符集從字節流中按照指定編碼將字節數據轉換為字符數據並讀取。

OutputStreamWriter字符輸出流。使用該流可以設置字符集,並按照指定的字符集將字符轉換為對應的字節后通過該流寫出。

 

簡述Error和Exception的區別

Java異常結構中定義有Throwable類,ExceptionError是其派生的兩個子類。其中Exception表示由於網絡故障、文件損壞、設備錯誤、用戶輸入非法等情況導致的異常;而Error表示Java運行時環境出現的錯誤,例如:JVM內存資源耗盡等。

 

簡述RuntimeException和非RuntimeException的區別

Java異常可以分為可檢測異常,非檢測異常:

1)可檢測異常:可檢測異常經編譯器驗證。對於聲明拋出異常的任何方法,編譯器將強制執行處理或聲明規則,不捕捉這個異常,則產生編譯錯誤。

2)非檢測異常:非檢測異常不遵循處理或者聲明規則。在產生此類異常時,不一定非要采取任何適當操作,編譯器不會檢查是否已經解決了這樣一個異常。

RuntimeException 類屬於非檢測異常,因為普通JVM操作引起的運行時異常隨時可能發生,此類異常一般是由特定操作引發。但這些操作在java應用程序中會頻繁出現。因此它們不受編譯器檢查與處理或聲明規則的限制。非RuntimeException為可檢測異常,該異常經編譯器驗證。

 

寫出5個常見的RuntimeException

1IllegalArgumentException拋出的異常表明向方法傳遞了一個不合法或不正確的參數

2NullPointerException當應用程序試圖在需要對象的地方使用 null 時,拋出該異常

3ArrayIndexOutOfBoundsException當使用的數組下標超出數組允許范圍時,拋出該異常

4ClassCastException當試圖將對象強制轉換為不是實例的子類時,拋出該異常

5NumberFormatException當應用程序試圖將字符串轉換成一種數值類型,但該字符串不能轉換為適當格式時,拋出該異常。

 

線程和進程的區別

線程和進程的區別如下:

1)一個進程至少有一個線程。線程的划分尺度小於進程,使得多線程程序的並發性高。
另外,進程在執行過程中擁有獨立的內存單元,而多個線程共享內存,從而極大地提高了程序的運行效率。

2)線程在執行過程中與進程的區別在於每個獨立的線程有一個程序運行的入口、順序執行序列和程序的出口。但是線程不能夠獨立執行,必須依存在應用程序中,由應用程序提供多個線程執行控制。

3)從邏輯角度來看,多線程的意義在於一個應用程序中,有多個執行部分可以同時執行。但操作系統並沒有將多個線程看做多個獨立的應用來實現進程的調度和管理以及資源分配。

 

簡述線程的狀態及其轉換

線程的狀態有五種,本別是NewRunnableBlockRunning以及Dead

線程之間的狀態轉換如下:

1New,創建一個線程,但是線程並沒有進行任何的操作。

2Runnable,新線程從New狀態,調用start方法轉換到Runnable狀態。線程調用start方法向線程調度程序(JVM或者是操作系統)注冊一個線程,這個時候一切就緒只等CPU的時間。

3Running,從Runnable狀態到Running狀態,線程調度根據調度策略的不同調度不同的線程,被調度執行的線程進入Running狀態,執行run方法。

4Dead狀態,從Running狀態到Runnablerun方法運行完畢后,線程就會被拋棄,線程就進入Dead狀態。

5Block狀態,從Running狀態到Block狀態,如果線程在運行的狀態中因為I/O阻塞、調用了線程的sleep方法以及調用對象的wait方法則線程將進入阻塞狀態,直到這些阻塞原因被結束,線程進入到Runnable狀態。

 

簡述線程的兩種創建方式以及它們的區別

創建線程的兩種方式:

1)使用Thread創建線程。Thread類是線程類,其每一個實例表示一個可以並發運行的線程。我們可以通過繼承該類並重寫run方法來定義一個具體的線程。其中重寫run方法的目的是定義該線程要執行的邏輯。啟動線程時調用線程的start()方法而非直接調用run()方法。start()方法會將當前線程納入線程調度,使當前線程可以開始並發運行。當線程獲取時間片段后會自動開始執行run方法中的邏輯。

2)使用Runnable創建線程。實現Runnable接口並重寫run方法來定義線程體,然后在創建線程的時候將Runnable的實例傳入並啟動線程。

兩種創建線程方式的區別:

使用Thread創建線程,編寫簡單,可以直接操縱線程,無需使用Thread.currentThread(),但是不能夠再繼承其他類。

使用Runnable創建線程可以將線程與線程要執行的任務分離開減少耦合,同時Java是單繼承的,定義一個類實現Runnable接口,這樣該類還可以繼承自其他類。

 

簡述yiled()、join()、sleep()、wait()的區別

yield()方法的作用是暫停當前正在執行的線程對象,把執行機會讓給相同或者更高優先級的線程,不過不能指定暫停的時間,並且也不能保證當前線程馬上停止。yield方法只是將Running狀態轉變為Runnable狀態。

join()方法的作用是父線程等待子線程執行完成后再執行,換句話說就是將異步執行的線程合並為同步的線程。

sleep()方法的作用是讓當前線程暫停指定的時間(毫秒),可以直接調用。sleep方法只是暫時的讓出CPU的執行權,但並不釋放鎖。

wait()方法的作用是將當前運行的線程掛起(即讓其進入阻塞狀態),直到notifynotifyAll方法來喚醒線程.調用wait方法后,線程是會釋放鎖。

 

簡述SAX和DOM解析方式的不同

DOM(Document Object Model, 即文檔對象模型) W3C 組織推薦的處理 XML 的一種方式。DOM解析器在解析XML文檔時,會把文檔中的所有元素,按照其出現的層次關系,解析成各個Node對象(節點)

優點:xml文件在內存中構造樹形結構,可以遍歷和修改節點

缺點:如果文件比較大,內存有壓力,解析的時間會比較長

SAXsimple API for XML)是一種XML解析的替代方法。相比於DOMSAX是一種速度更快,更有效的方法。它逐行掃描文檔,一邊掃描一邊解析。而且相比於DOMSAX可以在解析文檔的任意時刻停止解析。

優點: 解析可以立即開始,速度快,沒有內存壓力

缺點: 不能對節點做修改

 

WEB

簡要描述標准 HTML 文檔的結構。

HTML 文檔的開始需要版本聲明,剩下的頁面內容需要包含在開始標記<html>和結束標記</html>之間。在<html>元素中,包含兩個主要的部分,文件頭部分(<head>元素)和主體部分(<body>元素)。

 

簡要描述行內元素和塊級元素的區別。

塊級元素的前后都會自動換行,如同存在換行符一樣。默認情況下,塊級元素會獨占一行。例如,<p><hn><div>都是塊級元素。在顯示這些元素中間的文本時,都將從新行中開始顯示,其后的內容也將在新行中顯示。

行內元素可以和其他行內元素位於同一行,在瀏覽器中顯示時不會換行。例如,<a><span>等。

我們可以這樣理解:如果元素是塊級的,則總是在新行上顯示,好比是書中的一個新段落;而元素如果是行內的,那么只能在當前行中顯示,就像是段落中的一個單詞。

因此,塊級元素常用來構建網頁上比較大的結構,用於包含其他塊級元素、行內元素和文本;而行內元素一般只能包含其他行內元素和文本。

 

錨點的作用是什么?如何創建錨點?

錨點是文檔中某行的一個記號,類似於書簽,用於鏈接到文檔中的某個位置。當定義了錨點后,我們可以創建直接跳至該錨點(比如頁面中某個小節)的鏈接,這樣使用者就無需不停地滾動頁面來尋找他們需要的信息了。

在使用<a>元素創建錨點時,需要使用 name 屬性為其命名,代碼如下:

<a name=”anchorname1”>錨點一</a>

然后就可以創建鏈接,直接跳轉到錨點,代碼如下

<a href=”#anchorname1”>回到錨點一</a>

 

簡述 CSS 樣式表的使用方式。

HTML 頁面有三種使用 CSS 樣式表的方式:

1、內聯樣式表:樣式規定在單個的元素中,寫在元素的 style 屬性里;

2、內部樣式表:樣式定義在HTML頁面的頭元素中;

3、外部樣式表:將樣式定義在一個外部的 CSS 文件中,然后由HTML頁面引用樣式表文件。

 

如何理解 CSS 樣式表的層疊性。

CSS使用層疊(Cascade)的原則來考慮繼承、層疊次序和優先級等重要特征,從而判斷相互沖突的規則中哪個規則應該起作用。

繼承性是指,許多CSS的樣式規則不但影響選擇器所定義的元素,而且會被這些元素的后代繼承。

層疊性是指,當一個Web頁面使用多個樣式表,多個樣式表中的樣式可層疊為一個。在多個樣式表之間所定義的樣式沒有沖突的時候,瀏覽器會顯示所有的樣式。

優先級是指,當發生樣式定義沖突時,瀏覽器首先會按照不同樣式規則的優先級來應用樣式。CSS 樣式的優先級如下所示(其中數字3擁有最高的優先權):

1、瀏覽器缺省設置;

2、外部樣式表(.css 文件)或者內部樣式表(位於<head>元素內部);

3、內聯樣式(作為某個元素的style屬性的值)。

同等優先級下,以最后定義的樣式為准。

 

CSS 選擇器中,元素選擇器和類選擇器的區別是什么?

元素選擇器是最常見的 CSS 選擇器,即,文檔的元素就是最基本的選擇器。選擇器通常是某個HTML元素,比如<p><h1><em><a>等,甚至可以是<html>元素本身。

類選擇器用於將樣式規則與附帶class屬性的元素匹配,其中該class屬性的值為類選擇器中指定的值。使用類選擇器時,首先需要定義樣式類,其語法為:.className {  }

所有能夠附帶class屬性的元素都可以使用此樣式聲明。只需要將class屬性的值設置為“className”,則可以將類選擇器的樣式與元素關聯。

在實際使用時,如果需要為某種元素定義樣式,則往往使用元素選擇器;如果要應用樣式而不考慮具體設計的元素,最常用的方法就是使用類選擇器。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM