1. finally什麼時候執行?html
1.try和catch語句
●將要處理的代碼放入try塊中,而後建立相應的catch塊的列表。若是生成都異常與catch中提到的相匹配,那麼catch條件中的塊語句就被執行。try塊後可能有許多catch塊,每一個都處理不一樣的異常。每一個catch中的參數都是Exception的子類。
2.finally語句
●finally語句定義一個老是執行的代碼,而不考慮異常是否被捕獲。
3.throw引發一個異常 java
2. java中有兩種傳遞方式。值傳遞和引用傳遞, 基本類型和以String str="aa"這種方式建立的字符串都是值傳遞,對象,數組等是引用傳遞。c++
3. java中子類的初始化程序員
類從被加載到虛擬機內存中開始,到卸載出內存爲止,它的整個生命週期包括:加載(Loading)、驗證(Verification)、準備(Preparation)、解析(Resolution)、初始化(Initialization)、使用(Using)和卸載(Unloading)7個階段。其中準備、驗證、解析3個部分統稱爲鏈接(Linking)。如圖所示。
加載、驗證、準備、初始化和卸載這5個階段的順序是肯定的,類的加載過程必須按照這種順序循序漸進地開始,而解析階段則不必定:它在某些狀況下能夠在初始化階段以後再開始,這是爲了支持Java語言的運行時綁定(也稱爲動態綁定或晚期綁定)。如下陳述的內容都已HotSpot爲基準。web
在加載階段(能夠參考java.lang.ClassLoader的loadClass()方法),虛擬機須要完成如下3件事情:數據庫
加載階段和鏈接階段(Linking)的部份內容(如一部分字節碼文件格式驗證動做)是交叉進行的,加載階段還沒有完成,鏈接階段可能已經開始,但這些夾在加載階段之中進行的動做,仍然屬於鏈接階段的內容,這兩個階段的開始時間仍然保持着固定的前後順序。設計模式
驗證是鏈接階段的第一步,這一階段的目的是爲了確保Class文件的字節流中包含的信息符合當前虛擬機的要求,而且不會危害虛擬機自身的安全。
驗證階段大體會完成4個階段的檢驗動做:數組
驗證階段是很是重要的,但不是必須的,它對程序運行期沒有影響,若是所引用的類通過反覆驗證,那麼能夠考慮採用-Xverifynone參數來關閉大部分的類驗證措施,以縮短虛擬機類加載的時間。安全
準備階段是正式爲類變量分配內存並設置類變量初始值的階段,這些變量所使用的內存都將在方法區中進行分配。這時候進行內存分配的僅包括類變量(被static修飾的變量),而不包括實例變量,實例變量將會在對象實例化時隨着對象一塊兒分配在堆中。其次,這裏所說的初始值「一般狀況」下是數據類型的零值,假設一個類變量的定義爲:服務器
1
|
publicstaticintvalue=123;
|
那變量value在準備階段事後的初始值爲0而不是123.由於這時候還沒有開始執行任何java方法,而把value賦值爲123的putstatic指令是程序被編譯後,存放於類構造器()方法之中,因此把value賦值爲123的動做將在初始化階段纔會執行。
至於「特殊狀況」是指:public static final int value=123,即當類字段的字段屬性是ConstantValue時,會在準備階段初始化爲指定的值,因此標註爲final以後,value的值在準備階段初始化爲123而非0.
解析階段是虛擬機將常量池內的符號引用替換爲直接引用的過程。解析動做主要針對類或接口、字段、類方法、接口方法、方法類型、方法句柄和調用點限定符7類符號引用進行。
類初始化階段是類加載過程的最後一步,到了初始化階段,才真正開始執行類中定義的java程序代碼。在準備極端,變量已經付過一次系統要求的初始值,而在初始化階段,則根據程序猿經過程序制定的主管計劃去初始化類變量和其餘資源,或者說:初始化階段是執行類構造器<clinit>()方法的過程.
4. equal和==的區別
答:
equals只是進行值判斷不對類是否是同一個引用不進行判斷,而==判斷包括值和類引用.經過String a = "1234"這種產生的字面字符串,若是內存中存在字符串「1234」則會直接引用,若是沒有則分配內存,所以a==b的結果爲true。而String c = new String("1234"),則會分配內存控件存儲字符串,不考慮以前是否存在。所以a==c的結果false.因爲a和c的值都是"1234"所以a.equals(c)的結果爲true.同時Integer中也是相似的原理,所以使用Integer a = 12;時會在某種狀況下提升程序的性能。
5. java中類型轉換:
6. 關於TLS(線程局部存儲)
概念:線程局部存儲(Thread Local Storage,TLS)用來將數據與一個正在執行的指定線程關聯起來。
進程中的全局變量與函數內定義的靜態(static)變量,是各個線程均可以訪問的共享變量。在一個線程修改的內存內容,對全部線程都生效。這是一個優勢也是一個缺點。說它是優勢,線程的數據交換變得很是快捷。說它是缺點,一個線程死掉了,其它線程也性命不保; 多個線程訪問共享數據,須要昂貴的同步開銷,也容易形成同步相關的BUG。
若是須要在一個線程內部的各個函數調用都能訪問、但其它線程不能訪問的變量(被稱爲static memory local to a thread 線程局部靜態變量),就須要新的機制來實現。這就是TLS。
線程局部存儲在不一樣的平臺有不一樣的實現,可移植性不太好。幸虧要實現線程局部存儲並不難,最簡單的辦法就是創建一個全局表,經過當前線程ID去查詢相應的數據,由於各個線程的ID不一樣,查到的數據天然也不一樣了。大多數平臺都提供了線程局部存儲的方法,無須要咱們本身去實現:
功能:它主要是爲了不多個線程同時訪存同一全局變量或者靜態變量時所致使的衝突,尤爲是多個線程同時須要修改這一變量時。爲了解決這個問題,咱們能夠經過TLS機制,爲每個使用該全局變量的線程都提供一個變量值的副本,每個線程都可以獨立地改變本身的副本,而不會和其它線程的副本衝突。從線程的角度看,就好像每個線程都徹底擁有該變量。而從全局變量的角度上來看,就好像一個全局變量被克隆成了多份副本,而每一份副本均可以被一個線程獨立地改變。
分類:動態TLS和靜態TLS。
用途:動態TLS和靜態TLS這兩項技術在建立DLL的時候更加有用,這是由於DLL一般並不知道它們被連接到的應用程序的結構是什麼樣的。
1. 若是應用程序高度依賴全局變量或靜態變量,那麼TLS能夠成爲咱們的救生符。於是最好在開發中最大限度地減小對此類變量的使用,更多的依賴於自動變量(棧上的變量)和經過函數參數傳入的數據,由於棧上的變量始終都是與某個特定的線程相關聯的。若是不使用此類變量,那麼就能夠避免使用TLS。
2. 可是在編寫應用程序時,咱們通常都知道本身要建立多少線程,本身會如何使用這些線程,而後咱們就能夠設計一些替代方案來爲每一個線程關聯數據,或者設計得好一點的話,可使用基於棧的方法(局部變量)來爲每一個線程關聯數據。
因此:關於TLS,說法正確的是(ABD)
A 解決多線程中的對同一變量的訪問衝突的一種技術
B TLS會爲每個線程維護一個和該線程綁定的變量的副本
C 每個線程都擁有本身的變量副本,從而也就沒有必要對該變量進行同步了
D Java平臺的java.lang.ThreadLocal是TLS技術的一種實現
對於C : 若是是靜態變量是共享的話,那必須同步,不然儘管有副本,仍是會出錯,故C錯
7.
若是一個類聲明爲protected,它的子類是能夠訪問它的,若是它和子類不在一個包中,子類仍然能夠訪問該類
集合中線程安全的類有:vector,stack,hashtable,enumeration,除此以外均是非線程安全的類與接口
13. Servlet的生命週期能夠分爲初始化階段,運行階段和銷燬階段三個階段:
Servlet的生命週期通常能夠用三個方法來表示:
初始化階段:Servlet啓動,會讀取配置文件中的信息,構造指定的Servlet對象,建立ServletConfig對象,將ServletConfig做爲參數來調用init()方法。
Servlet(Server Applet),全稱Java Servlet,未有中文譯文。是用Java編寫的服務器端程序。其主要功能在於交互式地瀏覽和修改數據,生成動態Web內容。狹義的Servlet是指Java語言實現的一個接口,廣義的Servlet是指任何實現了這個Servlet接口的類,通常狀況下,人們將Servlet理解爲後者。 Servlet運行於支持Java的應用服務器中。從原理上講,Servlet能夠響應任何類型的請求,但絕大多數狀況下Servlet只用來擴展基於HTTP協議的Web服務器。 這個過程爲: 1) 客戶端發送請求至服務器端; 2) 服務器將請求信息發送至 Servlet; 3) Servlet 生成響應內容並將其傳給服務器。響應內容動態生成,一般取決於客戶端的請求; 4) 服務器將響應返回給客戶端。
14. 關鍵字
15. 關於C++中的虛類和Java接口
答:
16. 虛類和接口的區別
17. 在運行時,由java解釋器自動引入,而不用import語句引入的包是:java.lang
答:
//HashMap的源碼 public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable ----------------------------------- //Hashtable的源碼 public class Hashtable<K,V> extends Dictionary<K,V> implements Map<K,V>, Cloneable, java.io.Serializable
public V put(K key, V value) //HashMap的put方法,沒有同步 public synchronized V put(K key, V value) //Hashtable的put方法 //固然,Hashtable的其餘方法,如get,size,remove等方法, //都加了synchronized關鍵詞同步操做
HashMap容許將null做爲一個entry的key或者value,而Hashtable不容許。
//Hashtable的put方法有如下語句塊,大夥看了都知道 // Make sure the value is not null if (value == null) { throw new NullPointerException(); } //那麼,咱們再來看下HashMap的put方法中,有以下語句 //調用某個方法直接把key爲null,值爲value的鍵值對插入進去。 if (key == null) return putForNullKey(value);
//如下是Hashtable的方法 public synchronized boolean contains(Object value) public synchronized boolean containsKey(Object key) public boolean containsValue(Object value) //如下是HashMap中的方法,注意,沒有contains方法,因此,D錯誤 public boolean containsKey(Object key) public boolean containsValue(Object value)
由全部HashMap類的「collection 視圖方法」所返回的迭代器都是快速失敗的:在迭代器建立以後,若是從結構上對映射進行修改,除非經過迭代器自己的 remove 方法,其餘任什麼時候間任何方式的修改,迭代器都將拋出ConcurrentModificationException。Hashtable和HashMap的區別主要是前者是同步的,後者是快速失敗機制保證
19. 關於java實例變量,局部變量,類變量和final變量
20. 關於java threadlocal
21. 有關JVM內存
22. 建立線程對象兩種方式:
23. 方法的重寫(override)兩同兩小一大原則:
24. J2EE中經常使用名詞解釋
1.web容器:給處於其中的應用程序組件(JSP,SERVLET)提供一個環境,使JSP,SERVLET直接和容器中的環境變量接接口互,沒必要關注其它系統問題。主要有WEB服務器來實現。例如:TOMCAT,WEBLOGIC,WEBSPHERE等。該容器提供的接口嚴格遵照J2EE規範中的WEB APPLICATION 標準。咱們把遵照以上標準的WEB服務器就叫作J2EE中的WEB容器。
2.Web container:實現J2EE體系結構中Web組件協議的容器。這個協議規定了一個Web組件運行時的環境,包括安全,一致性,生命週期管理,事務,配置和其它的服務。一個提供和JSP和J2EE平臺APIs界面相同服務的容器。一個Web container 由Web服務器或者J2EE服務器提供。
3.EJB容器:Enterprise java bean 容器。更具備行業領域特點。他提供給運行在其中的組件EJB各類管理功能。只要知足J2EE規範的EJB放入該容器,立刻就會被容器進行高效率的管理。而且能夠經過現成的接口來得到系統級別的服務。例如郵件服務、事務管理。一個實現了J2EE體系結構中EJB組件規範的容器。 這個規範指定了一個Enterprise bean的運行時環境,包括安全,一致性,生命週期,事務, 配置,和其餘的服務。
4.JNDI:(Java Naming & Directory Interface)JAVA命名目錄服務。主要提供的功能是:提供一個目錄系統,讓其它各地的應用程序在其上面留下本身的索引,從而知足快速查找和定位分佈式應用程序的功能。
5.JMS:(Java Message Service)JAVA消息服務。主要實現各個應用程序之間的通信。包括點對點和廣播。
6.JTA:(Java Transaction API)JAVA事務服務。提供各類分佈式事務服務。應用程序只需調用其提供的接口便可。
7.JAF:(Java Action FrameWork)JAVA安全認證框架。提供一些安全控制方面的框架。讓開發者經過各類部署和自定義實現本身的個性安全控制策略。
8.RMI/IIOP:(Remote Method Invocation /internet對象請求中介協議)他們主要用於經過遠程調用服務。例如,遠程有一臺計算機上運行一個程序,它提供股票分析服務,咱們能夠在本地計算機上實現對其直接調用。固然這是要經過必定的規範才能在異構的系統之間進行通訊。RMI是JAVA特有的。RMI-IIOP出現之前,只有RMI和CORBA兩種選擇來進行分佈式程序設計。RMI-IIOP綜合了RMI和CORBA的優勢,克服了他們的缺點,使得程序員能更方便的編寫分佈式程序設計,實現分佈式計算。首先,RMI-IIOP綜合了RMI的簡單性和CORBA的多語言性(兼容性),其次RMI-IIOP克服了RMI只能用於Java的缺點和CORBA的複雜性(能夠不用掌握IDL)。
25. final,finally和finalize:
final
finally
26. JSP內置對象和屬性列舉以下:
1.request對象
客戶端的請求信息被封裝在request對象中,經過它才能瞭解到客戶的需求,而後作出響應。它是HttpServletRequest類的實例。
2.response對象
response對象包含了響應客戶請求的有關信息,但在JSP中不多直接用到它。它是HttpServletResponse類的實例。
3.session對象
session對象指的是客戶端與服務器的一次會話,從客戶連到服務器的一個WebApplication開始,直到客戶端與服務器斷開鏈接爲止。它是HttpSession類的實例.
4.out對象
out對象是JspWriter類的實例,是向客戶端輸出內容經常使用的對象
5.page對象
page對象就是指向當前JSP頁面自己,有點象類中的this指針,它是java.lang.Object類的實例
6.application對象
application對象實現了用戶間數據的共享,可存放全局變量。它開始於服務器的啓動,直到服務器的關閉,在此期間,此對象將一直存在;這樣在用戶的先後鏈接或不一樣用戶之間的鏈接中,能夠對此對象的同一屬性進行操做;在任何地方對此對象屬性的操做,都將影響到其餘用戶對此的訪問。服務器的啓動和關閉決定了application對象的生命。它是ServletContext類的實例。
7.exception對象
exception對象是一個例外對象,當一個頁面在運行過程當中發生了例外,就產生這個對象。若是一個JSP頁面要應用此對象,就必須把isErrorPage設爲true,不然沒法編譯。他其實是java.lang.Throwable的對象
8.pageContext對象
pageContext對象提供了對JSP頁面內全部的對象及名字空間的訪問,也就是說他能夠訪問到本頁所在的SESSION,也能夠取本頁面所在的application的某一屬性值,他至關於頁面中全部功能的集大成者,它的本 類名也叫pageContext。
9.config對象
config對象是在一個Servlet初始化時,JSP引擎向它傳遞信息用的,此信息包括Servlet初始化時所要用到的參數(經過屬性名和屬性值構成)以及服務器的有關信息(經過傳遞一個ServletContext對象)
27. 關於super和this
28. 內部類聲明
public class Enclosingone { //非靜態內部類 public class InsideOne {} //靜態內部類 public static class InsideTwo{} } class Mytest02{ public static void main(String args []){ Enclosingone.InsideOne obj1 = new Enclosingone().new InsideOne();//非靜態內部類對象 Enclosingone.InsideTwo obj2 = new Enclosingone.InsideTwo();//靜態內部類對象 } }
29. 接口 默認修飾符
接口中的變量默認是public static final 的,方法默認是public abstract 的
30.