你必須知道的261個Java語言問題


一、 Java語言的運行機制:html

Java既不是編譯型語言也不是解釋型語言,它是編譯型和解釋型語言的結合體。首先採用通用的java編譯器將Java源程序編譯成爲與平臺無關的字節碼文件(class文件),而後由Java虛擬機對字節文件解釋執行java

二、 什麼是JVM?有什麼做用?工做機制如何?mysql

JVM是一個虛構出來的計算機,可在實際的計算機上模擬各類計算機功能,JVM有本身完善的硬件架構,如:處理器、堆棧、寄存器等,還有相應的指令系統。web

JVM是由Java字節碼執行的引擎,爲java程序的執行提供必要的支持,它還能優化java字節碼,使之轉換成效率更高的機器指令。JVM屏蔽了與具體操做系統平臺相關的信息,從而實現了Java程序只須要生成在JVM上運行的字節碼文件,就能夠在多種平臺上不加修改地運行。JVM中類的裝載是由類加載器(CLassLoader)和它的子類來實現的。CLassLoader是java運行時一個重要的系統組件,負責在運行時查找和裝入類文件的類。算法

操做系統裝入JVM是經過JDK中的java.exe來實現,主要經過如下幾個步驟完成:sql

a、 建立JVM裝載環境和配置數據庫

b、 裝載jvm.dll編程

c、 初始化jvm.dll數組

d、 調用JNIEnv實例裝載並處理class類瀏覽器

e、 運行Java程序

三、 爲什麼在JDK安裝路徑下存在兩個JRE

第一個:C:\Program Files\Java\jdk1.6.0_13\jre第二個:C:\Program Files\Java\jre6第一個JRE用於爲JDK自帶的開發工具提供運行環境,第二JRE用於爲開發者編寫的代碼提供運行環境。

四、 this:用於解決變量的命名衝突和不肯定性問題而引入的關鍵字。使用狀況:

a、 返回調用當前方法的對象的引用

b、 在構造方法中調用當前類中的其餘構造方法

c、 當方法參數名和成員變量名(字段更專業,java專有名詞)相同時,用於區分參數名和成員變量名

五、 super:表明父類的實例,在子類中,使用super能夠調用其父類的方法、屬性和構造方法。使用狀況:

a、 調用父類中的構造方法;

b、 調用父類中的方法和屬性:super.xxx();

六、 static:可修飾方法、屬性、自由塊、內部類。使用static修飾這些成員時,能夠理解成這些成員與類相關,經過「類名.成」的形式調用;沒有static修飾能夠理解成這些成員與對象相關,須要經過「對象名.成員」的形式調用。

a、 static不能修飾構造方法

b、 在static修飾的方法中,不能調用沒有static修飾的方法和屬性,也不能使用this和super關鍵字。

c、 static修飾屬性時,這個靜態屬性還具備一個特性,那就是該屬性衩多個當前類對象共享。

d、 static修飾自由塊,只要類被加載,即便沒有建立對象,也將被執行。此外靜態自由塊不管建立多少個對象,僅執行一次。

七、 成員變量和局部變量區別:局部變量指方法體內部定義的變量,做用域只在方法塊內部有效。局部變量在使用時,必須初始化。成員變量指在類中定義的變量,也就是屬性,做用域是在整個類中有效。成員變量在定義時能夠不指定初始值,系統能夠按默認原則初始化。如下幾個方面:

 public protect private static 等修飾符可用於修飾成員變量,但不能修飾局部變量。二者均可以使用final修飾。

 成員變量存儲在堆內存中,局部變量存儲在棧內存中。

 做用域看上面

 初始化看上面

八、 簡單類型變量和引用類型變量存儲機制:簡單類型變量是直接在棧內存中開闢存儲空間存儲變量值。引用類型變量是由引用空間和存儲空間兩部分構成,引用空間在棧內存中,存儲空間在堆內存中,存儲空間負責存儲變量值,引用空間負責存放存儲空間的首地址。引用變量中存放的是地址值,經過地址值能夠定義存儲位置並修改存儲信息。當變量與變量之間賦值時,引用類型變量和簡單變量都屬於值傳遞,不一樣的是簡單變量傳遞的是內容自己,而引用變量傳遞的倒是引用地址。

九、 新式樣for循環

String[] arr={「ddd,dda,dds};

