JAVA面試、筆試題(2015版)javascript
欲想成功,必須用功!php
目錄css
1、 HTML&CSS部分.......................................................................................... 9html
一、HTML中定義表格的寬度用80px和80%的區別是什麼?...................................... 9前端
二、CSS樣式定義優先級順序是?............................................................................. 10java
三、div和span的區別?............................................................................................ 10node
四、CSS選擇器包括?................................................................................................ 10mysql
五、用css3語法中,如何實現一個矩形框的圓角效果和50%紅色透明效果?,請寫出關鍵腳本 10jquery
六、Div與Table的區別............................................................................................... 11css3
七、行級標籤轉塊級標籤,塊級標籤轉行級標籤...................................................... 11
2、Java基礎部分........................................................................................................ 11
一、java中有哪些基本類型?.................................................................................... 11
二、java爲何可以跨平臺運行?............................................................................. 12
三、String是基本數據類型嗎?我可不能夠寫個類繼承於String?........................... 12
四、談談&和&&的區別?........................................................................................... 12
五、Switch語句裏面的條件可不能夠是byte、long、String?使用時候還應注意什麼? 12
六、short s1=1;s1=s1+1;有什麼錯?short s1 = 1;s1+=1 有什麼錯?............................ 12
七、char爲何能存貯一個漢字?............................................................................ 13
八、用最效率的辦法算出2乘以8等於幾?.............................................................. 13
九、final修飾變量時,該變量是對象時,對象的值可不能夠改變?........................ 13
十、靜態變量和實例變量的區別?.......................................................................... 13
十一、面向對象的基本特徵是什麼?.......................................................................... 13
十二、做用域public,private,protected,以及不寫時的區別?....................................... 14
1三、Overload和Override的區別。........................................................................... 14
1四、構造器可不能夠被重載或重寫?....................................................................... 14
1五、Java中有沒有多繼承?...................................................................................... 15
1六、抽象類和接口的區別?...................................................................................... 15
1七、java中實現多態的機制是什麼?....................................................................... 15
1八、int和integer的區別?....................................................................................... 15
1九、String和StringBuffer的區別?StringBuffer和StringBuilder區別?.................... 16
20、String s=new String(「xyz」);建立了幾個String Object?......................................... 16
2一、數組中有沒有length()方法,String中有沒有length()方法?....................... 16
2二、try {}裏有一個return語句,那麼緊跟在這個try後的finally {}裏的code會不會被執行,何時被執行,在return前仍是後?.................................................................................................................. 16
2三、final, finally, finalize的區別。.............................................................................. 17
2四、‘==’和equals的區別?.................................................................................... 17
2五、error和exception有什麼區別?........................................................................ 17
2六、heap和stack有什麼區別。............................................................................... 18
2七、GC是什麼? 爲何要有GC?............................................................................. 18
2八、什麼是內部類?分爲哪幾種?.......................................................................... 18
2九、爲何須要內部類?......................................................................................... 18
30、內部類能夠引用它的包含類的成員嗎?有沒有什麼限制?............................. 19
3一、Anonymous Inner Class (匿名內部類) 是否能夠extends(繼承)其它類,是否能夠implements(實現)interface(接口)?............................................................................................................................ 20
3二、使用java命令查看java虛擬機版本.................................................................. 20
3三、數字轉字符有多少種方式,分別是什麼........................................................... 20
3四、Java建立對象有幾種方式.................................................................................. 20
3五、寫一個反序列化實例......................................................................................... 20
3、JavaScript/JQuery/Ajax部分................................................................................... 22
一、請寫一段Javascript程序,對如下程序的用戶輸入日期的有效性進行判斷,若是格式錯誤就提示用戶。在程序的恰當位置註明怎樣調用你寫的程序。日期格式爲:年年年年月月日日小時,例如2003010812。 22
二、Java和Javascript區別在哪?................................................................................. 23
三、列舉javaScript的3種主要數據類型,2種複合數據類型和2種特殊數據類型。 24
四、談談你的JS的理解?.......................................................................................... 25
五、ajax的優勢?....................................................................................................... 26
六、簡述一下ajax調試代碼查找錯誤的方法?......................................................... 26
七、簡述ajax中Js腳本緩存問題該如何解決?......................................................... 26
八、Ajax應用和傳統的web應用有何不一樣?............................................................ 26
九、javascript的做用?............................................................................................... 27
十、爲何要有jquery?.......................................................................................... 27
十一、jQuery選擇器有多少種?.................................................................................. 27
十二、jquery選擇器有哪些優點?............................................................................... 27
1三、你是如何使用jquery中的ajax的?.................................................................. 28
1四、jquery中的$.get和$.post請求區別?................................................................ 28
1五、jquery中如何操做樣式的?............................................................................... 28
1六、如何設置和獲取HTML和文本的值?................................................................ 28
1七、Jquery能作些什麼?.......................................................................................... 28
1八、在ajax中data主要有哪幾種?......................................................................... 29
1九、jQuery中ajax由幾部分組成?.......................................................................... 29
4、jsp/servlet部分...................................................................................................... 29
一、Tomcat的優化經驗.............................................................................................. 29
二、Tomcat根目錄下有哪些文件............................................................................... 29
三、什麼是TOMCAT,怎樣啓動中止,配置文件,日誌文件的存儲。....................... 30
四、解釋一下什麼是servlet;什麼是servlet容器;....................................................... 30
五、說一說Servlet的生命週期,執行過程?.............................................................. 31
六、實例化servlet有幾種方式................................................................................... 31
七、HTTP請求的GET與POST方式的區別.................................................................. 31
八、請寫一個Servlet的基本架構。........................................................................... 32
九、forward 和redirect的區別?................................................................................. 32
十、servlet中怎麼定義forward 和redirect.............................................................. 33
十一、過濾器有哪些做用?......................................................................................... 33
十二、JSP的經常使用指令?............................................................................................... 33
1三、JSP和Servlet中的請求轉發分別如何實現?..................................................... 33
1四、JSP亂碼如何解決?........................................................................................... 34
1五、session 和 application的區別?........................................................................ 34
1六、jsp有哪些內置對象?做用分別是什麼?.............................................................. 34
1七、Jsp有哪些動做?做用分別是什麼?..................................................................... 35
1八、JSP中動態INCLUDE與靜態INCLUDE的區別?.................................................. 35
1九、JSP和Servlet有哪些相同點和不一樣點,他們之間的聯繫是什麼?................... 35
20、頁面傳遞對象的方法?...................................................................................... 36
2一、Cookied和session區別?.................................................................................. 36
5、數據庫部分............................................................................................................ 36
一、觸發器的做用?................................................................................................... 36
二、什麼是存儲過程?用什麼來調用?..................................................................... 37
三、存儲過程的優缺點?........................................................................................... 37
四、存儲過程與函數的區別....................................................................................... 37
五、索引的做用?和它的優勢缺點是什麼?............................................................. 38
六、什麼樣的字段適合建索引.................................................................................... 38
七、索引類型有哪些?............................................................................................... 38
八、什麼是事務?什麼是鎖?.................................................................................... 39
九、什麼叫視圖?遊標是什麼?................................................................................ 39
十、視圖的優缺點..................................................................................................... 39
十一、列舉幾種錶鏈接方式,有什麼區別?.................................................................. 40
十二、主鍵和外鍵的區別?......................................................................................... 40
1三、在數據庫中查詢語句速度很慢,如何優化?.................................................... 40
1四、數據庫三範式是什麼?........................................................................................ 41
1五、union和union all有什麼不一樣?........................................................................... 41
1六、Varchar2和varchar有什麼區別?...................................................................... 42
1七、Oracle和Mysql的區別?................................................................................... 42
1八、Oracle語句有多少類型...................................................................................... 43
1九、oracle分頁語句.................................................................................................. 43
20、從數據庫中隨機取50條.................................................................................... 44
2一、order by與group by的區別............................................................................... 44
2二、commit在哪裏會運用........................................................................................ 44
2三、行轉列、列換行怎麼轉...................................................................................... 44
2四、什麼是PL/SQL?................................................................................................. 44
2五、序列的做用........................................................................................................ 45
2六、表和視圖的關係................................................................................................. 45
2七、oracle基本數據類型........................................................................................... 45
2八、truncate與 delete區別...................................................................................... 45
2九、oracle獲取系統時間........................................................................................... 46
30、oracle怎麼去除去重........................................................................................... 46
3一、如今有表:........................................................................................................... 46
3二、現有表:............................................................................................................ 47
3三、怎樣把這樣一個表(表名:tmp_table_201307).............................................. 48
3四、數據庫中有一張表ismg_icp_flow,結構以下.................................................... 49
6、Java高級部分........................................................................................................ 50
一、java中有幾種方法能夠實現一個線程?用什麼關鍵字修飾同步方法? stop()和suspend()方法爲什麼不推薦使用?.................................................................................................................................. 50
二、sleep() 和 wait() 有什麼區別?............................................................................ 50
三、當一個線程進入一個對象的一個synchronized方法後,其它線程是否可進入此對象的其它方法? 51
四、線程的基本概念................................................................................................... 51
五、什麼是多線程...................................................................................................... 51
六、程序、進程、線程之間的關係............................................................................ 51
七、建立線程有幾種方式,分別是什麼?................................................................. 52
八、線程的生命週期................................................................................................... 53
九、線程currentThread()與interrupt()方法的使用..................................................... 53
十、線程狀態............................................................................................................ 53
十一、什麼是java序列化,如何實現java序列化?................................................... 54
十二、編寫一個程序,將d:\java目錄下的全部.java文件複製到d:\jad目錄下,並將原來文件的擴展名從.java改成.jad。.................................................................................................................................. 54
1三、java中有幾種類型的流?JDK爲每種類型的流提供了一些抽象類以供繼承,請說出他們分別是哪些類? 57
1四、字節流與字符流的區別...................................................................................... 57
1五、怎麼判斷指定路徑是否爲目錄.......................................................................... 59
1六、怎麼獲取指定路徑下的所有文件....................................................................... 59
1七、Java怎麼讀取文件和寫入文件........................................................................... 60
1八、java怎麼複製文件.............................................................................................. 62
1九、用JDBC如何調用存儲過程................................................................................ 63
20、JDBC中的PreparedStatement相比Statement的好處....................................... 65
2一、寫一個用jdbc鏈接實例。................................................................................. 66
2二、ArrayList和Vector的區別?............................................................................... 67
2三、List、Set和Map的區別?................................................................................. 68
2四、Collection 和 Collections的區別。..................................................................... 69
2五、Set裏的元素是不能重複的,那麼用什麼方法來區分重複與否呢? 是用==仍是equals()? 它們有何區別? 69
2六、HashMap與HashTable的區別............................................................................ 69
2七、Java中有多少種數據結構,分別是什麼?........................................................ 70
2八、Arraylist 和linklist 的區別.................................................................................. 70
2九、List遍歷方式有多少種....................................................................................... 70
30、Map怎麼遍歷.................................................................................................... 71
3一、怎麼獲取Map全部的key,全部的value.......................................................... 71
3二、獲取Class的實例有幾種方式............................................................................. 71
3三、怎麼獲取類中全部的方法,全部屬性............................................................... 71
7、框架部分................................................................................................................ 71
一、談談你對Struts2的理解。................................................................................... 71
二、談談你對Hibernate的理解。.............................................................................. 72
三、你對Spring的理解。........................................................................................... 73
四、Struts2優缺點...................................................................................................... 73
五、說說struts1與struts2的區別。........................................................................... 75
六、struts的核心組件有哪些?.................................................................................. 76
七、Strus2的執行過程................................................................................................ 76
八、爲何要使用struts2?....................................................................................... 76
九、openSession和getCurrentSession........................................................................ 77
十、攔截器的做用?攔截器和過濾器的區別?........................................................ 77
十一、struts.xml中result的type有哪些類型?.......................................................... 78
十二、通常狀況下,關係數據模型與對象模型之間有哪些匹配關係?........................ 78
1三、hibernate 數據的三個狀態................................................................................ 78
1四、Hibernate中load和get的區別?...................................................................... 79
1五、Hibernate的工做原理?....................................................................................... 79
1六、hibernate優缺點?............................................................................................ 79
1七、Hibernate是如何延遲加載的?......................................................................... 80
1八、若是優化Hibernate?........................................................................................ 80
1九、什麼是ORM?.................................................................................................... 81
20、Hibernate的主鍵生成策略?............................................................................. 81
2一、Hibernate的級聯操做........................................................................................ 81
2二、Hibernate有哪5個核心接口?.......................................................................... 82
2三、什麼是重量級?什麼是輕量級?....................................................................... 82
2四、談談Spring的IOC和DI...................................................................................... 82
2五、什麼是AOP?..................................................................................................... 84
2六、Spring的通知類型有哪些?............................................................................... 84
2七、什麼是MVC?.................................................................................................... 84
2八、hibernate查詢方式有多少種?.......................................................................... 85
2九、spring中Bean的scope....................................................................................... 85
30、SSH對應MVC的哪些層..................................................................................... 86
3一、spring注入方式有幾種....................................................................................... 86
8、XML部分................................................................................................................ 86
一、xml有哪些解析技術?區別是什麼?...................................................................... 86
二、你在項目中用到了xml技術的哪些方面?如何實現的?....................................... 87
三、編程用JAVA解析XML的方式............................................................................. 87
四、XML文檔定義有幾種形式?它們之間有何本質區別?....................................... 90
五、XML和HTML的區別?........................................................................................ 90
六、XML文件和普通文件相比有哪些優勢?............................................................. 90
9、設計模式部分........................................................................................................ 91
請寫出你所知道的設計模式?.............................................................................. 91
10、算法部分................................................................................................................ 93
1、說明生活中遇到的二叉樹,用java實現二叉樹......................................... 93
二、第1我的10,第2個比第1我的大2歲,依次遞推,請用遞歸方式計算出第8我的多大? 100
三、排序都有哪幾種方法?請列舉。用JAVA實現一個快速排序。........................ 101
四、金額轉換,阿拉伯數字的金額轉換成中國傳統的形式如:(¥1011)->(一千零一拾一元整)輸出。................................................................................................................................. 103
五、從相似以下的文本文件中讀取出全部的姓名,並打印出重複的姓名和重複的次數,並按重複次數排序:................................................................................................................................. 104
六、寫一個Singleton出來。..................................................................................... 109
七、古典問題:有一對兔子,從出生後第3個月起每月都生一對兔子,小兔子長到第三個月後每月又生一對兔子,假如兔子都不死,問每月的兔子總數爲多少?.......................................... 112
八、簡單的說個遞歸................................................................................................. 113
九、什麼是平衡二叉樹............................................................................................. 113
十、怎麼判斷二叉樹是否有環................................................................................ 114
PX標識像素,%標識整個父標籤寬度百分比
內聯樣式最高優先權,而後是內部樣式,而後纔是外部樣式
DIV 和 SPAN 元素最大的特色是默認都沒有對元素內的對象進行任何格式化渲染。主要用於應用樣式表(共同點)。
二者最明顯的區別在於DIV是塊元素,而SPAN是行內元素(也譯做內嵌元素)。
詳解:1.所謂塊元素,是以另起一行開始渲染的元素,行內元素則不需另起一行,測試一下下面的代碼你會有更形象的理解:
測試<span>緊跟前面的"測試"顯示</span><div>這裏會另起一行顯示</div>
1)類別選擇器 用「.」來標識
2)標籤選擇器 用HTML標籤來標識
3)ID選擇器 用「#」號來標識
4)通配符選擇器 用「*」號來標識
<style>
div{
width:200px;
height:200px;
border-radius: 30px;
opacity: 0.5;/* 火狐 */
/* filter:alpha(opacity=50); IE */
background-color:red;
}
</style>
1) div大大縮減頁面代碼,提升頁面瀏覽速度,table代碼量繁多,頁面瀏覽效率慢。
2) div結構清晰,可讀性很是強,也容易被搜索引擎搜索到,優化了搜索引擎,Table結構複雜,可讀性差。
3)div 縮短改版時間。只要簡單的修改幾個CSS文件就能夠改變不少頁面。Table要想改變的話,須要一個頁面一個頁面的去修改。
4)div表現和內容相分離,很是符合w3c標準。
5)table製做效率高於div
6)table瀏覽器兼容性高於div,咱們經常使用的IE6.0,IE7.0火狐Firefox瀏覽器對div css設置上很是挑剔。
行級轉塊級:display:block
塊級轉行級:float:left
byte、short、int、long、float、double、char、boolean
由於Java程序編譯以後的代碼不是能被硬件系統直接運行的代碼,而是一種「中間碼」——字節碼。而後不一樣的硬件平臺上安裝有不一樣的Java虛擬機(JVM),由JVM來把字節碼再「翻譯」成所對應的硬件平臺可以執行的代碼。所以對於Java編程者來講,不須要考慮硬件平臺是什麼。因此Java能夠跨平臺。
不是,Strng是引用類型;String是final的類,是不能夠被繼承的。
&和&&均可以用做邏輯與的運算符,表示邏輯與(and),當運算符兩邊的表達式的結果都爲true時,整個運算結果才爲true,不然,只要有一方爲false,則結果爲false。
&&還具備短路的功能,即若是第一個表達式爲false,則再也不計算第二個表達式。
&還能夠用做位運算符,當&操做符兩邊的表達式不是boolean類型時,&表示按位與操做.。
switch裏面的條件必須是能隱式的轉化成爲Int的故long和String不行,byte能夠;使用Switch時候還應注意它的穿透,即每一個case後要跟break;
對於short s1 = 1; s1 = s1 + 1; 因爲s1+1運算時會自動提高表達式的類型,因此結果是int型,再賦值給short類型s1時,編譯器將報告須要強制轉換類型的錯誤。
對於short s1 = 1; s1 += 1;因爲 += 是java語言規定的運算符,java編譯器會對它進行特殊處理,所以能夠正確編譯。
char型變量是用來存儲Unicode編碼的字符的,unicode編碼字符集中包含了全世界所 有的字體。
2<<3 位移運算是最底層的運算,他直接操做的是二進制,故效率最快。
final修飾的變量指的是引用不可變,對象的值是能夠改變的。
靜態變量也稱爲類變量,歸全類共有,它不依賴於某個對象,可經過類名直接訪問;而實例變量必須依存於某一實例,只能經過對象才能訪問到它。
1)抽象:抽象就是忽略一個主題中與當前目標無關的那些方面,以便更充分地注意 與當前目標有關的方面。抽象並不打算了解所有問題,而只是選擇其中的一部分,暫時不用部分細節。抽象包括兩個方面,一是過程抽象,二是數據抽象。
2)繼承:子類擁有父類一切非私有的屬性和方法。
3)封裝:封裝是把過程和數據包圍起來,對數據的訪問只能經過已定義的界面。面 向對象計算始於這個基本概念,即現實世界能夠被描繪成一系列徹底自治、封裝 的對象,這些對象經過一個受保護的接口訪問其餘對象。
4)多態性:同一種事物的不一樣種表現形式。
做用域 當前類 同包 子孫類 其餘
public √ √ √ √
protected √ √ √ ×
default √ √ × ×
private √ × × ×
不寫時默認爲default。
(Overload)重載:發生在同一個類之中,方法名相同、參數列表不一樣,與返回值無關、與final無關、與修飾符無關、與異常無關。
(Override)重寫:發生在子類和父類之間,方法名相同、參數列表相同、返回值相同、不能是final的方法、重寫的方法不能有比父類方法更爲嚴格的修飾符權限、重寫的方法所拋出的異常不能比父類的更大。
若是父類私有的方法,子類擁有方法簽名相同的方法,子類不屬於重寫父類的方法,該方法屬於子類的新方法。
構造器不能被繼承,故不能被重寫、但能夠被重載。
java中沒有多繼承,可是能夠多實現,即一個類實現多個接口。
雖然沒有多繼承,可是java中接口能夠近似的實現多繼承,那就是接口;接口和接口之間能夠進行多繼承。
1)抽象類繼承與object接口不繼承object.
2)抽象類有構造器,接口中沒有構造器。
3)抽象類中能夠有普通成員變量和常量,接口中只能有常量,並且只能是public static final 不寫默認。
4)抽象類中能夠有抽象方法,也能夠由普通的方法,接口中只能有抽象的方法並且修飾符只能是public abstract 不寫默認。
5)抽象類中能夠有final的方法,接口中不能有final的方法。
6)抽象類只能是單繼承,多實現,接口是能夠多繼承其餘接口,可是不能實現接口,和不能繼承其餘類。
7)抽象類中能夠有靜態的方法,接口中不能夠。
重寫、重載、父類的聲明指向子類的對象。
int是java的基本數據類型,integer是1.4版本後提供的基本類型包裝類,當二者做爲成員變量時,初始值分別爲;int是0;integer是null;其中integer提供了一些對整數操做的方法,還定義了integer型數值的最值,其餘基本類型也有對應的包裝類,基本類型包裝類的出現,使得java徹底面向對象.
String是不可變的,對String類的任何改變都會返回一個新的String 對象。
StringBuffer是可變的,對StringBuffer中的內容修改都是當前這個對象。
String重寫了equals方法和hashCode方法,StringBuffer沒有重寫equals方法。String是final的類。StringBuffer不是。
String建立的字符串是在常量池中,建立的變量初始化一次,若是再對該字符串改變會產生新的字符串地址值,StringBuffer是在堆中建立對象,當對字符串改變時不會產生新的字符串地址值,若是對字符串進行頻繁修改的話建議使用StringBuffer,以節省內存。
StringBuffer和StringBuilder,StringBuffer是線程安全的,StringBulider是線程不安全的。當不考慮併發問題時候,請使用StringBulider。
兩個對象,一個是"xyx",一個是指向"xyx"的引用對象s。
數組中沒有length()方法,可是有length屬性,String中有length()方法
這道題頗有爭議,我是經過debug模式分爲兩種狀況進行測試的.
1)finally中沒有return時候:
會先執行try裏面的,return會執行可是沒有真正的return此時去執行了finally裏面的,而後再返回來執行return.
2)finally中有return時候(其實這種狀況不符合編程規範,會報黃線警告):
會先執行try裏面的,return會執行可是沒有真正的return此時去執行了finally裏面的,而後執行finally裏面的return,直接返回。
final 用於聲明屬性,方法和類,分別表示屬性不可變,方法不可覆蓋,類不可繼承。
內部類要訪問局部變量,局部變量必須定義成final類型。
finally是異常處理語句結構的一部分,表示老是執行。
finalize是Object類的一個方法,在垃圾收集器執行的時候會調用被回收對象的此方法,能夠覆蓋此方法提供垃圾收集時的其餘資源回收,例如關閉文件等。JVM不保證此方法總被調用
‘==’比較的是兩個變量的內容和在內存中的地址值是否所有相等,若是要比較兩個基本數據類型那必須用’==’
equals若是沒有重寫,則和’==’的意義同樣,若是重寫了,則會會按照重寫的內容進行比較,javaBean規定當重寫equals時候必須重寫hashCode,若是不重寫會出現對象相同可是hashCode不一樣,這樣會出現問題,eg:HashSet存儲元素時候是按照hashCode,若是重寫equals不重寫hashCode會致使同一個對象,存儲了兩次。
error表示恢復不是不可能可是很困難的狀況下的一種嚴重問題,例如程序書寫錯誤,虛擬機錯誤等,exception是一種設計和實現問題,若是程序運行正常,從不會發生的狀況。error是能夠避免的,exception是不可避免的。
java的內存分爲兩類,一類是棧內存,一類是堆內存。棧內存是指程序進入一個方法時,會爲這個方法單獨分配一塊私屬存儲空間,用於存儲這個方法內部的局部變量,當這個方法結束時,分配給這個方法的棧會釋放,這個棧中的變量也將隨之釋放。
堆是與棧做用不一樣的內存,通常用於存放不放在當前方法棧中的那些數據,例如,使用new建立的對象都放在堆裏,因此,它不會隨方法的結束而消失。方法中的局部變量使用final修飾後,放在堆中,而不是棧中。
GC是垃圾收集的意思(Gabage Collection),內存處理是編程人員容易出現問題的地方,忘記或者錯誤的內存回收會致使程序或系統的不穩定甚至崩潰,Java提供的GC功能能夠自動監測對象是否超過做用域從而達到自動回收內存的目的,Java語言沒有提供釋放已分配內存的顯示操做方法。
內部類是指在一個外部類的內部再定義一個類。內部類做爲外部類的一個成員,而且依附於外部類而存在的。內部類可爲靜態,可用protected和private修飾(而外部類只能使用public和缺省的包訪問權限)。
內部類主要有如下幾類:成員內部類、局部內部類、靜態內部類、匿名內部類。
典型的狀況是,內部類繼承自某個類或實現某個接口,內部類的代碼操做建立其的外圍類的對象。因此你能夠認爲內部類提供了某種進入其外圍類的窗口。
使用內部類最吸引人的緣由是:每一個內部類都能獨立地繼承自一個(接口的)實現,因此不管外圍類是否已經繼承了某個(接口的)實現,對於內部類都沒有影響。若是沒有內部類提供的能夠繼承多個具體的或抽象的類的能力,一些設計與編程問題就很難解決。從這個角度看,內部類使得多重繼承的解決方案變得完整。接口解決了部分問題,而內部類有效地實現了「多重繼承」。
徹底能夠。若是不是靜態內部類,那沒有什麼限制!
若是你把靜態嵌套類看成內部類的一種特例,那在這種狀況下不能夠訪問外部類的普通成員變量,而只能訪問外部類中的靜態成員,例如,下面的代碼:
class Outer
{
static int x;
static class Inner
{
void test()
{
syso(x);
}
}
}
答題時,也要能察言觀色,揣摩提問者的心思,顯然人家但願你說的是靜態內部類不能訪問外部類的成員,但你一上來就頂牛,這很差,要先順着人家,讓人家滿意,而後再說特殊狀況,讓人家吃驚。
能夠繼承其餘類或實現其餘接口。不只是能夠,而是必須!
java –version
1)String.valueOf()
2)"" + 數字
3)Integer.toString()
1)new關鍵字
2)反射
3)克隆
4)反序列化
testObject.java
public class testObject implements Serializable{}
userTest.java
import java.io.File;
import java.io.FileOutputStream;
import java.io.ObjectOutputStream;
public class useTest{
public static void main(String[] args){
FileOutputStream fileOut = null;
ObjectOutputStream out = null;
Try{
fileOut = new FileOutputStream(new File(「c:\\test.dat」));
out = new ObjectOutputStream(fileOut);
out.writeObject(new testObject());
}catch(Exception e){
e.printStackTrace();
}finally{
try{
fileOut.close();
fileOut = null;
out.close();
out = null;
}catch(Exception e){
}
}
}
}
<html>
<head>
<title>NewPage1</title>
</head>
<body>
<form method="POST" action="test.php"> <p>查詢日期(yyyymmddhh):<br>
從 <input type="text" name="DateFrom" size="20"><br>
到 <input type="text" name="DateTo" size="20"></p><p>
<input type="submit" value="提交" name="submit1">
<input type="reset" value="重寫" name="reset1">
</p>
</form>
</body>
</html>
答:
<html>
<head>
<script type="text/javascript">
function fun(obj){
if(!isDate(obj.value)){
alert("日期格式錯誤!");
obj.value="";
}
}
function isDate(str){
var reg = /^(\d{4})(\d{2})(\d{2})(\d{2})$/;
var result = str.match(reg);
if(result == null||parseFloat(result[4])>23)return false;
var t=result[1]+","+parseFloat(result[2])+","+parseFloat(result[3]);
var d = new Date(result[1],result[2]-1,result[3]);
var newStr = d.getFullYear()+","+parseFloat(d.getMonth
()+1)+","+parseFloat(d.getDate());
return t == newStr;
}
</script>
</head>
<form method="POST" action=""> <p>查詢日期(2003010812):<br>
從<input type="text" name="DateFrom" size="20" onblur="fun(this)"><br>
到<input type="text" name="DateTo" size="20" onblur="fun(this)"></p><p>
</form>
</html>
Java與JavaScript是目前比較流行的兩種語言,單從表面上看,二者名稱很類似,因而許多初學者容易將兩者混淆,或者直接歸爲一類,其實否則,雖然二者有着緊密的聯繫,但確是兩個徹底不一樣的語言。接下來,筆者僅就她們的幾個主要差異概括起來。
一.開發廠商
衆所周知,Java是SUN公司推出的程序設計語言,特別適合於Internet應用程序開發,其前身是Oak語言,而JavaScript則是NetScape公司的產品,是爲了擴展NetScape Navigator功能而開發的一種可嵌入Web頁面中的解釋性語言,其前身是Live Script。因爲Java的普及,NetScape和SUN兩家公司簽定合同後纔將其命名爲JavaScript。
二.面向對象與基於對象
Java是一種真正的純面向對象編程語言,在Java中,一切都是對象;JavaScript是一種腳本語言,因爲她自己提供了很是豐富的內部對象供程序員使用,於是它是基於對象的語言。
三.開發和運行環境的不一樣
若但願利用Java編寫程序並使之運行,必須事先在系統內安裝相應版本的JDK和JVM,保證代碼可以獲得編譯和運行的環境;而編寫JavaScript則相對簡單,只需使用某種HTML文檔編輯器甚至某種字符編輯器(如Notepad)便可,而後打開瀏覽器便可運行。
四.變量的區別
Java中使用變量在編譯以前必須聲明其數據類型,於是她採用的是強類型變量;JavaScript則不用在變量前聲明類型,而是由解釋器在運行時自動檢查,因此她是弱類型變量。
五.標籤的不一樣
利用Java寫出的Applet小程序,在HTML中用<applet>……</applet>來標識;JavaScript程序在HTML中運行,其代碼在<Script>……</Script>標籤內。
六.解釋與編譯
Java源代碼在執行前被編譯,於是在網絡應用中,必需要求客戶端安裝有解釋平臺,也就意味着Java應用不與HTML文檔集成(Applet小程序例外);JavaScript是一種解釋性語言,其代碼在發往客戶端以前不需編譯,而是將其嵌入到HTML文檔中,一塊兒發送給客戶端,由瀏覽器解釋執行。
另外,JavaScript僅是一種解釋性語言,並無複雜的語法和規則,更不支持如Java裏的繼承這樣的性質,所以也比Java更加容易學習。
主要數據類型:string, boolean, number
複合數據類型:function, object
JavaScript是一種腳本語言,它採用小程序段的方式實現編程。像其它腳本語言同樣,JavaScript一樣已經是一種解釋性語言,它提供了一個易的開發過程。它的基本結構形式與C、C++、VB、Delphi十分相似。但它不像這些語言同樣,須要先編譯,而是在程序運行過程當中被逐行地解釋。它與HTML標識結合在一塊兒,從而方便用戶的使用操做。
2)基於對象的語言。
JavaScript是一種基於對象的語言,同時以能夠看做一種面向對象的。這意味着它能運用本身已經建立的對象。所以,許多功能能夠來自於腳本環境中對象的方法與腳本的相互做用。 3)簡單性
JavaScript的簡單性主要體如今:首先它是一種基於Java基本語句和控制流之上的簡單而緊湊的設計, 從而對於學習Java是一種很是好的過渡。其次它的變量類型是採用弱類型,並未使用嚴格的數據類型。
4)安全性
JavaScript是一種安全性語言,它不容許訪問本地的硬盤,並不能將數據存入到服務器上,不容許對網絡文檔進行修改和刪除,只能經過瀏覽器實現信息瀏覽或動態交互。從而有效地防止數據的丟失。
5)動態性的
JavaScript是動態的,它能夠直接對用戶或客戶輸入作出響應,無須通過Web服務程序。它對用戶的反映響應,是採用以事件驅動的方式進行的。所謂事件驅動,就是指在主頁(Home Page)中執行了某種操做所產生的動做,就稱爲「事件」(Event)。好比按下鼠標、移動窗口、選擇菜單等均可以視爲事件。當事件發生後,可能會引發相應的事件響應。
6)跨平臺性
JavaScript是依賴於瀏覽器自己,與操做環境無關,只要能運行瀏覽器的計算機,並支持JavaScript的瀏覽器就可正確執行。從而實現了「編寫一次,走遍天下」的夢想。實際上JavaScript最傑出之處在於能夠用很小的程序作大量的事。無須有高性能的電腦,軟件僅需一個字處理軟件及一瀏覽器,無須WEB服務器通道,經過本身的電腦便可完成全部的事情。
使用ajax的最大優勢,就是能在不更新整個頁面的前提下維護數據。這使得web應用程序更爲迅捷地迴應用戶動做,並避免了在網絡上發送那些沒有改變過的信息。
這是js調試代碼存在已久的問題,簡單的咱們能夠使用瀏覽器提供的錯誤提示框,還有能夠使用DW CS4提供的糾正錯誤,或者經過專業的插件,如firebug等
這個問題是你們遇到最多見的問題之一,由於修改了js內容調試的時候並不能顯示新寫代碼的結果,是由於Js爲了加速頁面執行,當前頁面會使用緩存保持當前調用的相同的鏈接,爲了開發時調試方即可以在鏈接地址後面增長一個隨機函數.
在傳統的javascript中,若是想獲得服務器端數據庫或文件上的信息,或者發送客戶端信息到服務器,須要創建一個HTML form而後Post或者get提交數據到服務端。用戶須要點擊submit 來發送或者接受數據信息,而後等待服務器響應請求,頁面重寫加載,由於服務器每次都要返回一個新的頁面,因此傳統的web應用有可能會很慢並且用戶交互不友好。
使用ajax就能夠使javascript經過XMLHttpRequest對象直接與服務器進行交互。經過HTTPRequest,一個web頁面能夠發送一個請求到web服務器而且接受web服務器返回的信息(不須要加載任何界面),展現給用戶的仍是同一個頁面,用戶感受不到頁面刷新,也看不到Javascript後臺進行的發送請求和接受的響應。
表單驗證、網頁特效、網頁遊戲
1)jQuery是JavaScript的輕量級框架,對JavaScript進行了很好的封裝,不少複雜的JavaScript代碼不用寫了,直接調用就能夠,使開發簡單、高效。
2)jQuery強大的選擇器封裝了DOM,操做網頁元素更簡單了。
3)在大型JavaScript框架中,jQuery對性能的理解最好,大小不超過30KB。
4)完善的ajax有着出色的瀏覽器兼容性,任何瀏覽器使用ajax都能兼容。
5)基於jQuery開發的插件目前已經有大約數千個。開發者可以使用插件來進行表單確認、圖表種類、字段提示、動畫、進度條等任務。
基本:
$("#myELement") ID選擇器
$("div") 標籤選擇器
$(".myClass") 類選擇器
$("*") 通配符選擇器
層級選擇器
過濾選擇器
子元素選擇器
簡單的寫法(‘#id’)用來代替document.getElementById()。
支持css選擇器。
完善的處理機制,就算寫錯了Id也不會報錯。
若是是常規的ajax程序的話,使用load()、$.get()、$.post(),通常我會使用的是$.post()方法,若是須要設定,beforeSend(提交前回調函數),error(失敗後處理),success(成功後處理),及complete(請求完成後處理)毀掉函數等,這個時候我會使用$.ajax()
1)$.get方法使用get方法來進行一步請求,$.post是使用post方法來進行請求。
2)get請求會講參數跟在url後進行傳遞,而post請求則是做爲Http消息的實體.內容發送給web服務器的,這種傳遞是對用戶不可見的。
3)get方式傳輸的數據大小不能超過2kb而post請求要大的多
4)get方式請求的數據會被瀏覽器緩存起來,所以有安全問題
addClass()來追加樣式,removeClass()來刪除樣式,toggle()來切換樣式。
Html()方法,相似於innerHTML屬性,能夠用來讀取或者設置某個元素中的HTML內容,text()相似於innerText屬性,能夠用來讀取或這是某個元素的文本內容,val()能夠用來設置和獲取元素的值。
1)獲取頁面元素
2)修改頁面的外觀
3)修改頁面的內容
4)響應頁面的操做
5)爲頁面添加動態效果
6)無需刷新頁面,便可從服務器獲取信息
7)簡化常見的javascript的任務
html拼接、json數組、form表單通過serialize()序列化的
1)請求url
2)請求參數
3)請求類型,get或post
4)回調函數
5)傳輸類型,html或json等
去掉對web.xml的監視,把jsp提早編輯成Servlet。
有富餘物理內存的狀況,加大tomcat使用的jvm的內存
1)config 配置文件存放的路徑
2)webapps 項目部署的目錄
3)bin tomcat運行須要的腳本與jar包的目錄
4)lib 運行項目時所須要的jar包的目錄
5)work 部署項目的緩存目錄
6)temp 臨時文件存放的目錄
7)logs 記錄日誌的目錄
tomcat實際上是一種web服務器,java編寫的web項目能夠部署在其上,用戶在客戶端請求時,都是先將請求發送到tomcat上,tomcat再將請求發送到對應的項目上。
啓動tomcat
在Windows下:進入bin目錄,雙擊startup.bat
在Linux下:cd進入bin目錄,sh startup.sh
在開發工具eclipse中,右鍵選擇Debug Server或者Run Server
中止tomcat
在Windows下:進入bin目錄,雙擊shutdown.bat
在Linux下:cd進入bin目錄,sh shutdown.sh
在開發工具eclipse中,選擇服務器stop Server
配置文件在tomcat的config文件夾下
日誌文件在logs文件夾下
在web容器中運行的服務器端java程序,主要用於響應HTTP請求。Servlet通常用於mvc中的控制器部分。
用來管理servlet生命週期的應用程序如(tomcat webloc等)
Servlet生命週期分爲實例化、初始化、響應請求調用service()方法、消亡階段調用destroy()方法。
執行過程以下:
1)當瀏覽器發送一個請求地址,tomcat會接收這個請求
2)tomcat會讀取項目中的web.xml中的配置
3)當請求地址符合servlet-mapping標籤映射的地址,會進入這個servlet
4)servlet首先會實例化(構造),而後初始化執行init()方法,init()方法至始至終執行一次,servlet對象是單實例
5)根據請求的方式是get或post,在service()方法中調用doget()或dopost()方法,完成這次請求
6)當服務器中止,會調用destroy()方法,銷燬實例
Servlet實例化有兩種,以下:
1) 第一次請求時,實例化servlet對象
2)在web.XML文件中的<Servlet></Servlet>之間添加<loadon-startup>1</loadon-startup>,tomcat啓動時就會實例化servlet對象
Form中的get和post方法,在數據傳輸過程當中分別對應了HTTP協議中的GET和POST方法。兩者主要區別以下:
1)Get是用來從服務器上得到數據,而Post是用來向服務器上傳數據;
2)Get將表單中數據按照variable=value的形式,添加到action所指向的URL後面,而且二者使用「?」鏈接,而各個變量之間使用「&」鏈接;Post是將表單中的數據放在form的數據體中,按照變量和值相對應的方式,傳遞到action所指向URL;
3)Get是不安全的,由於在傳輸過程,數據被放在請求的URL中;Post的全部操做對用戶來講都是不可見的;
4)Get傳輸的數據量小,這主要是由於受URL長度限制;而Post能夠傳輸大量的數據,因此在上傳文件只能使用Post;
5)Get限制Form表單的數據集必須爲ASCII字符,而Post支持整個ISO10646字符集;
6)Get是Form的默認方法。
public class ServletName extends HttpServlet {
public void doPost(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
}
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
}
}
forward是容器中控制權的轉向,是服務器請求資源,服務器直接訪問目標地址的URL,把那個URL的響應內容讀取過來,而後把這些內容再發給瀏覽器,瀏覽器根本不知道服務器發送的內容是從哪兒來的,因此它的地址欄中仍是原來的地址。 redirect就是服務端根據邏輯,發送一個狀態碼,告訴瀏覽器從新去請求那個地址,通常來講瀏覽器會用剛纔請求的全部參數從新請求,因此session,request參數均可以獲取,而且從瀏覽器的地址欄中能夠看到跳轉後的連接地址。前者更加高效,在前者能夠知足須要時,儘可能使用forward()方法,而且,這樣也有助於隱藏實際的連接;在有些狀況下,好比,須要跳轉到一個其它服務器上的資源,則必須使用sendRedirect()方法。
總結:forward是程序內部跳轉,不會跳出tomcat服務器,redirect能夠外部跳轉,從一個服務器跳轉到另外一個服務器。
轉發:request.getRequestDispatcher (「demo.jsp"). forward(request, response);
重定向:response.sendRedirect(「demo.jsp");
能夠驗證客戶是否來自可信的網絡,能夠對客戶提交的數據進行從新編碼,能夠從系統裏得到配置的信息,能夠過濾掉客戶的某些不該該出現的詞彙,能夠驗證用戶是否登陸,能夠驗證客戶的瀏覽器是否支持當前的應用,能夠記錄系統的日誌等等。
<%@page language=」java」 contenType=」text/html;charset=gb2312」 session=」true」 buffer=」64kb」 autoFlush=」true」 isThreadSafe=」true」 info=」text」 errorPage=」error.jsp」 isErrorPage=」true」 isELIgnored=」true」 pageEncoding=」gb2312」 import=」java.sql.*」%>
isErrorPage:是否能使用Exception對象;isELIgnored:是否忽略EL表達式;
<%@include file=」filename」%>
<%@taglib prefix=」c」uri=」http://……」%>
JSP中的請求轉發可利用forward動做實現:<jsp:forward />;
Serlvet中實現請求轉發的方式爲:
getServletContext().getRequestDispatcher(path).forward(req,res)。
1)JSP頁面亂碼
<%@ page contentType=」text/html ; charset=utf-8」%>
2)表單提交中文時出現亂碼
request.setCharacterEncoding(「utf-8」);
3)數據庫鏈接出現亂碼
是數據庫鏈接中加入useUnicode=true&characterEncoding=utf-8;
1)二者的做用範圍不一樣:
Session對象是用戶級的,而Application是應用程序級別的
一個用戶一個session對象,每一個用戶的session對象不一樣,在用戶所訪問的網站多個頁面之間共享同一個session對象
一個Web應用程序一個application對象,每一個Web應用程序的application對象不一樣,但一個Web應用程序的多個用戶之間共享同一個application對象。
二者的生命週期不一樣:
session對象的生命週期:用戶首次訪問網站建立,用戶離開該網站 (不必定要關閉瀏覽器) 消亡。
application對象的生命週期:啓動Web服務器建立,關閉Web服務器銷燬。
JSP共有如下9種基本內置組件
request:用戶端請求,此請求會包含來自GET/POST請求的參數;
response:網頁傳回用戶端的迴應;
pageContext:網頁的屬性是在這裏管理;
session:與請求有關的會話期;
application:servlet正在執行的內容;
out:用來傳送回應的輸出;
config:servlet的構架部件;
page:JSP網頁自己;
exception:針對錯誤網頁,未捕捉的例外
JSP共有如下6種基本動做
jsp:include:在頁面被請求的時候引入一個文件。
jsp:useBean:尋找或者實例化一個JavaBean。
jsp:setProperty:設置JavaBean的屬性。
jsp:getProperty:輸出某個JavaBean的屬性。
jsp:forward:把請求轉到一個新的頁面。
jsp:plugin:根據瀏覽器類型爲Java插件生成OBJECT或EMBED標記
動態INCLUDE用jsp:include動做實現,<jsp:include page=included.jsp flush=true />它老是會檢查所含文件中的變化,適合用於包含動態頁面,而且能夠帶參數 ,先將嵌入的jsp頁面編譯,而後把編譯後的內容放入到主頁面進行處理,編譯兩次。
靜態INCLUDE用include僞碼實現,使用jsp指令引用<%@ include file=included.htm %>,不會檢查所含文件的變化,適用於包含靜態頁面,先將內容先包含到主頁面而後在一塊兒編譯,只編譯一次。
JSP是Servlet技術的擴展,本質上是Servlet的簡易方式,更強調應用的外表表達。JSP編譯後是"類servlet"。Servlet和JSP最主要的不一樣點在於,Servlet的應用邏輯是在Java文件中,而且徹底從表示層中的HTML裏分離開來。而JSP的狀況是Java和HTML能夠組合成一個擴展名爲.jsp的文件。JSP側重於視圖,Servlet主要用於控制邏輯。
Request、session、application、cookie等
1)cookie數據存放在客戶的瀏覽器上,session數據放在服務器上。
2)cookie不是很安全,別人能夠分析存放在本地的COOKIE並進行COOKIE欺騙考慮到安全應當使用session。
3)session會在必定時間內保存在服務器上。當訪問增多,會比較佔用你服務器的性能考慮到減輕服務器性能方面,應當使用COOKIE。
4)單個cookie保存的數據不能超過4K,不少瀏覽器都限制一個站點最多保存20個cookie。
觸發器是一種特殊的存儲過程,主要是經過事件來觸發而被執行的。它能夠強化約束,來維護數據的完整性和一致性,能夠跟蹤數據庫內的操做從而不容許未經許可的更新和變化。能夠聯級運算。如,某表上的觸發器上包含對另外一個表的數據操做,而該操做又會致使該表觸發器被觸發。
存儲過程是一個預編譯的SQL語句,優勢是容許模塊化的設計,就是說只需建立一次,之後在該程序中就能夠調用屢次。若是某次操做須要執行屢次SQL,使用存儲過程比單純SQL語句執行要快。
調用:
1)能夠用一個命令對象來調用存儲過程。
2)能夠供外部程序調用,好比:java程序。
優勢:
1)存儲過程是預編譯過的,執行效率高。
2)存儲過程的代碼直接存放於數據庫中,經過存儲過程名直接調用,減小網絡通信。
3)安全性高,執行存儲過程須要有必定權限的用戶。
4)存儲過程能夠重複使用,可減小數據庫開發人員的工做量。
缺點:移植性差
存儲過程 |
函數 |
用於在數據庫中完成特定的操做或者任務(如插入、刪除等) |
用於特定的數據(如選擇) |
程序頭部聲明用procedure |
程序頭部聲明用function |
程序頭部聲明時不需描述返回類型 |
程序頭部聲明時要描述返回類型,並且PL/SQL塊中至少要包括一個有效的return語句 |
能夠使用in/out/in out 三種模式的參數 |
能夠使用in/out/in out 三種模式的參數 |
可做爲一個獨立的PL/SQL語句來執行 |
不能獨立執行,必須做爲表達式的一部分調用 |
能夠經過out/in out 返回零個或多個值 |
經過return語句返回一個值,且改值要與聲明部分一致,也能夠是經過out類型的參數帶出的變量 |
SQL語句(DML 或SELECT)中不可調用存儲過程 |
SQL語句(DML 或SELECT)中能夠調用函數 |
索引就一種特殊的查詢表,數據庫的搜索能夠利用它加速對數據的檢索。它很相似與現實生活中書的目錄,不須要查詢整本書內容就能夠找到想要的數據。索引能夠是惟一的,建立索引容許指定單個列或者是多個列。缺點是它減慢了數據錄入的速度,同時也增長了數據庫的尺寸大小。
惟1、不爲空、常常被查詢的字段
邏輯上:
Single column 單行索引
Concatenated 多行索引
Unique 惟一索引
NonUnique 非惟一索引
Function-based函數索引
Domain 域索引
物理上:
Partitioned 分區索引
NonPartitioned 非分區索引
B-tree:
Normal 正常型B樹
Rever Key 反轉型B樹
Bitmap 位圖索引
事務就是被綁定在一塊兒做爲一個邏輯工做單元的SQL語句分組,若是任何一個語句操做失敗那麼整個操做就被失敗,之後操做就會回滾到操做前狀態,或者是上有個節點。爲了確保要麼執行,要麼不執行,就能夠使用事務。要將有組語句做爲事務考慮,就須要經過ACID測試,即原子性,一致性,隔離性和持久性。
鎖:在因此的DBMS中,鎖是實現事務的關鍵,鎖能夠保證事務的完整性和併發性。與現實生活中鎖同樣,它能夠使某些數據的擁有者,在某段時間內不能使用某些數據或數據結構。固然鎖還分級別的。
視圖:是一種虛擬的表,具備和物理表相同的功能。能夠對視圖進行增,改,查,操做,試圖一般是有一個表或者多個表的行或列的子集。對視圖的修改不影響基本表。它使得咱們獲取數據更容易,相比多表查詢。
遊標:是對查詢出來的結果集做爲一個單元來有效的處理。遊標能夠定在該單元中的特定行,從結果集的當前行檢索一行或多行。能夠對結果集當前行作修改。通常不使用遊標,可是須要逐條處理數據的時候,遊標顯得十分重要。
優勢:
1)對數據庫的訪問,由於視圖能夠有選擇性的選取數據庫裏的一部分。
2)用戶經過簡單的查詢能夠從複雜查詢中獲得結果。
3)維護數據的獨立性,試圖可從多個表檢索數據。
4)對於相同的數據可產生不一樣的視圖。
缺點:
性能:查詢視圖時,必須把視圖的查詢轉化成對基本表的查詢,若是這個視圖是由一個複雜的多表查詢所定義,那麼,即便是視圖的一個簡單查詢,也把它變成一個複雜的結合體,須要花費必定的時間。
內鏈接、自鏈接、外鏈接(左、右、全)、交叉鏈接
內鏈接:只有兩個元素表相匹配的才能在結果集中顯示。
外鏈接:
左外鏈接:左邊爲驅動表,驅動表的數據所有顯示,匹配表的不匹配的不會顯示。
右外鏈接:右邊爲驅動表,驅動表的數據所有顯示,匹配表的不匹配的不會顯示。
全外鏈接:鏈接的表中不匹配的數據所有會顯示出來。
交叉鏈接: 笛卡爾效應,顯示的結果是連接表數的乘積。
主鍵在本表中是惟一的、不可惟空的,外鍵能夠重複能夠惟空;外鍵和另外一張表的主鍵關聯,不能建立對應表中不存在的外鍵。
1.建索引
2.減小表之間的關聯
3.優化sql,儘可能讓sql很快定位數據,不要讓sql作全表查詢,應該走索引,把數據 量大的表排在前面
4.簡化查詢字段,沒用的字段不要,已經對返回結果的控制,儘可能返回少許數據
5.儘可能用PreparedStatement來查詢,不要用Statement
第一範式(1NF):字段具備原子性,不可再分。全部關係型數據庫系統都知足第一範式。
數據庫表中的字段都是單一屬性的,不可再分。例如,姓名字段,其中的姓和名必須做爲一個總體,沒法區分哪部分是姓,哪部分是名,若是要區分出姓和名,必須設計成兩個獨立的字段。
第二範式(2NF):是在第一範式(1NF)的基礎上創建起來的,即知足第二範式(2NF)必須先知足第一範式(1NF)。
要求數據庫表中的每一個實例或行必須能夠被唯一地區分。一般須要爲表加上一個列,以存儲各個實例的唯一標識。這個唯一屬性列被稱爲主關鍵字或主鍵。
第二範式(2NF)要求實體的屬性徹底依賴於主關鍵字。所謂徹底依賴是指不能存在僅依賴主關鍵字一部分的屬性,若是存在,那麼這個屬性和主關鍵字的這一部分應該分離出來造成一個新的實體,新實體與原實體之間是一對多的關係。爲實現區分一般須要爲表加上一個列,以存儲各個實例的唯一標識。簡而言之,第二範式就是非主屬性非部分依賴於主關鍵字。
第三範式(3NF):必須先知足第二範式(2NF)。簡而言之,第三範式(3NF)要求一個數據庫表中不包含已在其它表中已包含的非主關鍵字信息。
因此第三範式具備以下特徵:
1,每一列只有一個值
2,每一行都能區分。
3,每個表都不包含其餘表已經包含的非主關鍵字信息。
例如,帖子表中只能出現發帖人的id,而不能出現發帖人的id,還同時出現發帖人姓名,不然,只要出現同一發帖人id的全部記錄,它們中的姓名部分都必須嚴格保持一致,這就是數據冗餘。
UNION在進行表連接後會篩選掉重複的記錄,因此在表連接後會對所產生的結果集進行排序運算,刪除重複的記錄再返回結果。實際大部分應用中是不會產生重複的記錄,最多見的是過程表與歷史表UNION。
UNION ALL只是簡單的將兩個結果合併後就返回。這樣,若是返回的兩個結果集中有重複的數據,那麼返回的結果集就會包含重複的數據了。
從效率上說,UNION ALL 要比UNION快不少,因此,若是能夠確認合併的兩個結果集中不包含重複的數據的話,那麼就使用UNION ALL。
Char的長度是固定的,而varchar2的長度是能夠變化的,好比,存儲字符串「abc」對於char(20),表示你存儲的字符將佔20個字節,包含17個空,而一樣的varchar2(20)只佔了3個字節,20只是最大值,當你存儲的字符小於20時,按實際長度存儲。
char的效率要被varchar2的效率高。
目前varchar是varchar2的同義詞,工業標準的varchar類型能夠存儲空字符串,可是oracle不能這樣作,儘管它保留之後這樣作的權利。Oracle本身開發了一個數據類型varchar2,這個類型不是一個標準的varchar,他將在數據庫中varchar列能夠存儲空字符串的特性改成存儲null值,若是你想有向後兼容的能力,oracle建議使用varchar2而不是varchar
1)庫函數不一樣。
2)Oracle是用表空間來管理的,Mysql不是。
3)顯示當前全部的表、用戶、改變鏈接用戶、顯示當前鏈接用戶、執行外部腳本的語句的不一樣。
4)分頁查詢時候,mysql用limt oracle用rownum
5)sql的語法的不一樣。
Oracle語句分三類:DDL、DML、DCL。
DDL(Data Definition Language)數據定義語言,包括:
Create語句:能夠建立數據庫和數據庫的一些對象。
Drop語句:能夠刪除數據表、索引、觸發程序、條件約束以及數據表的權限等。
Alter語句:修改數據表定義及屬性。
Truncate語句:刪除表中的全部記錄,包括全部空間分配的記錄被刪除。
DML(Data Manipulation Language)數據操控語言,包括:
Insert語句:向數據表張插入一條記錄。
Delete語句:刪除數據表中的一條或多條記錄,也能夠刪除數據表中的全部記錄,可是它的操做對象還是記錄。
Update語句:用於修改已存在表中的記錄的內容。
Select語句:用於查詢已存在表中的記錄的內容。
DCL(Data Control Language)數據庫控制語言,包括:
Grant語句:容許對象的建立者給某用戶或某組或全部用戶(PUBLIC)某些特定的權限。
Revoke語句:能夠廢除某用戶或某組或全部用戶訪問權限
使用rownum,兩種以下:
第一種:
select * from (select t.*,rownum row_num from mytable t) b where b.row_num between 1 and 10
第二種:
select * from ( select a.*, rownum rn from mytable a where rownum <= 10 ) where rn >= 1
使用rowid,以下:
select * from scott.emp where rowid in (select rd from (select rowid as rd ,rownum as rn from scott.emp ) where rn<=6 and rn>3)
select * from (select * from t_example order by dbms_random.random) where rownum <= 50
order by 排序查詢、asc升序、desc降序
group by 分組查詢、having 只能用於group by子句、做用於組內,having條件子句能夠直接跟函數表達式。使用group by 子句的查詢語句須要使用聚合函數。
oracle的commit就是DML語句提交數據(這裏是釋放鎖不是鎖表),在未提交前你前面的操做更新的都是內存,沒有更新到物理文件中。
執行commit從用戶角度講就是更新到物理文件了,事實上commit時尚未寫date file,而是記錄了redo log file,要從內存寫到data物理文件,須要觸發檢查點,由DBWR這個後臺進程來寫,這裏內容有點多的,若是不深究的話你就理解成commit即爲從內存更新到物理文件。
1)使用decode函數
2)使用case when語句
PL/SQL是一種程序語言,叫作過程化SQL語言(Procedural Language/SQL)。PL/SQL是Oracle數據庫對SQL語句的擴展。在普通SQL語句的使用上增長了編程語言的特色,因此PL/SQL把數據操做和查詢語句組織在PL/SQL代碼的過程性單元中,經過邏輯判斷、循環等操做實現複雜的功能或者計算。PL/SQL 只有 Oracle 數據庫有。 MySQL 目前不支持 PL/SQL 的。
Oracle使用序列來生成惟一編號,用來處理一個表中自增字段。 Oracle序列是原子對象,而且是一致的。也就是說,一旦您訪問一個序列號,Oracle將在處理下一個請求以前自動遞增下一個編號,從而確保不會出現重複值。
視圖其實就是一條查詢sql語句,用於顯示一個或多個表或其餘視圖中的相關數據。
表就是關係數據庫中實際存儲數據用的。
1)字符串類型
char、nchar、varchar、varchar二、nvarchar2
2)數字類型
number、integer
3)浮點類型
binary_float、binary_double、float
4)日期類型
date、 timestamp
5)LOB類型
blob、clob、nclob、bfile
TRUNCATE TABLE 在功能上與不帶 WHERE 子句的 DELETE 語句相同:兩者均刪除表中的所有行。但 TRUNCATE TABLE 比 DELETE 速度快,且使用的系統和事務日誌資源少。 DELETE 語句每次刪除一行,並在事務日誌中爲所刪除的每行記錄一項。
TRUNCATE TABLE 經過釋放存儲表數據所用的數據頁來刪除數據,而且只在事務日誌中記錄頁的釋放。
TRUNCATE,DELETE,DROP放在一塊兒比較:
TRUNCATE TABLE:刪除內容、釋放空間但不刪除定義。
DELETE TABLE:刪除內容不刪除定義,不釋放空間。
DROP TABLE:刪除內容和定義,釋放空間。
select to_char(sysdate, 'yyyy-MM-dd HH24:mi:ss') from dual;
使用distinct關鍵字
A(id ,name,regdate)
B(id,groupid)
C(id,name2)
寫出下面的SQL語句
A)統計A表中每月註冊用戶數
select count(*),to_char(regdate,'yyyymm') from A group by to_char(regdate,'yyyymm');
B)統計A表中有姓名相同的用戶數
select count(*) from (select name from A group by name having count(*) >1);
C)若是表A中有姓名相同的用戶,把相同的查出,寫入表C中
nsert into C(name2) select name from A group by name having count(*) >1;
D)A中ID有多個相同的數據,A中姓名相同的ID只保留註冊時間最大的數據
delete from E where e.regdate < (select max(regdate) from a X where E.id = X.id);
Student(S#,SN,SD)學生表
Course(C#,CN,T#)課程表
SC(S#,C#,score)成績表
1.查詢選了課程‘稅收’的學生的學號和名字
答:
select SN,SD from Student where S# in(
select S# from Course C , SC where C.C#=SC.C# and CN=’稅收基礎’);
2.查詢選課數量大於5的學生的學號和名字
答:
select SN,SD from Student where S# in (
select S# from SC group by S# having count(distinct C#) > 5);
)
3.創建一個學生表students,包括name,age,head_teacher,id,score(姓名,年齡,班主任,學號,成績)
Create table students
(
Id number(9) not null primary key,
Name varchar2(40) not null,
Age int check(age between 0 and 100),
Head_teacher vachar2(40),
Score float
);
4.對上表插入一條記錄,姓名:張三,年齡:18,班主任:李四,學號:22
Insert into student(id,name,age,head_teacher) values(‘22’,’張三’,’18’,’李四’);
5.對上表中的age+name建立一個索引,並說明它的做用和使用方法
Create index student_index on students(age,name);
year month amount
2012 1 1.1
2012 2 1.2
2012 3 1.3
2012 4 1.4
2012 4 1.6
2013 1 2.1
2013 2 2.2
2013 2 2.2
2013 3 2.3
2013 4 2.4
查成這樣一個結果
year m1 m2 m3 m4
2012 1.1 1.2 1.3 3
2013 2.1 4.4 2.3 2.4
Select
year,
Sum(case when month = 1 then amount else 0 end) as m1,
Sum(case when month = 2 then amount else 0 end) as m2,
Sum(case when month = 3 then amount else 0 end) as m3,
Sum(case when month = 4 then amount else 0 end) as m4
From tmp_table_201307 a
Group by year
Order by 1;
SQL> desc ismg_icp_flow
Name Null Type
————————————————————————————————
ICPNO NOT NULL VARCHAR2(6)
SERVICE_ID NOT NULL VARCHAR2(10)
STAT_MIN NOT NULL DATETIME
MT_RECV_OK NOT NULL NUMBER(10)
請寫出一條SQL語句同時知足如下3個條件:
計算MT_RECV_OK的總和(顯示爲total),並以此對結果集進行升序排序
以ICPNO和SERVICE_ID兩個字段進行分組
所得出數據的STAT_MIN必須爲大於2003年1月1號0時0分而且小於2003 年2月1號0時0分
指望的輸出結果以下:
ICPNO SERVICE_ID TOTAL
———— —————— ————————————
901001 7700 271965
901001 7800 3857795
答:
select ICPNO,SERVICE_ID,sum(MT_RECV_OK) TOTAL
from ismg_icp_flow
where STAT_MIN between to_date('2003-1-1','yyyy-mm-dd')
and to_date('2003-2-1','yyyy-mm-dd')
group by ICPNO,SERVICE_ID
order by TOTAL;
實現線程有兩種方式:1.繼承Thread類,重寫run方法,在調用start方法。
實現Runnable接口,重寫run方法。在傳給Thread構造器,調用時調用Thread的start方法。
用synchronized關鍵字修飾同步方法 。
不使用stop(),是由於它不安全。它會解除由線程獲取的全部鎖定,並且若是對象處於一種不連貫狀態,那麼其餘線程能在那種狀態下檢查和修改它們。結果很難檢查出真正的問題所在。suspend()方法容易發生死鎖。調用suspend()的時候,目標線程會停下來,但卻仍然持有在這以前得到的鎖定。此時,其餘任何線程都不能訪問鎖定的資源,除非被"掛起"的線程恢復運行。對任何線程來講,若是它們想恢復目標線程,同時又試圖使用任何一個鎖定的資源,就會形成死鎖。因此不該該使用suspend(),而應在本身的Thread類中置入一個標誌,指出線程應該活動仍是掛起。若標誌指出線程應該掛起,便用wait()命其進入等待狀態。若標誌指出線程應當恢復,則用一個notify()從新啓動線程。
sleep是線程類(Thread)的方法,致使此線程暫停執行指定時間,給執行機會給其餘線程,可是監控狀態依然保持,到時後會自動恢復。調用sleep不會釋放對象鎖。 wait是Object類的方法,對此對象調用wait方法致使本線程放棄對象鎖,進入等待此對象的等待鎖定池,只有針對此對象發出notify方法(或notifyAll)後本線程才進入對象鎖定池準備得到對象鎖進入運行狀態。
分幾種狀況:
1)其餘方法前是否加了synchronized關鍵字,若是沒加,則能。
2)若是這個方法內部調用了wait,則能夠進入其餘synchronized方法。
3)若是其餘個方法都加了synchronized關鍵字,而且內部沒有調用wait,則不能。
4)若是其餘方法是static,它用的同步鎖是當前類的字節碼,與非靜態的方法不能同步,由於非靜態的方法用的是this。
一個程序中能夠有多條執行線索同時執行,一個線程就是程序中的一條執行線索,每一個線程上都關聯有要執行的代碼,便可以有多段程序代碼同時運行,每一個程序至少都有一個線程,即main方法執行的那個線程。若是隻是一個cpu,它怎麼可以同時執行多段程序呢?這是從宏觀上來看的,cpu一會執行a線索,一會執行b線索,切換時間很快,給人的感受是a,b在同時執行,比如你們在同一個辦公室上網,只有一條連接到外部網線,其實,這條網線一會爲a傳數據,一會爲b傳數據,因爲切換時間很短暫,因此,你們感受都在同時上網。
線程是程序執行流的最小單元,相對獨立、可調度的執行單元,是系統獨立調度和分派CPU的基本單位。在單個程序中同時運行多個線程完成不一樣的工做,稱爲多線程。
程序是一段靜態的代碼,是應用軟件執行的藍本。
進程是程序一次動態執行的過程,它對應了從代碼加載、執行完畢的一個完整過程,這也是進程開始到消亡的過程。
線程是進程中獨立、可調度的執行單元,是執行中最小單位。
一個程序通常是一個進程,但能夠一個程序中有多個進程。
一個進程中能夠有多個線程,但只有一個主線程。
Java應用程序中默認的主線程是main方法,若是main方法中建立了其餘線程,JVM就會執行其餘的線程。
建立線程有三種方式:
1)是繼承Thread類,建立格式以下:
Thread thread = new Thread();
2)是實現Runnable接口,建立格式以下:
Thread thread = new Thread(new Runnable());
其實Thread類實現了Runnable接口
3)經過線程池方式,獲取線程
package com.myjava.thread;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class ThreadPool {
private static int POOL_NUM = 10;
public static void main(String[] agrs){
ExecutorService executorService = Executors.newFixedThreadPool(5);
for (int i = 0; i < POOL_NUM; i++) {
RunnableThread thread = new RunnableThread();
executorService.execute(thread);
}
}
}
class RunnableThread implements Runnable{
private int THREAD_NUM = 10;
public void run() {
for (int i = 0; i <THREAD_NUM; i++) {
System.out.println("線程"+Thread.currentThread()+i);
}
}
}
建立--運行--中斷--死亡
建立:線程構造
運行:調用start()方法,進入run()方法
中斷:sleep()、wait()
死亡:執行完run()方法或強制run()方法結束,線程死亡
currentThread()方法是獲取當前線程
interrupt()喚醒休眠線程,休眠線程發生InterruptedException異常
1)新建狀態(New):新建立了一個線程對象。
2)就緒狀態(Runnable):線程對象建立後,其餘線程調用了該對象的start()方法。該狀態的線程位於可運行線程池中,變得可運行,等待獲取CPU的使用權。
3)運行狀態(Running):就緒狀態的線程獲取了CPU,執行程序代碼。
4)阻塞狀態(Blocked):阻塞狀態是線程由於某種緣由放棄CPU使用權,暫時中止運行。
5)死亡狀態(Dead):線程執行完了或者因異常退出了run()方法,該線程結束生命週期。
通俗的說,就是能夠將內存中Java對象能夠寫在硬盤上(序列化到硬盤上),反序列化就是講硬盤的內容讀取到內存中去;java是經過實現Serializable接口,實現的序列化,Serializable接口裏面沒有任何的方法,只是個標示接口。
答:listFiles方法接受一個FileFilter對象,這個FileFilter對象就是過慮的策略對象,不一樣的人提供不一樣的FileFilter實現,即提供了不一樣的過濾策略。
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FilenameFilter;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
public class Jad2Java {
public static void main(String[] args) throws Exception {
File srcDir = new File("java");
if(!(srcDir.exists() && srcDir.isDirectory()))
throw new Exception("目錄不存在");
File[] files = srcDir.listFiles(
new FilenameFilter(){
public boolean accept(File dir, String name) {
return name.endsWith(".java");
}
}
);
System.out.println(files.length);
File destDir = new File("jad");
if(!destDir.exists()) destDir.mkdir();
for(File f :files){
FileInputStream fis = new FileInputStream(f);
String destFileName = f.getName().replaceAll("\\.java$", ".jad");
FileOutputStream fos = new FileOutputStream(new File(destDir,destFileName));
copy(fis,fos);
fis.close();
fos.close();
}
}
private static void copy(InputStream ips,OutputStream ops) throws Exception{
int len = 0;
byte[] buf = new byte[1024];
while((len = ips.read(buf)) != -1){
ops.write(buf,0,len);
}
}
}
由本題總結的思想及策略模式的解析:
1.
class jad2java{
1. 獲得某個目錄下的全部的java文件集合
1.1 獲得目錄 File srcDir = new File("d:\\java");
1.2 獲得目錄下的全部java文件:File[] files = srcDir.listFiles(new MyFileFilter());
1.3 只想獲得.java的文件: class MyFileFilter implememyts FileFilter{
public boolean accept(File pathname){
return pathname.getName().endsWith(".java")
}
}
2.將每一個文件複製到另一個目錄,並改擴展名
2.1 獲得目標目錄,若是目標目錄不存在,則建立之
2.2 根據源文件名獲得目標文件名,注意要用正則表達式,注意.的轉義。
2.3 根據表示目錄的File和目標文件名的字符串,獲得表示目標文件的File。
//要在硬盤中準確地建立出一個文件,須要知道文件名和文件的目錄。
2.4 將源文件的流拷貝成目標文件流,拷貝方法獨立成爲一個方法,方法的參數採用抽象流的形式。
//方法接受的參數類型儘可能面向父類,越抽象越好,這樣適應面更寬廣。
}
分析listFiles方法內部的策略模式實現原理
File[] listFiles(FileFilter filter){
File[] files = listFiles();
//Arraylist acceptedFilesList = new ArrayList();
File[] acceptedFiles = new File[files.length];
int pos = 0;
for(File file: files){
boolean accepted = filter.accept(file);
if(accepted){
//acceptedFilesList.add(file);
acceptedFiles[pos++] = file;
}
}
Arrays.copyOf(acceptedFiles,pos);
//return (File[])accpetedFilesList.toArray();
}
字節流,字符流。字節流繼承於InputStream OutputStream,字符流繼承於InputStreamReader OutputStreamWriter。在java.io包中還有許多其餘的流,主要是爲了提升性能和使用方便
把一片二進制數據數據逐一輸出到某個設備中,或者從某個設備中逐一讀取一片二進制數據,無論輸入輸出設備是什麼,咱們要用統一的方式來完成這些操做,用一種抽象的方式進行描述,這個抽象描述方式起名爲IO流,對應的抽象類爲OutputStream和InputStream ,不一樣的實現類就表明不一樣的輸入和輸出設備,它們都是針對字節進行操做的。
在應用中,常常要徹底是字符的一段文本輸出去或讀進來,用字節流能夠嗎?計算機中的一切最終都是二進制的字節形式存在。對於「中國」這些字符,首先要獲得其對應的字節,而後將字節寫入到輸出流。讀取時,首先讀到的是字節,但是咱們要把它顯示爲字符,咱們須要將字節轉換成字符。因爲這樣的需求很普遍,人家專門提供了字符流的包裝類。
底層設備永遠只接受字節數據,有時候要寫字符串到底層設備,須要將字符串轉成字節再進行寫入。字符流是字節流的包裝,字符流則是直接接受字符串,它內部將串轉成字節,再寫入底層設備,這爲咱們向IO設別寫入或讀取字符串提供了一點點方便。
字符向字節轉換時,要注意編碼的問題,由於字符串轉成字節數組,
實際上是轉成該字符的某種編碼的字節形式,讀取也是反之的道理。
講解字節流與字符流關係的代碼案例:
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.InputStreamReader;
import java.io.PrintWriter;
public class IOTest {
public static void main(String[] args) throws Exception {
String str = "中國人";
/*FileOutputStream fos = new FileOutputStream("1.txt");
fos.write(str.getBytes("UTF-8"));
fos.close();*/
/*FileWriter fw = new FileWriter("1.txt");
fw.write(str);
fw.close();*/
PrintWriter pw = new PrintWriter("1.txt","utf-8");
pw.write(str);
pw.close();
/*FileReader fr = new FileReader("1.txt");
char[] buf = new char[1024];
int len = fr.read(buf);
String myStr = new String(buf,0,len);
System.out.println(myStr);*/
/*FileInputStream fr = new FileInputStream("1.txt");
byte[] buf = new byte[1024];
int len = fr.read(buf);
String myStr = new String(buf,0,len,"UTF-8");
System.out.println(myStr);*/
BufferedReader br = new BufferedReader(
new InputStreamReader(
new FileInputStream("1.txt"),"UTF-8"
)
);
String myStr = br.readLine();
br.close();
System.out.println(myStr);
}
總結:很簡單,字符流的底層就是字節流。而字符流主要是讀取文本文件內容的,能夠一個字符一個字符的讀取,也能夠一行一行的讀取文本文件內容。而字節流讀取單位爲byte.byte做爲計算機存儲最基本單位,能夠用字節流來讀取不少其餘格式的文件,好比圖片視頻等等。基於B/S和C/S的文件傳輸均可以採用字節流的形式。
File f = new File(fileName); //構造文件File類
f.isDirectory(); //判斷是否爲目錄
File f = new File(filePath); //構造文件File類
String[] fileName = f.list(); //獲取目錄下的文件名
File[] files = f.listFiles(); //獲取目錄下的文件
讀取文件:
public class FileRead {
/**
* 一、找到指定的文件
* 二、根據文件建立文件的輸入流
* 三、建立字節數組
* 四、讀取內容,放到字節數組裏面
* 五、關閉輸入流
* @param args
*/
public static void main(String[] args) {
File file = new File("E:" + File.separator + "hello.txt"); //構建指定文件
InputStream in = null;
try {
in = new FileInputStream(file); //根據文件建立文件的輸入流
byte[] data = new byte[1024]; //建立字節數組
in.read(data); //讀取內容,放到字節數組裏面
System.out.println(new String(data));
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally{
try {
in.close(); //關閉輸入流
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
寫入文件:
public class FileWriter {
/**
* 文件的輸出流,用來寫入文件內容
* 一、找到指定的文件
* 二、根據文件建立文件的輸出流
* 三、把內容轉換成字節數組
* 四、向文件寫入內容
* 五、關閉輸出流
* @param args
*/
public static void main(String[] args) {
File file = new File("E:" + File.separator + "hello.txt"); //構建指定文件
OutputStream out = null;
try {
out = new FileOutputStream(file); 根據文件建立文件的輸出流
String message = "黃曉明與bady結婚了,揚子和黃聖依有女兒了。";
byte[] mesByte = message.getBytes(); //把內容轉換成字節數組
out.write(mesByte); //向文件寫入內容
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally{
try {
out.close(); //關閉輸出流
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
public class FileCopy {
/**
* 實現思路
* 一、構建源文件與目標文件
* 二、源文件建立輸入流,目標文件建立輸出流
* 三、建立字節數組
* 四、使用循環,源文件讀取一部份內容,目標文件寫入一部份內容,直到寫完全部內容
* 五、關閉源文件輸入流,目標文件輸出流
* @param args
*/
public static void main(String[] args) {
//構建源文件
File file = new File("E:" + File.separator + "helloworld.txt");
//構建目標文件
File fileCopy = new File("D:" + File.separator + "helloworld.txt");
InputStream in = null;
OutputStream out = null;
try{
//目標文件不存在就建立
if(!(fileCopy.exists())) {
fileCopy.createNewFile();
}
//源文件建立輸入流
in = new FileInputStream(file);
//目標文件建立輸出流
out = new FileOutputStream(fileCopy, true);
//建立字節數組
byte[] temp = new byte[1024];
int length = 0;
//源文件讀取一部份內容
while((length = in.read(temp)) != -1) {
//目標文件寫入一部份內容
out.write(temp, 0, length);
}
}catch(IOException e) {
e.printStackTrace();
}finally {
try {
in.close(); //關閉源文件輸入流
out.close(); //關閉目標文件輸出流
}catch(IOException e) {
e.printStackTrace();
}
}
}
}
代碼以下:
package com.huawei.interview.lym;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Types;
public class JdbcTest {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Connection cn = null;
CallableStatement cstmt = null;
try {
//這裏最好不要這麼幹,由於驅動名寫死在程序中了
Class.forName("com.mysql.jdbc.Driver");
//實際項目中,這裏應用DataSource數據,若是用框架,
//這個數據源不須要咱們編碼建立,咱們只需Datasource ds = context.lookup()
//cn = ds.getConnection();
cn = DriverManager.getConnection("jdbc:mysql:///test","root","root");
cstmt = cn.prepareCall("{call insert_Student(?,?,?)}");
cstmt.registerOutParameter(3,Types.INTEGER);
cstmt.setString(1, "wangwu");
cstmt.setInt(2, 25);
cstmt.execute();
//get第幾個,不一樣的數據庫不同,建議不寫
System.out.println(cstmt.getString(3));
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
finally
{
/*try{cstmt.close();}catch(Exception e){}
try{cn.close();}catch(Exception e){}*/
try {
if(cstmt != null)
cstmt.close();
if(cn != null)
cn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
1)提升性能:在使用preparedStatement對象執行sql時候,命令被數據庫編譯和解析,而後被放到命令緩衝區,而後每當執行同一個preparedStatement時候,他就被再解析一次,但不會在編譯,在緩衝區中能夠發現預編譯的命令,而且能夠從新使用。
若是你要寫Insert update delete 最好使用preparedStatement,在有大量用戶的企業級應用軟件中,常常會執行相同的sql,使用preparedStatement會增長總體的性能。
2)安全性:PreparedStatement能夠防止sql注入。
package com.seecen.stream;
import java.sql.*;
public class TestJDBC {
/**
* 一、實例話驅動類
* 二、創建到數據庫的鏈接
* 三、將數據發送到數據庫中
* 四、執行語句(select語句)
* 五、關閉
* @param args
*/
public static void main(String[] args) {
ResultSet rs = null;
Statement stmt = null;
Connection conn = null;
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
conn = DriverManager.getConnection("jdbc:oracle:thin:@192.168.0.1:1521:yuewei", "scott", "tiger");
stmt = conn.createStatement();
rs = stmt.executeQuery("select * from dept");
while(rs.next()) {
System.out.println(rs.getString("deptno"));
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
if(rs != null) {
rs.close();
rs = null;
}
if(stmt != null) {
stmt.close();
stmt = null;
}
if(conn != null) {
conn.close();
conn = null;
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
這兩個類都實現了List接口(List接口繼承了Collection接口),他們都是有序集合,即存儲在這兩個集合中的元素的位置都是有順序的,至關於一種動態的數組,咱們之後能夠按位置索引號取出某個元素,,而且其中的數據是容許重複的,這是HashSet之類的集合的最大不一樣處,HashSet之類的集合不能夠按索引號去檢索其中的元素,也不容許有重複的元素(原本題目問的與hashset沒有任何關係,但爲了說清楚ArrayList與Vector的功能,咱們使用對比方式,更有利於說明問題)。
接着才說ArrayList與Vector的區別,這主要包括兩個方面:.
(1)同步性:
Vector是線程安全的,也就是說是它的方法之間是線程同步的,而ArrayList是線程序不安全的,它的方法之間是線程不一樣步的。若是隻有一個線程會訪問到集合,那最好是使用ArrayList,由於它不考慮線程安全,效率會高些;若是有多個線程會訪問到集合,那最好是使用Vector,由於不須要咱們本身再去考慮和編寫線程安全的代碼。
備註:對於Vector&ArrayList、Hashtable&HashMap,要記住線程安全的問題,記住Vector與Hashtable是舊的,是java一誕生就提供了的,它們是線程安全的,ArrayList與HashMap是java2時才提供的,它們是線程不安全的。因此,咱們講課時先講老的。
(2)數據增加:
ArrayList與Vector都有一個初始的容量大小,當存儲進它們裏面的元素的個數超過了容量時,就須要增長ArrayList與Vector的存儲空間,每次要增長存儲空間時,不是隻增長一個存儲單元,而是增長多個存儲單元,每次增長的存儲單元的個數在內存空間利用與程序效率之間要取得必定的平衡。Vector默認增加爲原來兩倍,而ArrayList的增加策略在文檔中沒有明確規定(從源代碼看到的是增加爲原來的1.5倍)。ArrayList與Vector均可以設置初始的空間大小,Vector還能夠設置增加的空間大小,而ArrayList沒有提供設置增加空間的方法。
總結:即Vector增加原來的一倍,ArrayList增長原來的0.5倍。
1)List和Set是Collection的子接口,map不是。
2)List的底層是數組的方式實現,Set是散列表的方式實現,map是鍵值對的方式。
3)list是有序可重複的,Set是無序不可重複的,map是有序,key不重複,value可重複
4)list和Set可直接使用itertator來進行遍歷,map只能經過先遍歷Key在遍歷value.
Collection是集合類的上級接口,繼承與他的接口主要有Set 和List.
Collections是針對集合類的一個幫助類,他提供一系列靜態方法實現對各類集合的搜索、排序、線程安全化等操做。
Set裏的元素是不能重複的,元素重複與否是使用equals()方法進行判斷的。
equals()和==方法決定引用值是否指向同一對象equals()在類中被覆蓋,爲的是當兩個分離的對象的內容和類型相配的話,返回真值。
1)繼承不一樣
public class Hashtable extends Dictionary implements Map
public class HashMap extends AbstractMap implements Map
2)Hashtable 中的方法是同步的,而HashMap中的方法在缺省狀況下是非同步的。在多線程併發的環境下,能夠直接使用Hashtable,可是要使用HashMap的話就要本身增長同步處理了。
3)Hashtable中,key和value都不容許出現null值,在HashMap中,null能夠做爲鍵,這樣的鍵只有一個;能夠有一個或多個鍵所對應的值爲null。當get()方法返回null值時,便可以表示 HashMap中沒有該鍵,也能夠表示該鍵所對應的值爲null。所以,在HashMap中不能由get()方法來判斷HashMap中是否存在某個鍵, 而應該用containsKey()方法來判斷。
4)兩個遍歷方式的內部實現上不一樣。
Hashtable、HashMap都使用了 Iterator。而因爲歷史緣由,Hashtable還使用了Enumeration的方式 。
5)哈希值的使用不一樣,HashTable直接使用對象的hashCode。而HashMap從新計算hash值。
6)Hashtable和HashMap它們兩個內部實現方式的數組的初始大小和擴容的方式。HashTable中hash數組默認大小是11,增長的方式是 old*2+1。HashMap中hash數組的默認大小是16,並且必定是2的指數
List:是列表,有下標值,存儲元素能夠重複,遍歷元素是有序的。
Set:是散列集,無下標值,存儲元素不可重複,遍歷元素時無序的。
Map:是以鍵值對存儲,一個key一個value,key不能夠重複,value能夠重複。
數組:指定類型,固定長度,元素存儲地址是連續的。
樹:元素以樹形結構存儲,只有一個根節點。
棧:元素是先進後出,後進先出。
向量:動態數組,能夠存儲任何類型元素,動態長度,元素存儲地址是連續的。
隊列:元素存儲是排列有序的,必定保證先進的先出,後進的後出。
相同點:
ArrayList和Linklist都是接口List的實現類,裏面的數據都是有序可重複的。
區別:
ArrayList: 採用的是數組形式保存對象的,訪問速度更快,而Linklist的插入和刪除元素的速度更快
1) 下標遍歷
2) Iterator遍歷
3) Foreach遍歷(最快)
先調用
keySet
()
方法獲取全部的key,在遍歷key獲取全部的元素
Map調用
keySet
()
方法獲取全部的key值,是一個Set集合
Map調用values()方法獲取全部的value值,是一個List集合
Class<?> demo1=Class.forName("Reflect.Demo"); //使用Class類
Class<?> demo2=new Demo().getClass(); //經過對象
Class<?> demo3=Demo.class; //經過類
獲取全部方法:
Class<?> demo = Class.forName("Reflect.Demo");
Method[] methods = Demo. getDeclaredMethods();
獲取全部屬性:
Class<?> demo = Class.forName("Reflect.Demo");
Field[] fields = demo .getDeclaredFields();
1)struts2是一個MVC框架,MVC是一種開發模式,把業務邏輯代碼與視圖代碼分離,經過控制器鏈接業務邏輯與視圖。MVC將應用程序分紅了視圖、模型、控制器三部分,使代碼結構層次清晰、下降耦合度、代碼重用性高。
2)結合Struts2處理請求的工做流程加以說明:
客戶端發送一個請求到服務器,tomcat會接收這個請求, tomcat會讀取項目中的web.xml中的配置,判斷請求是否符合Struts2過濾器StrutsPrepareAndExecuteFilter過濾的路徑,若是符合會把這個請求交給Struts2處理,StrutsPrepareAndExecuteFilter會分析請求路徑,根據Struts.xml中的配置,請求路徑匹配package標籤的namespace屬性加上action標籤的name屬性,跳轉到對應的action類,默認執行execute方法,若是使用動態方法調用,會執行action類中的對應方法,方法執行完成後會返回一個字符串,這個字符串對應Struts.xml中action標籤下的result標籤name屬性根據result標籤的配置跳轉到對應的jsp頁面,在jsp頁面中呈現數據,返回給客戶端。
3)結合Struts2優勢說明:
a、實現MVC模式,結構清晰,使開發者只關注業務邏輯的實現.
b、有豐富的tag能夠用 ,Struts的標記庫(Taglib),如能靈活動用,則能大大提升開發效率
c、頁面導航使系統的脈絡更加清晰。經過一個配置文件,便可把握整個系統各部分之間的聯繫,這對於後期的維護有着莫大的好處。尤爲是當另外一批開發者接手這個項目時,這種優點體現得更加明顯。
d、提供Exception處理機制 .
e、數據庫連接池管理
f、支持I18N
1)hibernate是ORM框架,ORM是對象關係映射,類—>表,屬性—>表中的列,對象—>表中的每一條數據,是爲了解決面向對象與關係數據庫之間互不匹配現象的技術。使咱們編程的思想更面向對象了,不用去考慮關係型數據庫。
2)hibernate工做流程是:configuration類讀取並解析hibernate.cfg.xml配置文件,讀取解析映射信息,建立sessionFactory,打開session,建立事務,持久化操做,關閉session,整個應用中止關閉sessionFactory。
3)結合hibernate優勢說明:
a、程序更加面向對象,提升開發效率
b、提升了生產率,不用寫SQL語句
c、hibernate使用的是hql,支持方言配置,方便數據庫移植
d、對jdbc代碼進行封裝,編程更簡便了
e、hibernate是個輕量級框架,對代碼無侵入性
1)Sping是一個輕量級框架,設計原則是非侵入性的。Sping核心是IOC容器,IOC是一種編程思想,是一種架構藝術,是用來管理控制對象的生命週期和對象之間的關係,經過配置文件進行注入,很好的實現了對象與對象之間解耦。
2)IOC工做原理: IOC實現了工廠模式,經過讀取application.xml配置文件中的<bean>標籤的類,注入到IOC容器中,經過構造或set方法注入,產生BeanFactory,BeanFactory經過getBean方法獲取對象。
3)Spring還提供了另一種重要編程思想AOP,AOP稱爲面向切面編程,能夠動態的將主線業務邏輯代碼與實現功能代碼分離,爲了更清晰的邏輯,可讓你的業務邏輯去關注本身自己的業務,而不去想一些其餘的事情,將日誌記錄,性能統計,安全控制,事務處理,異常處理等代碼從業務邏輯代碼中劃分出來,經過對這些行爲的分離,咱們但願能夠將它們獨立到非指導業務邏輯的方法中,進而改變這些行爲的時候不影響業務邏輯的代碼。
4)Spring提供了不少第三方框架的整合,如:hibernate、struts、mybatis、web service等,使用IOC管理全部的Java bean,這樣可讓框架與框架之間偶爾度下降,方便項目的管理,提升開發效率。
優勢:
1)實現MVC模式,結構清晰,使開發者只關注業務邏輯的實現.
2)有豐富的tag能夠用 ,Struts的標記庫(Taglib),如能靈活動用,則能大大提升開發效率
3)頁面導航使系統的脈絡更加清晰。經過一個配置文件,便可把握整個系統各部分之間的聯繫,這對於後期的維護有着莫大的好處。尤爲是當另外一批開發者接手這個項目時,這種優點體現得更加明顯。
4)提供Exception處理機制 .
5)數據庫連接池管理
6)支持I18N
缺點
1)轉到展現層時,須要配置forward,每一次轉到展現層,相信大多數都是直接轉到jsp,而涉及到轉向,須要配置forward,若是有十個展現層的jsp,須要配置十次struts,並且還不包括有時候目錄、文件變動,須要從新修改forward,注意,每次修改配置以後,要求從新部署整個項目,而tomcate這樣的服務器,還必須從新啓動服務器,若是業務變動複雜頻繁的系統,這樣的操做簡單不可想象。如今就是這樣,幾十上百我的同時在線使用咱們的系統,你們能夠想象一下,個人煩惱有多大。
2)Struts 的Action必需是thread-safe方式,它僅僅容許一個實例去處理全部的請求。因此action用到的全部的資源都必需統一同步,這個就引發了線程安全的問題。
3)測試不方便. Struts的每一個Action都同Web層耦合在一塊兒,這樣它的測試依賴於Web容器,單元測試也很難實現。不過有一個Junit的擴展工具Struts TestCase能夠實現它的單元測試。
4)類型的轉換. Struts的FormBean把全部的數據都做爲String類型,它能夠使用工具Commons-Beanutils進行類型轉化。但它的轉化都是在Class級別,並且轉化的類型是不可配置的。類型轉化時的錯誤信息返回給用戶也是很是困難的。
5)對Servlet的依賴性過強. Struts處理Action時必須要依賴ServletRequest 和ServletResponse,全部它擺脫不了Servlet容器。
6)前端表達式語言方面.Struts集成了JSTL,因此它主要使用JSTL的表達式語言來獲取數據。但是JSTL的表達式語言在Collection和索引屬性方面處理顯得很弱。
7)對Action執行的控制困難. Struts建立一個Action,若是想控制它的執行順序將會很是困難。甚至你要從新去寫Servlet來實現你的這個功能需求。
8)對Action 執行前和後的處理. Struts處理Action的時候是基於class的hierarchies,很難在action處理前和後進行操做。
9)對事件支持不夠. 在struts中,實際是一個表單Form對應一個Action類(或DispatchAction),換一句話說:在Struts中實際是一個表單只能對應一個事件,struts這種事件方式稱爲application event,application event和component event相比是一種粗粒度的事件。
1)都是MVC的WEB框架,
2) struts1的老牌框架,應用很普遍,有很好的羣衆基礎,使用它開發風險很小,成本更低!struts2雖然基於這個框架,可是應用羣衆並多,相對不成熟,未知的風險和變化不少,開發人員相對很差招,使用它開發項目的風險係數更大,用人成本更高!
3)struts2畢竟是站在前輩的基礎設計出來,它會改善和完善struts1中的一些缺陷,struts1中一些懸而未決問題在struts2獲得瞭解決。
4)struts1的前端控制器是一個Servlet,名稱爲ActionServlet,struts2的前端控制器是一個filter,在struts2.0中叫FilterDispatcher,在struts2.1中叫StrutsPrepareAndExecuteFilter。
5)struts1的action須要繼承Action類,struts2的action能夠不繼承任何類;struts1對同一個路徑的全部請求共享一個Action實例,struts2對同一個路徑的每一個請求分別使用一個獨立Action實例對象,全部對於struts2的Action不用考慮線程安全問題。
6)在struts1中使用formbean封裝請求參數,在struts2中直接使用action的屬性來封裝請求參數。
7)struts1中的多個業務方法放在一個Action中時(即繼承DispatchAction時),要麼都校驗,要麼都不校驗;對於struts2,能夠指定只對某個方法進行校驗,當一個Action繼承了ActionSupport且在這個類中只編寫了validateXxx()方法,那麼則只對Xxx()方法進行校驗。
8)一個請求來了的執行流程進行分析,struts2是自動支持分模塊開發,並能夠不一樣模塊設置不一樣的url前綴,這是經過package的namespace來實現的;struts2是支持多種類型的視圖;struts2的視圖地址能夠是動態的,即視圖的名稱是支持變量方式的,舉例,論壇發帖失敗後回來還要傳遞boardid。視圖內容顯示方面:它的標籤用ognl,要el強大不少,在國際化方面支持分模塊管理,兩個模塊用到一樣的key,對應不一樣的消息。
9)與Struts1不一樣,Struts2對用戶的每一次請求都會建立一個Action,因此Struts2中的Action是線程安全的。
10)給我印象最深入的是:struts配置文件中的redirect視圖的url不能接受參數,而struts2配置文件中的redirect視圖能夠接受參數。
1)FilterDispatcher,struts2的核心組件,整個struts2的調度中心,它對請求進行過濾並決定struts2是否出來該請求。
2)Strtus.xml:struts2的應用配置文件,它負責配置系統中用到的action
3)Action:strtus2的動做執行單元實際處理用戶的請求,封裝業務所需的數據
4)Result:action運行後要轉向下一個資源,能夠是視圖也能夠說其餘的action
5)Struts標籤:用於頁面上遍歷後臺傳過來的數據
1)客戶端發送一個請求到服務器,tomcat會接收這個請求
2)tomcat會讀取項目中的web.xml中的配置
3)判斷請求是否符合Struts2過濾器StrutsPrepareAndExecuteFilter過濾的路徑
4)若是符合會把這個請求交給Struts2處理
5)StrutsPrepareAndExecuteFilter會分析請求路徑,根據Struts.xml中的配置,請求路徑匹配package標籤的namespace屬性加上action標籤的name屬性,跳轉到對應的action類
6)默認執行execute方法,若是使用動態方法調用,會執行action類中的對應方法,方法執行完成後會返回一個字符串
7)這個字符串對應Struts.xml中action標籤下的result標籤name屬性
8)根據result標籤的配置跳轉到對應的jsp頁面,在jsp頁面中呈現數據,返回給客戶端
1)開源
2)mvc框架
3)純pojo的action
4)更好的標籤特性
5)易測性
6)易擴展性
1)openSession 從字面上能夠看得出來,是打開一個新的session對象,並且每次使用都是打開一個新的session,假如連續使用屢次,則得到的session不是同一個對象,而且使用完須要調用close方法關閉session。
2)getCurrentSession ,從字面上能夠看得出來,是獲取當前上下文一個session對象,當第一次使用此方法時,會自動產生一個session對象,而且連續使用屢次時,獲得的session都是同一個對象,這就是與openSession的區別之一,簡單而言,getCurrentSession 就是:若是有已經使用的,用舊的,若是沒有,建新的。
注意 :在實際開發中,每每使用getCurrentSession多,由於通常是處理同一個事務(便是使用一個數據庫的狀況),因此在通常狀況下比較少使用openSession或者說openSession是比較老舊的一套接口了;
對於getCurrentSession 來講,有如下一些特色:
1.用途,界定事務邊界
2.事務提交會自動close,不須要像openSession同樣本身調用close方法關閉session
3.上下文配置(即在hibernate.cfg.xml)中,須要配置:
<property name="current_session_context_class">thread</property>
攔截器是對調用的action起做用,它提供類一種機制能夠使開發者能夠定義在一個action執行的先後執行的代碼。攔截器只能攔截action,說白了攔截器其實就是一個action的功能塊。攔截器能夠抽象出一部分代碼能夠用來完善原來的action。同時能夠減輕代碼冗餘提升重用率。
過濾器是攔截用戶請求,範圍比攔截器大。
Dispatcher:struts2默認的結果類型,把控制權轉發給應用程序裏的某個資源,不能把控制權轉發給一個外部資源,若須要啊控制權重定向到一個外部資源,應該使用redirect結果類型。
Redirect 把響應重定向到另外一個資源
RedirectAction 把響應重定向到另外一個Action
Freemarcker、velocity、chain、httpherder、xslt、plainText、stream、json.
表對應類
記錄對應對象
表的字段對應類的屬性
1)瞬時狀態(臨時狀態):當new 對象時候,處於瞬時狀態(若是程序運行完了,該對象會被垃圾回收)。
2)持久狀態 :跟session有關,就是持久狀態,持久狀態的對象,任何的修改,都會影響到數據庫中與之對應的數據。
3)託管狀態(遊離狀態):當session不在管理對象的時候,脫離了 session 的管理,處於託管狀態的對象,修改屬性,對數據庫數據沒有任何影響。
企業開發中,使用saveOrUpdate(obj): 來替代save(obj)或update(obj)方法
避免由於狀態的改變,致使方法出錯, saveOrUpdate(obj)
能夠根據obj的狀態,來選擇是save()仍是update()
若是數據庫中,沒有userId的對象,若是經過get方法加載,則返回的是一個Null;若是經過Load則返回一個代理對象,若是後面代碼調用user對象的某個屬性,會拋出objectNotFoundException
Load支持延遲加載,get不支持。
1)configuration類讀取並解析hibernate.cfg.xml配置文件
2)讀取解析映射信息,建立sessionFactory
3)打開session
4)建立事務
5)持久化操做
6)關閉session
7)整個應用中止,關閉sessionFactory
優勢:
1)對jdbc訪問數據庫的代碼作了封裝,大大簡化了數據訪問層繁瑣的重複性代碼。
2)Hibernate是一個基於JDBC的主流持久性框架,是一個優秀的ORM實現,他很大程度的簡化DAO的編碼工做,程序更加面向對象,提升開發效率。
3)程序更加面向對象,提升開發效率
4)提升了生產率,不用寫SQL語句
5)hibernate使用的是hql,支持方言配置,方便數據庫移植
6)hibernate是個輕量級框架,對代碼無侵入性
缺點:
1)效率比JDBC略差
2)不適合批量操做
3)對錶的操做不夠靈活
hibernate中存在一些查詢方法,在查詢的時候並無馬上訪問數據庫查詢數據,而是返回了一個空對象,這個對象並非null而是通過new的對象,但對象中除了ID這種屬性外其餘屬性都是null,當程序使用對象時hibernate纔會真正的發送語句去查詢數據庫,將返回的數據填充到對象的屬性值。這種將推遲查詢隊形機制稱爲延遲加載。
爲何要用延遲加載:
1)推遲的時間內因爲沒有數據加載能夠節約內存空間,提升內存的使用率。
2)若是對象查詢出來並無使用,那麼延遲加載的對象根本沒有訪問數據庫,能夠減小數據可得訪問次數。
如何使用延遲加載
1)在hibernate裏面有一些方法自動支持延遲加載,只要調用就能夠使用。
2)具備延遲加載的方法以下:
session.load();
query.iterate();
關聯映射屬性加載,屬性名是lazy,若是查詢不存在延遲加載就會拋異常
使用雙向一對多關聯,不使用單向一對多
靈活使用單向一對多
不使用一對一,用多對一取代
配置對象緩存,不適用集合緩存
一對多集合使用bag,多對多使用set
繼承類使用顯式多態
表字段要少,表關聯不要怕多,有二級緩存。
ORM是對象關係映射,類—>表,屬性—>表中的列,對象—>表中的每一條數據,
是爲了解決面向對象與關係數據庫之間互不匹配現象的技術。
優勢:使咱們編程的思想更面向對象了,不用去考慮關係型數據庫
1)sequence,通知Hibernate框架,主鍵的值採用指定序列生成,而後插入數據庫,主要用於
Oracle,DB2,不用程序員參與
<generator class="sequence">
<param name="sequence">foo_seq</param>// 必須加上
</generator>
2)identity,通知hibernate框架,主鍵值採用數據庫自動增加機制,每次進行save()操做,hibernate都會根據(數據庫)自增的方式,生成一個id值,不用程序員參與,主要用於
mySQL , SQLServer
<generator class="identity"></generator>
3)uuid(西方經常使用),hibernate 每次進行save()操做,都會隨機生成一個32的不重複的字符串,不用程序員去參與維護,PO類的Id屬性必須爲String
4)native 根據dialect(方言)不一樣,來自動的選擇identity或sequence智能選擇。是企業中經常使用的
5)assigned 不推薦使用,程序言要本身維護主鍵的Id值,當數據量很大時候很難維護
1) cascade操做
all:全部狀況下都進行級練操做 ,save-update和delete
save-update: 在進行save()/update()/saveOrUpdate時候進行級練操做
delete:在進行delete時候進行級練操做
all-delete-orphan :適合集合中刪除,在返回的集合中執行remove()操做
none:在任何狀況下都不進行級練操做
2) inverse屬性的做用
是否放棄維護關聯關係 true放棄 false不放棄
Configuration接口:配置Hibernate,根據其啓動hibernate,建立SessionFactory對象;
SessionFactory接口:初始化Hibernate,充當數據存儲源的代理,建立session對象,sessionFactory是線程安全的,意味着它的同一個實例能夠被應用的多個線程共享,是重量級、二級緩存;
Session接口:負責保存、更新、刪除、加載和查詢對象,是線程不安全的,避免多個線程共享同一個session,是輕量級、一級緩存;
Transaction接口:管理事務;
Query和Criteria接口:執行數據庫的查詢。
輕量級是指它的建立和銷燬不須要消耗太多的資源,意味着能夠在程序中常常建立和銷燬session的對象;重量級意味不能隨意的建立和銷燬它的實例,會佔用不少的資源。
首先想說說IoC(Inversion of Control,控制倒轉)。這是spring的核心,貫穿始終。所謂IoC,對於spring框架來講,就是由spring來負責控制對象的生命週期和對象間的關係。這是什麼意思呢,舉個簡單的例子,咱們是如何找女友的?常見的狀況是,咱們處處去看哪裏有長得漂亮身材又好的mm,而後打聽她們的興趣愛好、qq號、電話號、ip號、iq號………,想辦法認識她們,投其所好送其所要,而後嘿嘿……這個過程是複雜深奧的,咱們必須本身設計和麪對每一個環節。傳統的程序開發也是如此,在一個對象中,若是要使用另外的對象,就必須獲得它(本身new一個,或者從JNDI中查詢一個),使用完以後還要將對象銷燬(好比Connection等),對象始終會和其餘的接口或類藕合起來。
那麼IoC是如何作的呢?有點像經過婚介找女友,在我和女友之間引入了一個第三者:婚姻介紹所。婚介管理了不少男男女女的資料,我能夠向婚介提出一個列表,告訴它我想找個什麼樣的女友,好比長得像李嘉欣,身材像林熙雷,唱歌像周杰倫,速度像卡洛斯,技術像齊達內之類的,而後婚介就會按照咱們的要求,提供一個mm,咱們只須要去和她談戀愛、結婚就好了。簡單明瞭,若是婚介給咱們的人選不符合要求,咱們就會拋出異常。整個過程再也不由我本身控制,而是有婚介這樣一個相似容器的機構來控制。Spring所倡導的開發方式就是如此,全部的類都會在spring容器中登記,告訴spring你是個什麼東西,你須要什麼東西,而後spring會在系統運行到適當的時候,把你要的東西主動給你,同時也把你交給其餘須要你的東西。全部的類的建立、銷燬都由 spring來控制,也就是說控制對象生存週期的再也不是引用它的對象,而是spring。對於某個具體的對象而言,之前是它控制其餘對象,如今是全部對象都被spring控制,因此這叫控制反轉。若是你還不明白的話,我決定放棄。
IoC的一個重點是在系統運行中,動態的向某個對象提供它所須要的其餘對象。這一點是經過DI(Dependency Injection,依賴注入)來實現的。好比對象A須要操做數據庫,之前咱們老是要在A中本身編寫代碼來得到一個Connection對象,有了 spring咱們就只須要告訴spring,A中須要一個Connection,至於這個Connection怎麼構造,什麼時候構造,A不須要知道。在系統運行時,spring會在適當的時候製造一個Connection,而後像打針同樣,注射到A當中,這樣就完成了對各個對象之間關係的控制。A須要依賴 Connection才能正常運行,而這個Connection是由spring注入到A中的,依賴注入的名字就這麼來的。那麼DI是如何實現的呢? Java 1.3以後一個重要特徵是反射(reflection),它容許程序在運行的時候動態的生成對象、執行對象的方法、改變對象的屬性,spring就是經過反射來實現注入的。
總結:IOC是用來管理控制對象的生命週期和對象之間的關係,經過配置文件進行注入,很好的實現了對象與對象之間解耦。
IOC工做原理:
IOC實現了工廠模式,經過讀取application.xml配置文件中的<bean>標籤的類,
注入到IOC容器中,經過構造或set方法注入,產生BeanFactory,
BeanFactory經過getBean方法獲取對象。
Aspect Oriented Programming (面向方面編程)
OOP是面向對象編程,AOP是在OOP基礎之上一種更高級的設計思想.
OOP和AOP之間也存在一些區別,OOP側重於對象的提取和封裝.
AOP側重於方面組件,方面組件能夠理解成封裝了通用功能的組件,
方面組件能夠經過配置方式靈活的切入到某一批目標對象方法上.
aop是面向切面編程,能夠動態的將主線業務邏輯代碼與實現功能代碼分離,沒有侵入性。爲了更清晰的邏輯,可讓你的業務邏輯去關注本身自己的業務,而不去想一些其餘的事情,將日誌記錄,性能統計,安全控制,事務處理,異常處理等代碼從業務邏輯代碼中劃分出來,經過對這些行爲的分離,咱們但願能夠將它們獨立到非指導業務邏輯的方法中,進而改變這些行爲的時候不影響業務邏輯的代碼。
通知決定了方面組件功能在目標對象方法上執行的時機.
Spring框架提供瞭如下5中類型通知.
1).前置通知<aop:before>
方面功能在目標方法以前調用.
2)後置通知<aop:afterReturning>
方面功能在目標方法以後調用.(若是目標方法拋出異常則不會執行方面功能)
3)最終通知<aop:after>
方面功能在目標方法以後調用.(目標方法有無異常都會執行方面功能)
4)環繞通知<aop:around>
方面功能在目標方法以前和以後調用.
5)異常通知<aop:afterThrowing>
方面功能在目標方法拋出異常以後調用.
MVC是一種開發模式,把業務邏輯代碼與視圖代碼分離,經過控制器鏈接業務邏輯與視圖。
MVC將一個應用程序分爲三個部分:
Model:業務邏輯的處理。
View:表明和用戶交互的界面。
Controller:控制器,鏈接模型層與視圖層
優勢:
1)代碼結構層次清晰
2)就是低耦合
3)重用性高
缺點:
一個應用程序分紅了三個部分開發,增長開發工做量。
主鍵查找:session.get()或load()
hql查詢:session.createQuery(「hql」)
sql查詢:session.createSQLQuery(「sql」)
criteria查詢(QBC): session.createCriteria()
目前,scope的取值有5種。
在Spring 2.0以前,有singleton和prototype兩種
在Spring 2.0以後,爲支持web應用的ApplicationContext,推出另外三種:request,session和global session類型
singleton:在IOC容器中只存在一個實例
prototype:在IOC容器中只存在多個實例
request:使用在web應用中,至關於Servlet中的Request
session:使用在web應用中,至關於Servlet中的Session
global session:使用在web應用中,至關於Servlet中的application
Struts2:用於處理請求,調用業務邏輯
Hibernate:用於操做數據庫,作持久化操做
Spring:用於管理對象,處理對象與對象之間的關係
MVC是一種開發模式,模型、視圖、控制,與SSH框架的做用是兩個東西,不能相互對應。
Spring四種依賴注入方式,經常使用一、2種,
1)Set方法注入
2)構造器注入
3)靜態工廠方法注入
4)實例工廠方法注入
有DOM,SAX,STAX等
DOM:處理大型文件時其性能降低的很是厲害。這個問題是由DOM的樹結構所形成的,這種結構佔用的內存較多,並且DOM必須在解析文件以前把整個文檔裝入內存,適合對XML的隨機訪問。
SAX:不現於DOM,SAX是事件驅動型的XML解析方式。它順序讀取XML文件,不須要一次所有裝載整個文件。當遇到像文件開頭,文檔結束,或者標籤開頭與標籤結束時,它會觸發一個事件,用戶經過在其回調事件中寫入處理代碼來處理XML文件,適合對XML的順序訪問 。
STAX:Streaming API for XML (StAX)
用到了數據存貯,信息配置兩方面。在作數據交換平臺時,將不能數據源的數據組裝成XML文件,而後將XML文件壓縮打包加密後經過網絡傳送給接收者,接收解密與解壓縮後再同XML文件中還原相關信息進行處理。在作軟件配置時,利用XML能夠很方便的進行,軟件的各類配置參數都存貯在XML文件中。
答:用SAX方式解析XML,XML文件以下:
<?xml version=1.0 encoding=gb2312?>
<person>
<name>王小明</name>
<college>信息學院</college>
<telephone>6258113</telephone>
<notes>男,1955年生,博士,95年調入海南大學</notes>
</person>
事件回調類SAXHandler.java
import java.io.*;
import java.util.Hashtable;
import org.xml.sax.*;
public class SAXHandler extends HandlerBase
{
private Hashtable table = new Hashtable();
private String currentElement = null;
private String currentValue = null;
public void setTable(Hashtable table)
{
this.table = table;
}
public Hashtable getTable()
{
return table;
}
public void startElement(String tag, AttributeList attrs)
throws SAXException
{
currentElement = tag;
}
public void characters(char[] ch, int start, int length)
throws SAXException
{
currentValue = new String(ch, start, length);
}
public void endElement(String name) throws SAXException
{
if (currentElement.equals(name))
table.put(currentElement, currentValue);
}
}
JSP內容顯示源碼,SaxXml.jsp:
<HTML>
<HEAD>
<TITLE>剖析XML文件people.xml</TITLE>
</HEAD>
<BODY>
<%@ page errorPage=ErrPage.jsp
contentType=text/html;charset=GB2312 %>
<%@ page import=java.io.* %>
<%@ page import=java.util.Hashtable %>
<%@ page import=org.w3c.dom.* %>
<%@ page import=org.xml.sax.* %>
<%@ page import=javax.xml.parsers.SAXParserFactory %>
<%@ page import=javax.xml.parsers.SAXParser %>
<%@ page import=SAXHandler %>
<%
File file = new File(c:\people.xml);
FileReader reader = new FileReader(file);
Parser parser;
SAXParserFactory spf = SAXParserFactory.newInstance();
SAXParser sp = spf.newSAXParser();
SAXHandler handler = new SAXHandler();
sp.parse(new InputSource(reader), handler);
Hashtable hashTable = handler.getTable();
out.println(<TABLE BORDER=2><CAPTION>教師信息表</CAPTION>);
out.println(<TR><TD>姓名</TD> + <TD> +
(String)hashTable.get(new String(name)) + </TD></TR>);
out.println(<TR><TD>學院</TD> + <TD> +
(String)hashTable.get(new String(college))+</TD></TR>);
out.println(<TR><TD>電話</TD> + <TD> +
(String)hashTable.get(new String(telephone)) + </TD></TR>);
out.println(<TR><TD>備註</TD> + <TD> +
(String)hashTable.get(new String(notes)) + </TD></TR>);
out.println(</TABLE>);
%>
</BODY>
</HTML>
1)兩種形式 dtd schema。
2)本質區別:schema自己是xml的,能夠被XML解析器解析(這也是從DTD上發展schema的根本目的),
1)設計上的區別:XML用來存儲數據,重點在於數據自己,HTML用來定義數據,重在數據的顯示模式。
2)XML可擴展性強,由於他自己就是可拓展性標記語言,課建立個性化的標記語言,提供更多數據操做。
3)XML語法比HTML嚴格。
4)起始標籤和結束標籤要匹配
5)嵌套標籤不能相互嵌套
6)區分大小寫
7)XML屬性必須放在引號中,HTML無關緊要。
8)XML必須有相應值,但HTML能夠有不帶屬性的屬性名。
1)XML是一個標準的技術,在處理上能夠更加的統一
2)從對配置文件的後期處理上,對XML的操做的API更多,更方便,而文本文件不是特別方便。
3)XML能夠有定義語法的DTD文件,這樣兌取配置信息的時候,能夠先根據DTD檢查當前的XML配置文件是否語法正確,而文本文件沒有辦法檢查語法。
4)XML能夠很是方便的轉換成其餘格式的文件,而文本不能夠。
5)XML利用xslt能夠很是方便的轉換成其餘格式的文件,文本文件很難作到。
6)XML能夠很是方便的搜索其中的一些配置信息,試想若是配置文件很大,優勢仍是很明顯的,而文本文件則不太方便。
7)XML能夠攜帶不少、更豐富的配置信息,文本文件不容易作到
請寫出你所知道的設計模式?
設計模式主要分三個類型:建立型、結構型和行爲型。
其中建立型有:
1、Singleton,單例模式:保證一個類只有一個實例,並提供一個訪問它的全局訪問點
2、Abstract Factory,抽象工廠:提供一個建立一系列相關或相互依賴對象的接口,而無須指定它們的具體類。
3、Factory Method,工廠方法:定義一個用於建立對象的接口,讓子類決定實例化哪個類,Factory Method使一個類的實例化延遲到了子類。
4、Builder,建造模式:將一個複雜對象的構建與他的表示相分離,使得一樣的構建過程能夠建立不一樣的表示。
5、Prototype,原型模式:用原型實例指定建立對象的種類,而且經過拷貝這些原型來建立新的對象。
行爲型有:
6、Iterator,迭代器模式:提供一個方法順序訪問一個聚合對象的各個元素,而又不須要暴露該對象的內部表示。
7、Observer,觀察者模式:定義對象間一對多的依賴關係,當一個對象的狀態發生改變時,全部依賴於它的對象都獲得通知自動更新。
8、Template Method,模板方法:定義一個操做中的算法的骨架,而將一些步驟延遲到子類中,TemplateMethod使得子類能夠不改變一個算法的結構便可以重定義該算法得某些特定步驟。
9、Command,命令模式:將一個請求封裝爲一個對象,從而使你能夠用不一樣的請求對客戶進行參數化,對請求排隊和記錄請求日誌,以及支持可撤銷的操做。
10、State,狀態模式:容許對象在其內部狀態改變時改變他的行爲。對象看起來彷佛改變了他的類。
11、Strategy,策略模式:定義一系列的算法,把他們一個個封裝起來,並使他們能夠互相替換,本模式使得算法能夠獨立於使用它們的客戶。
12、China of Responsibility,職責鏈模式:使多個對象都有機會處理請求,從而避免請求的送發者和接收者之間的耦合關係
十3、Mediator,中介者模式:用一箇中介對象封裝一些列的對象交互。
十4、Visitor,訪問者模式:表示一個做用於某對象結構中的各元素的操做,它使你能夠在不改變各元素類的前提下定義做用於這個元素的新操做。
十5、Interpreter,解釋器模式:給定一個語言,定義他的文法的一個表示,並定義一個解釋器,這個解釋器使用該表示來解釋語言中的句子。
十6、Memento,備忘錄模式:在不破壞對象的前提下,捕獲一個對象的內部狀態,並在該對象以外保存這個狀態。
結構型有:
十7、Composite,組合模式:將對象組合成樹形結構以表示部分總體的關係,Composite使得用戶對單個對象和組合對象的使用具備一致性。
十8、Facade,外觀模式:爲子系統中的一組接口提供一致的界面,fa?ade提供了一高層接口,這個接口使得子系統更容易使用。
十9、Proxy,代理模式:爲其餘對象提供一種代理以控制對這個對象的訪問
二10、Adapter,適配器模式:將一類的接口轉換成客戶但願的另一個接口,Adapter模式使得本來因爲接口不兼容而不能一塊兒工做那些類能夠一塊兒工做。
二11、Decrator,裝飾模式:動態地給一個對象增長一些額外的職責,就增長的功能來講,Decorator模式相比生成子類更加靈活。
二12、Bridge,橋模式:將抽象部分與它的實現部分相分離,使他們能夠獨立的變化。
二十3、Flyweight,享元模式
1、說明生活中遇到的二叉樹,用java實現二叉樹
這是組合設計模式。
我有不少個(假設10萬個)數據要保存起來,之後還須要從保存的這些數據中檢索是否存在某個數據,(我想說出二叉樹的好處,該怎麼說呢?那就是說別人的缺點),假如存在數組中,那麼,碰巧要找的數字位於99999那個地方,那查找的速度將很慢,由於要從第1個依次日後取,取出來後進行比較。平衡二叉樹(構建平衡二叉樹須要先排序,咱們這裏就不做考慮了)能夠很好地解決這個問題,但二叉樹的遍歷(前序,中序,後序)效率要比數組低不少,原理以下圖:
代碼以下:
package com.huawei.interview;
public class Node {
public int value;
public Node left;
public Node right;
public void store(int value)
{
if(value<this.value)
{
if(left == null)
{
left = new Node();
left.value=value;
}
else
{
left.store(value);
}
}
else if(value>this.value)
{
if(right == null)
{
right = new Node();
right.value=value;
}
else
{
right.store(value);
}
}
}
public boolean find(int value)
{
System.out.println("happen " + this.value);
if(value == this.value)
{
return true;
}
else if(value>this.value)
{
if(right == null) return false;
return right.find(value);
}else
{
if(left == null) return false;
return left.find(value);
}
}
public void preList()
{
System.out.print(this.value + ",");
if(left!=null) left.preList();
if(right!=null) right.preList();
}
public void middleList()
{
if(left!=null) left.preList();
System.out.print(this.value + ",");
if(right!=null) right.preList();
}
public void afterList()
{
if(left!=null) left.preList();
if(right!=null) right.preList();
System.out.print(this.value + ",");
}
public static void main(String [] args)
{
int [] data = new int[20];
for(int i=0;i<data.length;i++)
{
data[i] = (int)(Math.random()*100) + 1;
System.out.print(data[i] + ",");
}
System.out.println();
Node root = new Node();
root.value = data[0];
for(int i=1;i<data.length;i++)
{
root.store(data[i]);
}
root.find(data[19]);
root.preList();
System.out.println();
root.middleList();
System.out.println();
root.afterList();
}
}
-----------------又一次臨場寫的代碼---------------------------
import java.util.Arrays;
import java.util.Iterator;
public class Node {
private Node left;
private Node right;
private int value;
//private int num;
public Node(int value){
this.value = value;
}
public void add(int value){
if(value > this.value)
{
if(right != null)
right.add(value);
else
{
Node node = new Node(value);
right = node;
}
}
else{
if(left != null)
left.add(value);
else
{
Node node = new Node(value);
left = node;
}
}
}
public boolean find(int value){
if(value == this.value) return true;
else if(value > this.value){
if(right == null) return false;
else return right.find(value);
}else{
if(left == null) return false;
else return left.find(value);
}
}
public void display(){
System.out.println(value);
if(left != null) left.display();
if(right != null) right.display();
}
/*public Iterator iterator(){
}*/
public static void main(String[] args){
int[] values = new int[8];
for(int i=0;i<8;i++){
int num = (int)(Math.random() * 15);
//System.out.println(num);
//if(Arrays.binarySearch(values, num)<0)
if(!contains(values,num))
values[i] = num;
else
i--;
}
System.out.println(Arrays.toString(values));
Node root = new Node(values[0]);
for(int i=1;i<values.length;i++){
root.add(values[i]);
}
System.out.println(root.find(13));
root.display();
}
public static boolean contains(int [] arr, int value){
int i = 0;
for(;i<arr.length;i++){
if(arr[i] == value) return true;
}
return false;
}
package cn.itcast;
import java.util.Date;
public class A1 {
public static void main(String [] args)
{
System.out.println(computeAge(8));
}
public static int computeAge(int n)
{
if(n==1) return 10;
return computeAge(n-1) + 2;
}
}
public static void toBinary(int n,StringBuffer result)
{
if(n/2 != 0)
toBinary(n/2,result);
result.append(n%2);
}
public class QuickSort {
/**
* 快速排序
* @param strDate
* @param left
* @param right
*/
public void quickSort(String[] strDate,int left,int right){
String middle,tempDate;
int i,j;
i=left;
j=right;
middle=strDate[(i+j)/2];
do{
while(strDate[i].compareTo(middle)<0&& i<right)
i++; //找出左邊比中間值大的數
while(strDate[j].compareTo(middle)>0&& j>left)
j--; //找出右邊比中間值小的數
if(i<=j){ //將左邊大的數和右邊小的數進行替換
tempDate=strDate[i];
strDate[i]=strDate[j];
strDate[j]=tempDate;
i++;
j--;
}
}while(i<=j); //當二者交錯時中止
if(i<right){
quickSort(strDate,i,right);//從
}
if(j>left){
quickSort(strDate,left,j);
}
}
/**
* @param args
*/
public static void main(String[] args){
String[] strVoid=new String[]{"11","66","22","0","55","22","0","32"};
QuickSort sort=new QuickSort();
sort.quickSort(strVoid,0,strVoid.length-1);
for(int i=0;i<strVoid.length;i++){
System.out.println(strVoid[i]+" ");
}
}
}
去零的代碼:
return sb.reverse().toString().replaceAll("零[拾佰仟]","零").replaceAll("零+萬","萬").replaceAll("零+元","元").replaceAll("零+","零");
public class RenMingBi {
/**
* @param args add by zxx ,Nov 29, 2008
*/
private static final char[] data = new char[]{
'零','壹','貳','叄','肆','伍','陸','柒','捌','玖'
};
private static final char[] units = new char[]{
'元','拾','佰','仟','萬','拾','佰','仟','億'
};
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println(
convert(135689123));
}
public static String convert(int money)
{
StringBuffer sbf = new StringBuffer();
int unit = 0;
while(money!=0)
{
sbf.insert(0,units[unit++]);
int number = money%10;
sbf.insert(0, data[number]);
money /= 10;
}
return sbf.toString();
}
}
1,張三,28
2,李四,35
3,張三,28
4,王五,35
5,張三,28
6,李四,35
7,趙六,28
8,田七,35
程序代碼以下(答題要博得用人單位的喜歡,包名用該公司,面試前就提早查好該公司的網址,若是查不到,現場問也是能夠的。還要加上實現思路的註釋):
package com.huawei.interview;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.TreeSet;
public class GetNameTest {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
//InputStream ips = GetNameTest.class.getResourceAsStream("/com/huawei/interview/info.txt");
//用上一行註釋的代碼和下一行的代碼均可以,由於info.txt與GetNameTest類在同一包下面,因此,能夠用下面的相對路徑形式
Map results = new HashMap();
InputStream ips = GetNameTest.class.getResourceAsStream("info.txt");
BufferedReader in = new BufferedReader(new InputStreamReader(ips));
String line = null;
try {
while((line=in.readLine())!=null)
{
dealLine(line,results);
}
sortResults(results);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
static class User
{
public String name;
public Integer value;
public User(String name,Integer value)
{
this.name = name;
this.value = value;
}
@Override
public boolean equals(Object obj) {
// TODO Auto-generated method stub
//下面的代碼沒有執行,說明往treeset中增長數據時,不會使用到equals方法。
boolean result = super.equals(obj);
System.out.println(result);
return result;
}
}
private static void sortResults(Map results) {
// TODO Auto-generated method stub
TreeSet sortedResults = new TreeSet(
new Comparator(){
public int compare(Object o1, Object o2) {
// TODO Auto-generated method stub
User user1 = (User)o1;
User user2 = (User)o2;
/*若是compareTo返回結果0,則認爲兩個對象相等,新的對象不會增長到集合中去
* 因此,不能直接用下面的代碼,不然,那些個數相同的其餘姓名就打印不出來。
* */
//return user1.value-user2.value;
//return user1.value<user2.value?-1:user1.value==user2.value?0:1;
if(user1.value<user2.value)
{
return -1;
}else if(user1.value>user2.value)
{
return 1;
}else
{
return user1.name.compareTo(user2.name);
}
}
}
);
Iterator iterator = results.keySet().iterator();
while(iterator.hasNext())
{
String name = (String)iterator.next();
Integer value = (Integer)results.get(name);
if(value > 1)
{
sortedResults.add(new User(name,value));
}
}
printResults(sortedResults);
}
private static void printResults(TreeSet sortedResults)
{
Iterator iterator = sortedResults.iterator();
while(iterator.hasNext())
{
User user = (User)iterator.next();
System.out.println(user.name + ":" + user.value);
}
}
public static void dealLine(String line,Map map)
{
if(!"".equals(line.trim()))
{
String [] results = line.split(",");
if(results.length == 3)
{
String name = results[1];
Integer value = (Integer)map.get(name);
if(value == null) value = 0;
map.put(name,value + 1);
}
}
}
}
第一種:飽漢模式
public class SingleTon {
private SingleTon(){
}
//實例化放在靜態代碼塊裏可提升程序的執行效率,但也可能更佔用空間
private final static SingleTon instance = new SingleTon();
public static SingleTon getInstance(){
return instance;
}
}
第二種:飢漢模式
public class SingleTon {
private SingleTon(){}
private static instance = null;//new SingleTon();
public static synchronized SingleTon getInstance(){
if(instance == null)
instance = new SingleTon();
return instance;
}
}
第三種:用枚舉
public enum SingleTon{
ONE;
}
第三:更實際的應用(在什麼狀況用單例)
public class SequenceGenerator{
//下面是該類自身的業務功能代碼
private int count = 0;
public synchronized int getSequence(){
++count;
}
//下面是把該類變成單例的代碼
private SequenceGenerator(){}
private final static instance = new SequenceGenerator();
public static SingleTon getInstance(){
return instance;
}
}
第四:
public class MemoryDao
{
private HashMap map = new HashMap();
public void add(Student stu1){
map.put(SequenceGenerator.getInstance().getSequence(),stu1);
}
//把MemoryDao變成單例
}
Singleton模式主要做用是保證在Java應用程序中,一個類Class只有一個實例存在。
通常Singleton模式一般有幾種種形式:
第一種形式: 定義一個類,它的構造函數爲private的,它有一個static的private的該類變量,在類初始化時實例話,經過一個public的getInstance方法獲取對它的引用,繼而調用其中的方法。
public class Singleton {
private Singleton(){}
//在本身內部定義本身一個實例,是否是很奇怪?
//注意這是private 只供內部調用
private static Singleton instance = new Singleton();
//這裏提供了一個供外部訪問本class的靜態方法,能夠直接訪問
public static Singleton getInstance() {
return instance;
}
}
第二種形式:
public class Singleton {
private static Singleton instance = null;
public static synchronized Singleton getInstance() {
//這個方法比上面有所改進,不用每次都進行生成對象,只是第一次
//使用時生成實例,提升了效率!
if (instance==null)
instance=new Singleton();
return instance;
}
}
其餘形式:
定義一個類,它的構造函數爲private的,全部方法爲static的。
通常認爲第一種形式要更加安全些
這是一個菲波拉契數列問題
public class lianxi01 {
public static void main(String[] args) {
System.out.println("第1個月的兔子對數: 1");
System.out.println("第2個月的兔子對數: 1");
int f1 = 1, f2 = 1, f, M=24;
for(int i=3; i<=M; i++) {
f = f2;
f2 = f1 + f2;
f1 = f;
System.out.println("第" + i +"個月的兔子對數: "+f2);
}
}
}
N階乘:
public int factorial(int m)
{
if (m < 0)
return 0;
else if ( m == 1)
reteurn 1;
else if (m > 1)
return m * factorial(m-1);
}
平衡二叉樹是一棵空樹或它的左右兩個子樹的高度差的絕對值不超過1,而且左右兩個子樹都是一棵平衡二叉樹。
在遍歷二叉樹時,能循環到起點指針稱爲有環。