一、 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六、