for(String s:arr){

System.out.println(s);

}(type to from)

十、 內部類:

優勢:

 內部類對象能訪問其所處類的私有屬性和方法

 內部類可以隱藏起來,不被同一個包中的其餘類訪問。

 匿名內部類能夠方便地用在回調方法中

特徵:

a、 內部類能夠聲明爲抽象類,所以能夠被其餘的內部類繼承,也能夠聲明爲final的

b、 和外部類不一樣,內部類能夠聲明爲private和protected,外部類只能用public和default

c、 內部類能夠聲明爲static的,但此時就不能再使用外層封裝類的非static的成員變量

d、 非static的內部類中的成員不能聲明爲static的,只有在頂層類或static的內部類中才能夠聲明static成員。

十一、 抽象類和接口的不一樣:定義格式不一樣、使用方式不一樣、設計理念不一樣(is a ,like a)、使用關係

十二、 Java中動態綁定

一個方法調用同一個方法主體鏈接到一塊兒稱爲「綁定」。若是在程序運行以前執行綁定,由編譯器決定方法調用的程序,稱爲「早期綁定」或「靜態綁定」。若是綁定過程在程序運行期間進行,以對象的類型爲基礎,則稱爲「後期綁定」或「動態綁定」。

若是一種語言實現了後期綁定,同時必須提供一些機制,能夠在運行期間判斷對象的實際類型,並分別調用適當的方法,即編譯器此時依然不知道對象的類型,但方法調用機制可以自已去調查,找到正確的方法主體。Java方法的執行主要採用動態綁定技術,在程序運行時,虛擬機將調用對象實際類型所限定的方法。

Java方法在調用過程當中主要經歷瞭如下過程。

 編譯器查看對象變量的聲明類型和方法名,經過聲明類型找到方法列表。

 編譯器查看調用方法時提供的參數類型。

 若是方法由private,static,final修飾或者是構造器,編譯器就能夠肯定調用哪種方法,即採用靜態綁定技術。若是不是上述狀況,就使用動態綁定技術,執行後續過程。

 虛擬機提取對象的實際類型的方法表。

 虛擬機搜索方法簽名。

 調用方法。

1三、 建立類的對象時,類中各成員的執行順序

屬性、方法、構造方法和自由塊都是類中的成員,在建立對象時,各成員的執行順序以下:

 父類靜態成員和靜態初始化塊,按在代碼中出現的順序依次執行。

 子類靜態成員和靜態初始化塊,按在代碼中出現的順序依次執行。

 父類實例成員和實例初始化塊,按在代碼中出現的順序依次執行。

 執行父類構造方法

 子類實例成員和實例初始化塊,按在代碼中出現的順序依次執行。

 執行子類構造方法

1四、 靜態初始化塊和非靜態初始化塊

靜態初始化塊比非靜態初始化塊執行要早,並且靜態初始化塊只執行一次,非靜態的初始化塊可執行屢次。靜態初始化塊的的執行時機須要注意,它是在類加載器第一次加載該類時調用,不必定非要建立對象才觸發,若是使用「類.靜態方法」也會執行靜態方法。

1五、 Java中異常處理的方式:try-catch-finally;throws

Java數據庫操做

1六、 JDBC:爲開發人員提供了一套標準的API,都是由Java語言編寫的類和接口,可用於鏈接數據庫和執行SQL語句,主要有:

一、 DriverManager:管理一組JDBC驅動程序的基本程序

二、 Connection:Java程序與特定數據庫的鏈接

三、 Statement:用於執行靜態SQL語句並返回它所生成結果的對象

四、 PreparedStatement:表示預編譯的SQL語句的對象(是Statement接口的子接口,能完成Statement所能實現的功能,PreparedStatement表示預編譯的SQL語句的對象,SQL語句被預編譯而且存儲在PreparedStatement對象中,而後可使用此對象高效地屢次執行該語句。)

五、 CallableStatement:用於執行SQL存儲過程的接口

六、 ResultSet:表示數據庫查詢的結果集

1七、 Java與數據庫的鏈接方式:

在Java訪問數據庫時,Java程序首先使用DriverManager類載入指定的驅動程序,而後使用JDBC API與DriverManger類交互,完成數據庫的增長、刪除、修改和查詢操做。

一、 JDBC-ODBC bridge plus ODBC driver:橋驅動

二、 Native-API partly-Java driver:本地API驅動

三、 Pure Java Driver for Database Middleware:網絡協議驅動

四、 Direct-to-Database Pure Java Driver:本地協議驅動

1八、 JDBC在對各類不一樣數據庫進行鏈接時,只須要使用不一樣的驅動包,傳遞不一樣的參數。

一、 註冊驅動:ClassName(「」)

二、 獲取鏈接:Conncetion conn=DriverManager.getConnection(url,username,password)

三、 獲取SQL執行器:Statement stmt=conn.createStatement();

四、 執行查詢的SQL語句:ResultSet rs=stmt.executeQuery(「」);

五、 遍歷結果集中的每一行記錄:while(rs.next());

六、 獲取結果中的XXX字段的值:rs.getInt(「」);

1九、 Statement和PreparedStatement區別:

一、 均可以執行SQL語句實現對數據表的操做。

二、 Statement用於執行靜態SQL語句並返回它所生成結果的對象。Statement在執行SQL語句時,必須指一一個事先準備好的SQL語句。

三、 PreparedStatement表示預編譯的SQL語句的對象,SQL語句被編譯並存儲在對象中。被封裝的SQL語句表明某一類操做,SQL語句中容許包含動態參數「?」,在執行時能夠爲「?」動態設置參數值。

四、 在使用PreparedStatement對象執行SQL命令時,SQL命令被數據庫進行解析和編譯,而後被放到命令緩衝區。而後每當執行同事PreparedStatement對象時,它就會被再解析一次,可是不會被再次編譯。在緩衝區能夠發現預編譯的命令,而且能夠從新使用。

20、 存儲過程:存儲在數據庫服務器中的一組SQL操做的單元。CallableStatement接口繼承自PreparedStatement,可用於執行SQL存儲過程。JDBC API提供了一個存儲過程SQL轉義語法,

2一、 鏈接Oracle數據庫時thin和oci方式區別:

一、 jdbc:oracle:thin@<主機名或IP>:1521:<數據SID名>

二、 java:oracle:oci@<本地服務器名>

三、 這兩種不一樣的鏈接類型,thin屬於Direct-to-Database Pure Java Driver(本地協議驅動)類型,只要有數據庫驅動包就能夠直接經過網絡接口訪問數據庫;而oci是Oracle Call Interface的縮寫,屬於Native-API partly-Java driver(網絡協議驅動)類型,須要在客戶端安裝Oracle的客戶端軟件,並註冊一個本地服務名。在理論上oci性能要好於thin

2二、 獲取ResultSet中含有的記錄數量:

在已獲取ResultSet結果集的狀況下,可使用該對象的last()和getRow()方法取得記錄數量。last()用於將ResultSet指針指向到最後一行記錄,getRow()用於返回當前指針所在的位置。

ResultSet默認狀況下,只能使用next()方法向前逐行移動指計,不支持last(),absolute(),first()等,若是要使用last()和absolut()方法,由Connection生成Statement時須要指定參數,格式:

Statement stmt=conn.createStatement(遊標類型,記錄更新權限);

遊標類型:

ResultSet.TYPE_FORWORD_ONLY:只能夠向前移動

ResultSet.TYPE_SCROLL_INSENSITIVE:可滾動,不受其餘用戶對數據庫更改的影響

ResultSet.TYPE_SCROLL_SENSITIVE:可滾動,當其餘用戶更改數據庫時這個記錄也會改變。

記錄更新權限:

ResultSet.CONCUR_READ_ONLY:只讀

ResultSet.CONCUR_UPDATABLE:可更新

Statement stmt=conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);

在數據量很大時會出現內存溢出異常,不推薦。

可以使用SQL統計函數獲取符合查詢條件的記錄數量:

int count=0;

if(rs.next()){

count=rs.getInt(1);

}

2三、 獲取ResultSet中n-m位置區間的記錄:

在分頁操做時,常常要將某一頁顯示的記錄獲取,而後在界面上顯示,從ResultSet中獲取指定區間的記錄,主要是使用absolute()方法將指針定位到參數指定的位置,而後經過 getter()方法獲取指針指定記錄的字段值。

Statement stmt=conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);

ResulteSet rs=stmt.executeQuery(「」);

for(int i=begin;i<end;i++){

if(!rs.absolute(i)){

break;

}

rs.getXXX();

}

2四、 使用LIKE關鍵字實現模糊查詢:

一、%:表明0個或多個字符;_:表明任意單一字符;[]:表明在指定區域或集合中的任意單一字符;[^]:表明不在指定區域或集合中的任意單一字符。

二、使用模糊查詢對數據文件進行預處理能夠過濾掉大量的無用數據,縮小操做對象的範圍,從而提升後續處理的效率,避免對無用數據進行操做形成資源的浪費。

三、模糊查詢不適用於數值類型的字段。

2五、 實現查詢的分組統計和排序:

在進行數據處理時,爲了方便操做,每每但願先將一字段內具備相同值的數據歸爲一組,而後再針對每組作出統一的處理。

SQL語言中提供了GROUP BY子句和分組函數來執行分組操做。GROUP BY子句使用格式:

select  字段,分組函數

from table

[where 查詢條件] //指定過濾條件

[group by 分組字段] //指定分組字段

[having 分組函數] //按分組函數的結果排序

[order by 排序字段]; //按普通的字段排序

Example:

select deptno as no,avg(sal) as a,sum(sal) as a,from emp 

group by deptno

having avg(sal)

若是須要按照分組函數的結果排序,必須使用Having子句,不能使用order by

在使用分組查詢的SQL語句時,須要注意一個重要的原則:select關鍵字後出現的字段,除分組函數使用的參數外,其餘的都要在group by子句中出現

2六、 實現多表聯合查詢:

一、 等值鏈接:做用是查詢結果是由兩個表的記錄共同決定的,只有兩個表的鏈接字段值相等的記錄,纔會做爲結果返回。格式:

select t1.column,t1.column

from table1 t1, table2 t2

where t1.column=t2.column;

或:

select t1.column,t1.column

from table1 t1

join table2 t2 on(t1.column=t2.column);

二、 外鏈接:做用是查詢結果是由某一主表的記錄決定的,即便另外一方沒有對應記錄,主表記錄也要做爲結果返回,另外一方記錄的字段值爲NULL,外鏈接分爲外鏈接右鏈接。

左鏈接格式:

select t1.column,t2.column

from table1 t1

left outer join table2 t2(t1.column=t2.column);

右鏈接格式:

select t1.column,t2.column

from table1 t1

right outer join table2 t2(t1.column=t2.column);

三、 天然鏈接:做用與等值鏈接類擬,只不過鏈接雙方都是同一個表,通常是同一個表的兩個不一樣字段作等值。格式:

select t1.column,t2.colum

from table1 t1

join table1 t2(t1.column1=t2.column2);

2七、 JDBC的排處理操做:Statement或PrepareStatement均可以執行批處理功能,可使用addBatch(「」)方法處理中追加SQL語句,而後使用executeBatch()執行批處理中的SQL語句。批處理不能用於查詢語句

2八、 字段值遞增:

Mysql和SQLServe,Sybase都支持字段值自動遞增功能,但在 Oracle、DB二、PostgreSQl中卻不支持,在Oracle中可使用Sequence序列,實現字段值的自動遞增。格式:

create sequence 序列名

[increment by 遞增量]:設置遞增量

[start with 起始值]:設置起始值

[maxvalue|nomaxvalue]:設置最大值

[nocycle]:設置累加,不循環

[cache 數量]:設置一次生成多少個序列值存入緩存

刪除序列:

drop sequence 序列名

序列的使用:

可使用nextval和currentval兩個屬性。currentval表示序列當前值;而nextvat表示在當前值基礎之上遞增以後的值。

Sequence是數據庫系統按照必定規則自動增長的數字序列,這個序列通常做爲主鍵代理,由於其不會重複。

2九、 to_date(2010-10-10,yyyy-mm-dd)Oracle數據庫的轉換函數,MySQL數據庫中,2010-10-10格式的字符串會自動轉換爲Date類型,

30、 向表中插入含有特殊字符的信息,使用PrepareStatement操做數據。使用BLOB類型的字段,使用PrepareStatement操做數據。經過setBinaryStream()方法可實現將BLOB類型數據寫入數據庫。使用CLOB類型的字段,使用PrepareStatement操做數據。經過setAsciiStream()方法可實現將CLOB類型數據寫入數據庫。

3一、 獲取數據表的結構信息:

一、 DatabaseMetaData

經過Connection的getMetaData()方法能夠獲取包含數據庫元的DatabaseMetaData類的對象。DatabaseMetaData提供了很是豐富的方法,用於獲取數據庫的總體信息。如:版本號、產品名稱、驅動名稱和列名稱容許的最大字符等。

二、 ResultSetMetaData

三、 經過ResultSet的getMetaData()方法能夠獲取包含數據的ResultSetMetaData對象。ResultSetMetaData提供了獲取表名稱、字段名稱、字段類型和字段個數等信息的方法,   

3二、 獲取數據庫中的全部表名:

經過Connection的getMetaData()方法能夠獲取包含數據庫元的DatabaseMetaData類的對象。DatabaseMetaData提供了很是豐富的方法,用於獲取數據庫的總體信息。利用DatabaseMetaData的getTable()方法能夠獲取數據庫中所的表名。

3三、 程序備份和恢復數據庫:

實現用Java程序備份和恢復數據庫,最通用的方法是利用Runtime類的exec()方法執行備份和恢復的命令語句。MySQL數據庫備份和恢復的命令分別爲(CMD 轉到C:\Program Files\MySQL\MySQL Server 5.0\bin目錄下執行下面的命令):

mysqldump u用戶名 p密碼 opt 庫名 >備份文件路徑

mysql u用戶名 p密碼 庫名 <恢復文件路徑

3四、 使用事務能夠將一組SQL操做看成一個總體進行控制,保障邏輯和數據的完整性,在數據庫中使用commit和rollback命令也能夠實現事務的提交和回滾操做。

3五、 JTA事務與JDBC事務區別:

JTA(Java Transaction API)是一種高層的、與實現無關的、與協議無關的API,應用程序和應用服務器可使用JTA實現事務管理。

JTA主要用於分佈式的多個數據源的事務控制,而JDBC的Connection提供的是單個數據源的事務。JDBC事務由於只涉及一個數據源,因此其事務能夠由數據庫本身單獨實現,而JTA事務由於其分佈式和多數據源的特性,不能由任何一個數據源實現事務管理,所以JTA中的事務由事務管理器實現,它會在多個數據源之間管理事務。通常JTA事務都用於EJB中,所以通常的應用服務器都有本身的事務管理器用來管理JTA事務。注意:若是使用Tomcat應用服務器,是不能使用JTA事務的。JTA在使用時,通常會選用Weblogic、JBoss、Websphere等服務器。JTA也是用於管理事務的一套API,與JDBC相比,JTA主要用於管理分佈式多個數據源的事務操做,而JDBC主要用於管理單個數據源的事務操做。

3六、 JTA實現分佈式事務控制:在分佈系統中,一個邏輯單元可能會涉及若干數據源的數據,JTA可以實如今網絡環境中多個數據庫在一個事務中進行操做,而JDBC事務只能在一個數據庫中進行,由於JDBC中的事務是與鏈接相關的。

與JTA相關的API都在javax.transaction包中,

3七、 數據庫鏈接池:鏈接池用於建立和管理數據庫鏈接的緩衝池技術,緩衝池中的鏈接能夠被任何須要它們的線程使用。當一個線程須要用JDBC對一個數據庫操做時,將從池中請求一個鏈接。當這個鏈接使用完畢後,將返回到鏈接池中,等待爲其餘的線程服務,優勢

 減小鏈接建立時間

 簡化的編程模式

 控制資源的使用

鏈接池原理:

鏈接池技術的核心思想是鏈接複用,經過創建一個數據庫鏈接池以及一套鏈接使用、分配和管理策略,使得該鏈接池中的鏈接能夠獲得高效、安全的複用,避免了數據庫鏈接頻繁創建、關閉的開銷。

鏈接池的工做原理主要由三部組成,分別爲鏈接池的創建、鏈接池中鏈接的使用管理、鏈接池的關閉。

a、 鏈接池的創建

通常在系統初始化時,鏈接池會根據系統配置創建,並在池中建立了幾個鏈接對象,以便使用時能從鏈接池中獲取。鏈接池中的鏈接不能隨意建立和關閉,這樣避免了鏈接隨意創建和關閉形成的系統開銷。Java中提供了不少容器類能夠方便的構建鏈接池,如:Vector、Stack

b、 鏈接池的管理

鏈接池管理策略是鏈接池機制的核心,鏈接池內鏈接的分配和釋放對系統的性能有很大的影響。其管理策略以下:

當客戶請求數據庫鏈接時,首先查看鏈接池中是否有空閉鏈接,若是存在空閒鏈接,則將鏈接分配給客戶使用;若是沒有空閒鏈接,則查看當前所開的鏈接數是否已經達到最鏈接數,若是沒有達到就從新建立一個鏈接給請求的客戶;若是達到就按設定的最大等待時間進行等待,若是超出最大等待時間,則拋出異常給客戶。

當客戶釋放數據庫鏈接時,先判斷該鏈接的引用次數是否超過了規定值,若是超過就從鏈接池中刪除該鏈接,不然保留爲其餘客戶服務。

c、 鏈接池的關閉

當應用程序退出時,關閉鏈接池中全部的鏈接,釋放鏈接池相關的資源,該過程正好與建立相反。

3八、 提高SQL語句的查詢性能:

數據庫設計與規劃:

 Primary Key字段的長度儘可能小,能用small integer就不要用integer

 字符字段若是長度固定,就不要用varchar、nvarchar類型

 設計字段時,若是其值無關緊要,最好給一個默認值,並設成「不容許NULL」

適當地建立索引:

a、 Primary Key字段能夠自動建立索引,而Foreign Key字段不能夠。

b、 爲常常被查詢或排序的字段建立索引

c、 建立索引字段的長度不宜過長,不要用超過20個字符。

d、 不要爲內容重複性高的字段建立索引

e、 不要爲使用率低的字段創建索引

f、 不宜爲過多字段創建索引,不然影響到insert update delete語句的性能

g、 若是說數據表存放的數據不多,就沒必要刻意使用權索引。

使用索引功能:

在查詢數據表時,使用索引查詢能夠極大提高查詢速度,可是若是where子句書寫不當。即便某些列存在索引,也不能使用該索引查詢,而一樣會使用全表掃描,這就形成了查詢速度的下降。在where語句中避免使用如下關鍵詞:NOT、!=、<>、!>、!<、Exists、In、Like、||。使用LIKE關鍵字作模糊查詢時,即便已經爲某個字段創建索引,但須要以常量字符開頭纔會使用到索引,若是以「%」開頭則不會使用索引。例如「name Like %To’」不啓用name字段上的索引;而「name LIKE ‘TO %’」會啓用name字段上的索引。

避免在where子句中對字段使用函數:

    對字段使用函數,也等於對字段作運算或鏈接的動做,調用函數的次數與數據表的記錄成正比。若是數據表內記錄不少時,會嚴重影響查詢性能。

在AND與OR的使用:

在AND運算中,只要有一個條件使用到索引,便可大幅提高查詢速度。但在OR運算中,則要全部的條件都有使用到索引才能提高查詢速度,所以使用OR運算符時須要特別當心

JOIN與子查詢:

相對於子查詢,若是能使用JOIN完成的查詢,通常建議使用後者。緣由除了JOIN的語法較容易理解外,在多數的狀況下,JOIN的性能也會比子查詢高。

其餘查詢技巧:

 DISTINCT、ORDER BY語法,會讓數據庫作額外的計算。若是沒有要過濾重複記錄的需求,使用Union All會比Union更好,由於後者會加入相似DIStinct的算法。

儘量使用存儲過程(Store Procedure):

Store Procedure除了通過事先編譯、性能較好之外,也可減小SQL語句在網絡中的傳遞,方便商業邏輯的重複使用。

儘量在數據源過濾數據

使用Select語法時,儘可能先用SQL條件或Store Procedure過濾所要的信息,避免將大量冗餘數據返回給程序,而後由程序處理。

3九、 解決MySQL數據庫插入亂碼:

 設置鏈接字符串編碼:

在數據庫鏈接字符串後面追加參數,指明MySQL服務器發送SQL語句的編碼格式,格式以下:

jdbc:mysql://localhost:3306/test?useUnicode==true&characterEncoding=utf-8

 設置數據表及其字段的編碼:

將數據表的存儲類型、表中字符字段的存儲型都設置成與鏈接字符串一致的編碼。依據上述鏈接字符串示例,數據表的存儲編碼應該設置成UTF-8

 設置其餘編碼:

若是是從JSP頁面取值,而後使用SQL寫入數據庫,那麼還要保障從JSP頁面取值正常。具體步驟:

a、 在JSP頁面中設置如下代碼:

<%@page language=java pageEncoding

=utf-8 %>

<%@page contentType=text/html;charset

=utf-8 %>

b、 在使用request.getParameter()方法獲取JSP頁面值以前,設置request.seCharacterEncoding(UTF-8);

Java經常使用功能

40、 過濾字符串先後以及中音出現的空格:

分爲兩種狀況:

 只須要過濾字符串先後的空格,而中間的空格不須要過濾

用String類中提供的trim()方法便可實現。

 字符串的先後和中間可能出現的空格,都須要過濾

4一、 String、StringBuffer、StringBuilder區別:

String類表明定長字符串,其內容在建立以後是不可更改的

StringBuffer類與String類類似,表明的是可變長的字符串緩衝區,經過特定的方法能夠改變字符串序列的長度和內容,而且對於多線程操做是安全的。在字符的鏈接操做上提供了性能和效率都優於String類的+的append()方法,所以若是須要大量頻繁地進行字符鏈接操做時,優先採用StringBuffer類的append()方法。

StringBuilder類是StringBuffer類的一個等價類,該類與StringBuffer類具備相同的方法,且一樣表明的是可變長的字符串緩衝區,不一樣的地方在於StringBuilder類是非線程安全的。可是也正是由於少了不少的同步操做,在效率上會高於StringBuffer類。所以若是不涉及多線程操做,能夠優先考慮使用StringBuilder類來提升方法的執行效率。

4二、 List、Set、Map是否繼承自Collection接口:

在Java體系中,容器類庫分爲兩大類,即Collection(集合)和Map(映像)。Collection中存放的是一組各自獨立的對象,而Map中存放的是「鍵——值」對象。

List和Set都是Collection的子接口,List是一個有序可重複列表,Set是一個無序重複集。

4三、 遍歷Map和Vector集合:

Map:

 Iterator迭代器遍歷:Map.entrySet().iterator(); XX.hasNext();

 新式for循環啓遍歷:for(String key:Map.keySet());

Vector:

a、 Enumeration枚舉器遍歷:Enumeration em=Vector.element();em.hasMoreElement();

b、 for循環遍歷:for(int i=0;i<Vector.size();i++)

4四、 反射機機制及做用:

 定義:

反射是指程序能夠訪問、檢測和修改其自己狀態或行爲的一種能力,在Java環境中,反射機制容許程序在執行時獲取某個類的自身的定義信息,例如屬性和方法等也能夠實現動態建立類的對象、變動屬性的內容或執行特定的方法的功能。從而使Java具備動態語言的特性,加強了程序的靈活性和可移植性

 反射機制的做用:

Java反射機制主要用於實現如下功能(在運行時時環境中)。

I、在運行時判斷任意一個對象所屬的類型

II、在運行時構造任意一個類的對象

III、在運行時判斷任意一個類所具備的成員變量和方法

IV、在運行時調用任意一個對象的方法,甚至能夠調用private方法

 Java反射機制API:

實現Java反射機制的API在java.lang.reflect包下,具備如下幾點:

(1)、Class類:表明一個類

(2)、Field類:表明類的成員變量

(3)、Method類:表明類的方法

(4)、Constructor類:表明類的構造方法

(5)、Array類:提供了動態建立數組及訪問數據的元素的靜態方法。該類中的全部方法都是靜態的。

 難點:

反射機制是Java中很是重要的一項功能,應用也很是普遍,在如今流行的Structs、Hibernate、Spring等各類框架都是基於反射機制實現的,首先須要將XML配置文件的配置信息讀取,而後利用反射機制建立對象、執行方法等。

4五、 如何使用Java調用系統的exe文件

經過Runtime類能夠方便調用外部的exe文件。

Runtime rm = new Runtime.getRuntime();

rm.exec(notepad.exe);

4六、 如何使用Java調用系統的CMD 

Process rt;

try {

rt = Runtime.getRuntime().exec("ping 127.0.0.1");

BufferedReader br=new BufferedReader(new InputStreamReader(rt.getInputStream()));

while(true){

String s = br.readLine();

if(s==null){

break;

}

System.out.println(s);

}

br.close();

rt.waitFor();

if(rt.exitValue()==0){

System.out.println("運行成功!");

}

catch (Exception e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

4七、 使用MD5和SHA算法加密信息:

Java Web程序設計

4八、 jsp、java、JavaScript區別:

Jsp是由Sun公司創建一種動態網頁技術標準,用於編寫動態網站程序。JSP技術以Java語言做爲腳本,嵌入到JSP頁面中,由服務器負責解釋運行。JSP運行環境是JRE和服務器

JAVA程序須要由JRE運行環境才能解釋運行,面向對象的語言。

JavaScript由Netscape公司基於Java的語法開發的。一種基於對象的腳本語言。能夠在瀏覽器裏直接運行,不需服務器的支持。是基於對象的函數式的語言,在客戶端用於實現表單驗證和網頁特效功能。

4九、 Page、request、session、application區別:

類型不一樣分別:Object 、HttpServletRequest、HttpSession、ServletContext;

做用範圍不一樣分別:全局做用範圍,整個應用程序共享,生命週期爲從應用程序啓動到中止;會話做用域,當用戶首次訪問,產生一個新的會話,之後服務器就能夠記住這個會話狀態。生命週期爲會話超時或服務器端強制制使會話失效;請求做用域,客戶端的一次請求,生命週期爲一次請求或使用forward方式執行請求轉發;一個頁面有效。

50、 forward和redirect區別:

forward和redirect均可以實現頁面的跳轉,可是跳轉時的工做原理不現,使用forward時,瀏覽器請求URL不會改變,request對象不會被銷燬;使用redirect時,瀏覽器請求的URL會改變,request對象會被銷燬並從新建立。在使用request對象在頁面傳值時,須要使用forward方式,而不能使用redirect方式。

5一、 多個JSP頁面之間傳遞信息:

使用URL;使用request對象;使用Session對象;使用application對象

5二、 <jsp:include>和<%@include%>均可以實如今當前JSP頁面中引入另外一個頁面,前者主要用於引入動態變化的JSP頁面;後者主要用於引入HTML靜態頁面和共通的JSP源代碼。

5三、 JavaBean就是一個符合JavaBean規範的JAVA類,可用於封裝一些共通的業務邏輯,從而實現重複利用。特色:

 放在一個包中

 JavaBean類必需要提供一個無參的構造方法。在JSP中使用<jsp:getuseBean/>建立JavaBean對象時會使用無參的構造方法。

 JavaBean類不要定義公共類型的屬性,避免外界直接訪問實例變量,變量名稱首字母必須小寫

 JavaBean類經過gettero/setter()方法來讀寫屬性的值,而且將對應的屬性首字母改爲大寫。注意使用setter()時value屬性的類型要匹配。

5四、 Cookie:

Cookie是指存儲在客戶瀏覽器目錄下的文本文件,文件信息由Web服務器發送到客戶瀏覽器並存儲,下次該客戶再次訪問該web服務器時,可從瀏覽器讀回此信息。使用Cookie,Web服務器能夠將一些客戶的特定信息存儲在客戶計算機中,例如上次訪問的位置、花費時間或用戶密碼等不建議使用Cookie保存。

 JSP/Servlet操做Cookie:

寫入Cookie的示代碼以下:

Cookie c = new Cookie(username,tom);

c.setMaxAge(120);

response.addCookie(c);

上述代碼中,若是不使用setMaxAge()方法設置有效期,Cookie信息將在客戶關閉瀏覽器以後刪除。

讀取Cookie的示例代碼以下:

Cookie[] c =request.get Cookies();

for(int i=0;i<c.length;i++){

if(c[i].getName().equals(username){

username=c[i].getValue();

}

}

在客戶端的Cookie文件能夠存儲若干個Cookie對象的信息,在讀取時,request.get Cookies()返回一個Cookie數組,可在該數組中遍歷尋找指定的Cookie對象。

刪除Cookie示例代碼以下:

Cookie c = new Cookie(mycookie,null);

c.setMaxAge(0);

c.setPath(/);

response.addCookie(c);

 JavaScript操做Cookie

寫入Cookie的示例代碼以下:

5五、 Servlet生命週期:

加載和實例化、初始化、處理請求、移除實例。

5六、 

相關文章
相關標籤/搜索