第一篇:java知識點總結目錄.
1:J2SE 面向對象-封裝、繼承、多態 內存的分析 遞歸 集合類、泛型、自動打包與解包、Annotation IO 多線程、線程同步 TCP/UDP AWT、事件模型、匿名類 正則表達式 反射機制 2:數據庫(Oracle或者MySQL)SQL語句 多表連接,內外連接,子查詢等 管理表、視圖、索引、序列、約束等 樹狀結構存儲 存儲過程、觸發器 數據庫設計三范式、3:JDBC JDBC基礎 連接池 樹狀結構存儲與展現 DataSource & RowSet JDBC連接Oracle及MySQL 4:HTML_CSS_JAVASCRIPT html、css、javascript基礎語法 JavaScript Form判斷 Dom編程基礎(事件處理等)JS常用效果如TreeView、下拉聯動等 JS學習方法 JS調試方法 DreamWeaver初步(建立HTML、Table、Form、CSS)等 5:Servlet & JSP tomcat基礎 servlet基礎 web.xml配置基礎 web application的結構 servlet生命周期 request response等常用方法 ServletContext類 HTTP協議基礎(GET POST)Cookie Session Application JSP的幾種語法(包括JSTL等)注意在項目中練習,不要拘泥于語法細節而裹步不前。6:Struts 多層架構理論 Model 1 and Model 2 Struts基本概念 MVC Action與業務邏輯類的關系 在Struts與JSP之間傳遞數據 Struts處理流程(控制流)Struts TagLib(了解常用的)JSTL ActionForm 字段收集 上傳文件 類型轉換 DTO 動態Action Form 驗證框架 ActionForward 轉發與重定向 動態生成ActionForward 全局與局部的ActionForward Action Forward Scope UnknownActionMapping Action的線程安全 I18N 如何切換語言環境 Struts異常處理機制 程序處理 自動處理 自定義異常處理器 Struts的多模塊配置 7:XML(XML/XSL、XSLT/DTD、SCHEMA等基礎的概念、關于Java的編程可以暫時扔在一邊)8:Hibernate OR Mapping原理 Hibernate基礎開發步驟 Hibernate基本接口(重點Session)普通屬性映射 關聯關系映射 Native SQL inverse lazy cascade 繼承關系映射 HQL 性能優化 一級緩存 二級緩存 查詢緩存 事務與并發 悲觀鎖、樂觀鎖 OpenSessionInView CurrentSession(至于JTA、聯合主鍵、自然主鍵、動態主鍵、Any類型 Creteria Queries Intercepter and Event 自定義類型等,可以暫時扔在一邊)9:Spring IOC/DI Spring配置 Spring架構 AOP及Spring AOP 聲明式事務(AOP)Spring + Hibernate Spring支持Web Scope(其他的Spring模塊對于自學來說可以暫時扔在一邊)10:EJB3.0 J2EE架
構基礎(JTA JMS等)EJB基礎(地位及基本理論、分類等)Annotation Ant編譯與部署EJB Session Bean EJB的依賴注入 Persistence API(可以
用JBoss學習EJB3.0)
第二篇:java知識點總結(定稿)
目錄
目錄................................................................................................................................................1 基礎篇............................................................................................................................................4
一、JDK常用的包................................................................................................................4
二、Get和Post的區別.......................................................................................................4
三、Java多態的具體體現...................................................................................................4
四、StringBuffer StringBuilder String 區別.......................................................................5
五、Hashtable與HashMap的區別....................................................................................5六、九大隱式對象...............................................................................................................5
七、Forword(請求轉發)與Redirect(重定向).....................................................................6
八、JQurey總結....................................................................................................................6
九、XML和Json的特點....................................................................................................6
十、request.getSession()、reqeust.getSession(false)和
request.getSession(true)7
十一、Page和PageContext的區別....................................................................................7
十二、Ajax總結..................................................................................................................7
十三、JSP9大隱視對象中四個作用域的大小與作用范圍................................................7
十四、List,Set,Collection,Collections..................................................................................8
十五、java的基本數據類型...............................................................................................8
十六、冒泡排序...................................................................................................................8 十七、二分查找法.................................................................................................................9
十八、時間類型轉換.............................................................................................................9
十九、階乘.......................................................................................................................10
二十、UE和UI的區別....................................................................................................10 二
十一、osi七層模型.......................................................................................................10 二
十二、線程和進程的區別.............................................................................................11 二
十三、jvm的內存結構.................................................................................................11 二
十四、內存泄露和內存溢出.........................................................................................11 二
十五、單例.....................................................................................................................11 二
十六、解析xml文件的幾種技術.................................................................................13 二
十七、項目的生命周期.................................................................................................14
1
二十八、OSCache的判斷.................................................................................................14 二
十九、經常訪問的技術網站.........................................................................................15 三
十、項目團隊中交流的工具.........................................................................................15 三
十一、平時瀏覽的書籍.................................................................................................15 三
十二、java Exception體系結構....................................................................................15 三
十三、session和cookie的區別....................................................................................16 三
十四、字節流與字符流的區別.....................................................................................16 三
十五、final,finally,finalize 三者區別...........................................................................17 三
十六、Io流的層次結構................................................................................................17 三
十七、JAVA:..................................................................................................................18 三
十八、JavaSE JavaEE JavaME區別........................................................................18 三
十九、JDK JRE JVM的區別:.............................................................................19 四
十、報錯的狀態碼:.....................................................................................................20 四
十一、協議以及默認的端口號.....................................................................................20 四
十二、抽象類與接口的區別.........................................................................................20 四
十三、修飾符的作用.....................................................................................................20 框架篇........................................................................................................................................21
一、Struts1的運行原理..................................................................................................23
二、Struts2的運行原理..................................................................................................23
三、struts2的體系結構...................................................................................................23
四、Spring MVC運行原理.............................................................................................24
五、Struts1.x與Struts2.x的區別...................................................................................25
六、Spring MVC、struts1和struts2區別......................................................................25
七、Struts2中result中的type類型...............................................................................25
八、Struts2標簽..............................................................................................................26
九、SSI整合....................................................................................................................26
十、SSH整合..................................................................................................................26
十、Spring MVC整合.....................................................................................................27
十一、Hibernate 中get 和 load的區別.........................................................................28
十二、Hibernate、Ibatis、Jdbc三者的區別..................................................................28
十三、Hibernate的運行原理..........................................................................................28
十四、Hibernate五大核心(類/接口)簡述.................................................................28
十五、Hibernate與JDBC的區別..................................................................................29
十六、Hibernate中的兩大配置文件................................................................................29
十七、Hibernate事務處理..............................................................................................29
十八、Hibernate的三種狀態以及狀態的轉換..............................................................29
十九、分頁步驟...............................................................................................................30
二十、hibernate緩存概述.................................................................................................30 二
十一、Ssh的概述:.....................................................................................................30 二
十二、防止表單重復提交.............................................................................................31 二
十三、JSP標簽:........................................................................................................31 二
十四、過濾器.................................................................................................................32 二
十五、攔截器的理解.....................................................................................................32 二
十六、Spring融入框架................................................................................................33
2
數據庫篇.....................................................................................................................................33
一、JDBC連接數據庫步驟(以MYSQL為例).............................................................33
二、數據庫連接池...........................................................................................................34
三、mysql的數據庫導入導出........................................................................................35
四、jdbc分段批量提交的時候出現異常怎么處理?.....................................................35
五、jdbc批量處理數據...................................................................................................35
六、Oracle分頁...............................................................................................................36
七、Oracle的基本數據類型...........................................................................................36
八、id、rowid、rownum的區別....................................................................................37
九、主鍵和唯一索引的區別?.......................................................................................37
十、Preparedstatement和statement的區別...................................................................37
十一、數據庫三范式.......................................................................................................38
十二、視圖概述...............................................................................................................38
十三、存儲過程概述.......................................................................................................38
十四、索引概述...............................................................................................................39
十五、必背的sql語句....................................................................................................41 業務場景篇.................................................................................................................................44
一、Spring的概述...........................................................................................................44
二、事務概述...................................................................................................................45
三、權限概述...................................................................................................................46
四、OSCache業務場景...................................................................................................46
五、線程概述...................................................................................................................47
六、Ajax請求Session超時問題....................................................................................47 七:java線程池概述.........................................................................................................48
八、OSCache概述...........................................................................................................49
九、OSCache+autocomplete+單例業務場景..................................................................49
十、緩存概述...................................................................................................................50
十一、實現頁面靜態化業務場景...................................................................................50
十二、servlet線程安全描述...........................................................................................51
十三、(jbpm4)工作流引擎描述:.....................................................................................51
十四、JPBM業務場景....................................................................................................52
十五、Ant描述................................................................................................................52
十六、FreeMarker描述...................................................................................................53
十七、webService描述...................................................................................................53
十八、oracle索引概述....................................................................................................55
十九、oracle存儲過程....................................................................................................56
二十、Junit 業務場景.......................................................................................................56 二
十一、Apache+Tomcat 實現負載均衡及seesion復制...............................................56 二
十二、Ant業務場景......................................................................................................57 二
十三、maven業務場景.................................................................................................57 二
十四、Servlet的概述:................................................................................................58 優化篇........................................................................................................................................64
一、代碼優化...................................................................................................................64
二、業務優化...................................................................................................................64
3
三、sql優化.....................................................................................................................65
四、防sql注入................................................................................................................68
基礎篇
一、JDK常用的包
java.lang: 這個是系統的基礎類,比如String、Math、Integer、System和Thread,提供常用功能。
java.io: 這里面是所有輸入輸出有關的類,比如文件操作等
java.net: 這里面是與網絡有關的類,比如URL,URLConnection等。java.util : 這個是系統輔助類,特別是集合類Collection,List,Map等。java.sql: 這個是數據庫操作的類,Connection, Statememt,ResultSet等
二、Get和Post的區別
1.get是從服務器上獲取數據,post是向服務器傳送數據,2.get傳送的數據量較小,不能大于2KB。post傳送的數據量較大,一般被默認為不受限制。
3.get安全性非常低,post安全性較高。但是執行效率卻比Post方法好。
4.在進行文件上傳時只能使用post而不能是get。
三、Java多態的具體體現
面向對象編程有四個特征:抽象,封裝,繼承,多態。
多態有四種體現形式:
1.接口和接口的繼承。2.類和類的繼承。3.重載。4.重寫。
其中重載和重寫為核心。
重載:重載發生在同一個類中,在該類中如果存在多個同名方 法,但是方法的參數類型和個數不一樣,那么說明該方法被重 載了。
重寫:重寫發生在子類繼承父類的關系中,父類中的方法被子 類繼承,方法名,返回值類型,參數完全一樣,但是方法體不 一樣,那么說明父類中的該方法被子類重寫了。
4
四、StringBuffer StringBuilder String 區別
String
字符串常量
不可變
使用字符串拼接時是不同的2個空間
StringBuffer 字符串變量
可變
線程安全
字符串拼接直接在字符串后追加 StringBuilder 字符串變量
可變
非線程安全
字符串拼接直接在字符串后追加
1.StringBuilder執行效率高于StringBuffer高于String.2.String是一個常量,是不可變的,所以對于每一次+=賦值都會創建一個新的對象,StringBuffer和StringBuilder都是可變的,當進行字符串拼接時采用append方
法,在原來的基礎上進行追加,所以性能比String要高,又因為StringBuffer 是
線程安全的而StringBuilder是線程非安全的,所以StringBuilder的效率高于
StringBuffer.3.對于大數據量的字符串的拼接,采用StringBuffer,StringBuilder.五、Hashtable與HashMap的區別
HashMap不是線程安全的,HashTable是線程安全。
HashMap允許空(null)的鍵和值(key),HashTable則不允許。
HashMap性能優于Hashtable。
Map 1.Map是一個以鍵值對存儲的接口。Map下有兩個具體的實現,分別是HashMap和HashTable.2.HashMap是線程非安全的,HashTable是線程安全的,所以HashMap的效率高于HashTable.3.HashMap允許鍵或值為空,而HashTable不允許鍵或值為空.六、九大隱式對象
輸入/輸出對象:
request
response
out 作用域通信對象: session application pageContext Servlet 對象:
page
config 錯誤對象:
exception
5
七、Forword(請求轉發)與Redirect(重定向)
1、從數據共享上
Forword是一個請求的延續,可以共享request的數據
Redirect開啟一個新的請求,不可以共享request的數據
2、從地址欄
Forword轉發地址欄不發生變化
Redirect轉發地址欄發生變化
八、JQurey總結
jquery是一個輕量級的js框架,具有跨瀏覽器的特性,兼容性好,并且封裝了很多工具,方便使用。
常用的有: 選擇器,dom操作,ajax(ajax不能跨域),特效,工具類
九、XML和Json的特點
Xml特點:
1、有且只有一個根節點;
2、數據傳輸的載體
3、所有的標簽都需要自定義
4、是純文本文件
Json(JavaScript Object Notation)特點:
json分為兩種格式:
json對象(就是在{}中存儲鍵值對,鍵和值之間用冒號分隔,鍵 值 對之間用逗號分隔);
json數組(就是[]中存儲多個json對象,json對象之間用逗號分隔)(兩者間可以進行相互嵌套)數據傳輸的載體之一
區別:
傳輸同樣格式的數據,xml需要使用更多的字符進行描述,流行的是基于json的數據傳輸。
xml的層次結構比json更清晰。
共同點:
xml和json都是數據傳輸的載體,并且具有跨平臺跨語言的特性。
6
十、request.getSession()、reqeust.getSession(false)和
request.getSession(true)
getSession()/getSession(true):當session存在時返回該session,否則新建一個
session并返回該對象
getSession(false):當session存在時返回該session,否則返回null
十一、Page和PageContext的區別
Page是servlet對象;使用this關鍵字,它的作用范圍是在同一頁面。PageContext是作用域通信對象;通常使用setAttribute()和getAttribute()來設置和獲取存放對象的值。
十二、Ajax總結
AJAX 全稱: 異步JavaScript及 XML(Asynchronous JavaScript And XML)Ajax的核心是JavaScript對象XmlHttpRequest(XHR)。
Ajax的優點:
提高用戶體驗度(UE)
提高應用程序的性能
進行局部刷新
AJAX不是一種新的編程語言,而是一種用于創建更好更快以及交互性更強的 Web 應用程序的技術。
2.通過 AJAX,我們的 JavaScript 可使用JavaScript的XMLHttpRequest對象來直接與服務器進行通信。通過這個對象,我們的 JavaScript 可在不重載頁面的情況與Web服務器交換數據,即可局部刷新。
3.AJAX 在瀏覽器與 Web 服務器之間使用異步數據傳輸(HTTP 請求),這樣就可使網頁從服務器請求少量的信息,而不是整個頁面,減輕服務器的負擔,提升站點的性能。
AJAX 可使因特網應用程序更小、更快,更友好,用戶體驗(UE)好。5.Ajax是基于標準化并被廣泛支持的技術,并且不需要插件和下載小程序
十三、JSP9大隱視對象中四個作用域的大小與作用范圍
四個作用域從大到小:appliaction>session>request>page application:全局作用范圍,整個應用程序共享.生命周期為:應用程序啟動到停止。
7
session:會話作用域,當用戶首次訪問時,產生一個新的會話,以后服務器就可以記
住這個會話狀態。
request:請求作用域,就是客戶端的一次請求。
page:一個JSP頁面。
以上作用范圍使越來越小,request和page的生命周期都是短暫的,他們之間的區別就是:一個request可以包含多個page頁(include,forward)。
十四、List,Set,Collection,Collections
1.List和Set都是接口,他們都繼承于接口Collection,List是一個有序的可重復的集合,而Set的無序的不可重復的集合。Collection是集合的頂層接口,Collections是一個封裝了眾多關于集合操作的靜態方法的工具類,因為構造方法是私有的,所以不能實例化。
2.List接口實現類有ArrayList,LinkedList,Vector。ArrayList和Vector是基于數組實現的,所以查詢的時候速度快,而在進行增加和刪除的時候速度較慢LinkedList是基于鏈式存儲結構,所以在進行查詢的時候速度較慢但在進行增加和刪除的時候速度較快。又因為Vector是線程安全的,所以他和ArrayList相比而言,查詢效率要低。
十五、java的基本數據類型
數據類型 大小 byte(字節)1(8位)shot(短整型)2(16位)int(整型)4(32位)long(長整型)8(32位)float(浮點型)4(32位)double(雙精度)8(64位)char(字符型)2(16位)boolean(布爾型)1位 附加:
String是基本數據類型嗎?(String不是基本數據類型)String的長度是多少,有限制?(長度受內存大小的影響)
十六、冒泡排序
public class Sort { public static void sort(){
8
} Scanner input = new Scanner(System.in);int sort[] = new int[10];int temp;System.out.println(“請輸入10個排序的數據:”);for(int i = 0;i < sort.length;i++){
sort[i] = input.nextInt();} for(int i = 0;i < sort.lengthi1)* num;
} } public static void main(String[] args){
System.out.println(multiply(10));} }
二十、UE和UI的區別
UE 是用戶體驗度
UI 界面原型(用戶界面)(相當于買房時用的模型)
設計UI的作用:
1、幫助程序員工作(界面已由美工設計完成)
2、提前讓用戶對項目有個宏觀的了解,知道效果是什么樣子。
二十一、osi七層模型
第一層:物理層
第二層:數據鏈路層
第三層:網絡層
第四層:傳輸層
第五層:會話層 第六層:表示層 第七層:應用層
10
二十二、線程和進程的區別
1.線程(Thread)與進程(Process)
進程定義的是應用程序與應用程序之間的邊界,通常來說一個進程就代表一個與之對應的應用程序。不同的進程之間不能共享代碼和數據空間,而同一進程的不同線程可以共享代碼和數據空間。
2.一個進程可以包括若干個線程,同時創建多個線程來完成某項任務,便是多線程。3.實現線程的兩種方式:繼承Thread類,實現Runable接口
二十三、jvm的內存結構
java虛擬機的內存結構分為堆(heap)和棧(stack),堆里面存放是對象實例也就是new出來的對象。棧里面存放的是基本數據類型以及引用數據類型的地址。
對于所謂的常量是存儲在方法區的常量池里面。
二十四、內存泄露和內存溢出
內存泄露(memory leak),是指應用程序在申請內存后,無法釋放已經申請的內存空間.一次內存泄露危害可以忽略,但如果任其發展最終會導致內存溢出(out of memory).如讀取文件后流要進行及時的關閉以及對數據庫連接的釋放。
內存溢出(out of memory)是指應用程序在申請內存時,沒有足夠的內存空間供其使用。
如我們在項目中對于大批量數據的導入,采用分段批量提交的方式。
二十五、單例
單例就是該類只能返回一個實例。單例所具備的特點: 1.私有化的構造函數 2.私有的靜態的全局變量 3.公有的靜態的方法
單例分為懶漢式、餓漢式和雙層鎖式
11
餓漢式: public class Singleton1 {
private Singleton1(){};
private static Singleton1 single = new Singleton1();
public static Singleton1 getInstance(){
return single;
} }
懶漢式:
public class Singleton2 {
private Singleton2(){}
private static Singleton2 single=null;
public tatic Singleton2 getInstance(){
if(single == null){
single = new Singleton2();
}
return single;
} } 線程安全:
public class Singleton3 {
private Singleton3(){}
private static Singleton3 single;
public static Singleton3 getInstance(){
if(null == single){
synchronized(single){
if(null == single){
single = new Singleton3();
}
}
}
return single;
} }
參考:
通過雙重判斷來保證單列設計模式在多線程中的安全性,并且它在性能方面提高了很多。
12
synchronized在方法上加鎖(同步鎖)
synchronized在代碼塊內部加鎖(同步代碼塊)
synchronized(同步鎖)
使用synchronized如何解決線程安全的問題? 1.synchronized在方法上加鎖 2.synchronized在代碼塊內部加鎖
1.懶漢
2.餓漢
3.雙重判斷
二十六、解析xml文件的幾種技術
1、解析xml的幾種技術
1.dom4j
2.sax
3.jaxb
4.jdom
5.dom 1.dom4j
dom4j是一個Java的XML API,類似于jdom,用來讀寫XML文件的。dom4j是一個非常優秀的Java XML API,具有性能優異、功能強大和極端易用使用的特點,同時它也是一個開放源代碼的軟件。
2.sax
SAX(simple API for XML)是一種XML解析的替代方法。相比于DOM,SAX是一種速度更快,更有效的方法。它逐行掃描文檔,一邊掃描一邊解析。而且相比于DOM,SAX可以在解析文檔的任意時刻停止解析,但任何事物都有其相反的一面,對于SAX來說就是操作復雜。
13
3.jaxb
JAXB(Java Architecture for XML Binding)是一個業界的標準,是一項可以根據XML Schema產生Java類的技術。該過程中,JAXB也提供了將XML實例文檔反向生成Java對象樹的方法,并能將Java對象樹的內容重新寫到XML實例文檔。從另一方面來講,JAXB提供了快速而簡便的方法將XML模式綁定到Java表示,從而使得Java開發者在Java應用程序中能方便地結合XML數據和處理函數。
2、dom4j 與 sax 之間的對比:【注:必須掌握!】
dom4j不適合大文件的解析,因為它是一下子將文件加載到內存中,所以有可能出現內存溢出,sax是基于事件來對xml進行解析的,所以他可以解析大文件的xml
也正是因為如此,所以dom4j可以對xml進行靈活的增刪改查和導航,而sax沒有這么強的靈活性
所以sax經常是用來解析大型xml文件,而要對xml文件進行一些靈活(crud)操作就用dom4j
二十七、項目的生命周期
1.需求分析
2.概要設計
3.詳細設計(用例圖,流程圖,類圖)4.數據庫設計(powerdesigner)5.代碼開發(編寫)
6.單元測試(junit 白盒測試)(開發人員)svn版本管理工具(提交,更新代碼,文檔)7.集成測試(黑盒測試,loadrunner(編寫測試腳本)(高級測試))
8.上線試運行(用戶自己體驗)
9.壓力測試(loadrunner)
10.正式上線
11.維護
二十八、OSCache的判斷
Object obj = CacheManager.getInstance().getObj(“oaBrandList”);//從緩存中取數據 if(null == obj){
obj = brandDao.getBrandList();
//如果為空再從數據庫獲取數據
//獲取之后放入緩存中
14
CacheManager.getInstance().putObj(“oaBrandList”, obj);}
return(List
二十九、經常訪問的技術網站
1.csdn(詳細步驟的描述)2.iteye(詳細步驟的描述)3.oschina(開源中國獲取java開源方面的信息技術)
4.java開源大全 下載完畢,并且已經解析為DOM 樹了,但很有可能圖片還沒有加載完畢,所以例如圖片的高度和寬度這樣的屬性此時不一定有效。要解決這個問題,可以使用Jquery 中另一個關于頁面加載的方法---load()方法。Load()方法會在元素的onload 事件中綁定一個處理函數。如果處理函數綁定給window 對象,則會在所有內容(包括窗口、框架、對象和圖像等)加載完畢后觸發,如果處理函數綁定在元素上,則會在元素的內容加載完畢后觸發。Jquery 代碼如下: $(window).load(function(){ // 編寫代碼 });等價于JavaScript 中的以下代碼 Window.onload = function(){ // 編寫代碼 } 四
十五、switch默認接受的幾種數據類型
Short, int, byte, char
21
四
十六、request 跟session的區別
1.他們的生命周期不同,request對應的是一次請求,session對應的是一次會話
2.request占用資源比較少,相對來說缺乏持續性, 而session資源消耗比較大,所以通常使用request來保存信息
四
十七、找到解決svn沖突方法
對于svn沖突,可以采用手工處理將沖突的部分進行整合,之后備份最新整合后的文件,采用覆蓋更新的方式處理完 沖突之后,再把最新整合后的文件進行提交。
四
十八、反射的描述
通過字符串可以動態創建java對象,并且可以動態訪問方法,屬性等。
我們在項目中的時候封裝過數據庫jdbc的持久層,其中就利用反射這項
技術來達到通用
和靈活的目的。
22
框架篇
一、Struts1的運行原理
在啟動時通過前端總控制器ActionServlet加載struts-config.xml并進行解析,當用戶在jsp頁面發送請求被struts1的核心控制器ActionServlet接收,ActionServlet在用戶請求時將請求參數放到對應的ActionForm對象中的成員變量中,然后ActionServlet則會根據struts-config.xml中的映射關系找到相應的Action中的方法,將對應的ActionForm一并傳給這個Action中的方法里,然后執行相應的業務邏輯操作,最后就根據ActionMapping的findforward方法返回一個ActionForward,之后在struts-config.xml中找到與之對應的forward標簽,根據它的配置路徑找到對應的jsp頁面。
二、Struts2的運行原理
1、tomcat 啟動的時候會加載 web.xml、核心控制器 FilterDispatcher 會加載并解析 struts.xml
2、客戶端會發送一個請求到 action、FilterDispatcher 會根據后綴名進行攔截
3、FilterDispatcher根據 struts.xml 的配置文件信息 找到 某個action 對應的某個類里的指定方法
4、執行相關的業務邏輯最后返回 一個String
5、
三、struts2的體系結構
1、客戶端向Servlet容器(例如Tomcat)發送一個請求;
2、這個請求經過一系列的過濾器(Filter);
3、接著FilterDispatcher被調用,FilterDispatcher詢問ActionMapper來決定這個請求是否需要調用某個Action;
4、如果ActionMapper決定需要調用某個Action,FilterDispatcher把請求的處理交給ActionProxy;
5、ActionProxy通過Configuration Manager詢問框架的配置文件,找到需要調用的Action類;
6、ActionProxy創建一個ActionInvocation的實例。
7、ActionInvocation在調用Action的過程前后,涉及到相關攔截器(Intercepter)的調用。
8、一旦Action執行完畢,ActionInvocation負責根據struts.xml中的配置找到對應的返回結果。返回結果通常是jsp或者FreeMarker的模版。(體系結構圖見下一頁)
23
四、Spring MVC運行原理
整個處理過程從一個HTTP請求開始:
1.Tomcat在啟動時加載解析web.xml,找到spring mvc的前端總控制器DispatcherServlet,并且通過DispatcherServlet來加載相關的配置文件信息。
2.DispatcherServlet接收到客戶端請求,找到對應HandlerMapping,根據映射規則,找到對應的處理器(Handler)。
3.調用相應處理器中的處理方法,處理該請求后,會返回一個ModelAndView。
4.DispatcherServlet根據得到的ModelAndView中的視圖對象,找到一個合適的ViewResolver(視圖解析器),根據視圖解析器的配置,DispatcherServlet將要顯示的數據傳給對應的視圖,最后顯示給用戶。
24
五、Struts1.x與Struts2.x的區別
Struts 2以WebWork為核心,采用攔截器的機制來處理用戶的請求,struts1嚴重依賴于servletAPI, 屬于侵入性框架,struts2不嚴重依賴于servletAPI,屬于非侵入型框架。線程模型方面:
Struts1的Action是單實例的, 一個Action的實例處理所有的請求。
Struts2的Action是一個請求對應一個實例(每次請求時都新new出一個對象), 沒有線程安全方面的問題 封裝請求參數:
Struts1中強制使用ActionForm對象封裝請求的參數。
Struts2可以選擇使用POJO類來封裝請求的參數,或者直接使用Action的屬性。struts1的前端總控制器(核心總控制器)為ActionServlet, struts2的前端總控制器(核心總控制器)為FilterDispather
六、Spring MVC、struts1和struts2區別
1.spring mvc 單例 非線程安全
struts1單例 非線程安全
struts2線程安全對每個請求都產生一個實例 2.spring mvc的入口是servlet,而struts2是filter
spring 的前端總控制器為 DispatcherServlet
struts2 的前端總控制器為 FilterDispatcher
struts1 的前端總控制器為 actionServlet 3.參數傳遞:struts是在接受參數的時候,可以用屬性來接受參數,這就說明參數是讓多個方法共享的。springmvc 用方法來接受參數
4.spring mvc是基于方法的設計,而sturts是基于類
七、Struts2中result中的type類型
1.dispatcher:它是默認的,用來轉向頁面,通常處理JSP 2.redirect:將用戶重定向到一個已配置好的URL 3.redirectAction:將用戶重定向到一個已定義好的action 4.chain:將action和另外一個action鏈接起來 5.freemarker:呈現Freemarker模板
6.httpheader:返回一個已配置好的HTTP頭信息響應
7.stream:向瀏覽器發送InputSream對象對下載的內容和圖片非常有用 8.velocity:呈現Velocity模板
25
9.xslt :該XML可以通過XSL模板進行轉換
10.plaintext:顯示原始文件內容,例如文件源代碼
八、Struts2標簽
首先需要引用 <%@taglib prefix=“s” uri=“/struts-tags”%> 1.
3.
個頁面中
4.
5.
6.
7.
8.
9.
最常用的是:
判斷
循環
輸出
九、SSI整合
1、Action繼承于Actionsupport
2、引入struts-spring-plugin.jar包,從而完成struts和spring的整合
3、在struts2的action中注入service,保證service的名字和配置文件中的一致,并生成get,set方法
4、Dao層繼承于SqlMapClientDaoSupport
5、在dao層的配置文件中注入sqlMapClient
十、SSH整合
1.首先在web.xml中通過ContextLoaderListener來融入spring,并加載spring的相關配置文件
2.同樣配置sturts2的前端總控制器filterDispatcher來過濾相關的 請求并且加載struts.xml
26
3.action繼承ActionSupport,然后通過引入struts-spring-plugin.jar 包并且根據配置文件中service的id生成get,set方法來注入service層。
4.dao層繼承于HibernateDaoSupport,并且在dao的配置文件中注入sessionFactory.5.通過spring中的配置文件加載hibernate.cfg.xml文件從而融入hibernate.在ssh框架中是怎么整合spring? 首先在web.xml中通過ContextLoaderListener來融入spring,并加載spring的相關配置文件
在ssh框架中是怎么整合hibernate? 通過spring中的配置文件加載hibernate.cfg.xml文件從而融入hibernate dao層繼承于HibernateDaoSupport,并且在dao的配置文件中注入sessionFactory
在ssh框架中是怎么整合struts2? 配置sturts2的前端總控制器filterDispatcher來過濾相關的 請求并且加載struts.xml
十、Spring MVC整合
1.首先,要在web.xml里面配置SpringMVC的核心控制器,DispatcherServlet,對指定的后綴請求進行攔截。
2.Controller層要加 @Controller注解,表明該類是MVC的控制層。
3.創建Service接口,給接口加上注解 @Component或者 @Service 表明這是Service業務處理層
4.在Controller層聲明Service變量(屬性),給變量(屬性)加上 @Autowired注解,通過自動綁定機制將Service注入到Controller。(注:@Autowired默認是ByType,如果想根據屬性名注入,那么就再加上注解 @Resource(name=“屬性名”))5.在Controller層的方法上加上注解 @RequestMapping(“requestAddress”)表明該方法的請求地址
6.Dao層要加上注解 @Repository 表明這是數據庫持久層 7.同樣將dao實例注入到service層中。
8.配置視圖解析器 “InternalResourceViewResolver”,對處理后的跳轉進行統一配置。
27
十一、Hibernate 中get 和 load的區別
加載方式:
load為延遲加載(返回的是一個只有id屬性的代理,只有使用該對象屬性時,才
發出sql語句);
get為立即加載(執行時,會立即向數據庫發出sql語句)返回結果:
load檢索不到記錄時,會拋ObjectNotFoundException異常
get檢索不到記錄時,會返回null
十二、Hibernate、Ibatis、Jdbc三者的區別
Hibernate屬于全自動,Ibatis屬于半自動,Jdbc屬于手動,從開發效率上講hibernate較高,ibatis居中,jdbc較低,從執行效率上講hibernate較低,ibatis居中,jdbc較高,因為jdbc是手工寫sql語句,程序員對sql的控制能力更大,可以根據業務需要進行優化,而ibatis雖然也可以對sql進行優化,但是他里面將resultset封裝為實體的過程中采用了反射機制所以一定程度上影響了性能,而hibernate因為高度封裝所以開發效率相對較高,但正因為這個原因,所以程序員在對sql語句的控制和優化方面相對比較弱,而且在將resultset封裝成實體的過程中也采用了反射機制,所以在性能方面較低
十三、Hibernate的運行原理
首先通過configuration去加載hibernate.cfg.xml這個配置文件,根據 配置文件的信息去創建sessionFactory,sessionFactory是線程安全的,是一個session工廠,用來創建session,session是線程不安全的,相當于
jdbc的connection,最后通過session去進行數據庫的各種操作,在進行操作 的時候通過transaction進行事務的控制。
十四、Hibernate五大核心(類/接口)簡述
1.Configuration接口的作用是對Hibernate進行配置,以及對它進行啟動。(加載 hibernate.cfg.xml)并創建一個SessionFactory對象。2.SessionFactory接口
SessionFactory接口負責初始化Hibernate。它充當數據存儲源的代理,并負責創建 Session對象。SessionFactory是線程安全的。3.Session接口
Session(會話)接口是Hibernate應用使用的主要接口。Session接口負責執行被持久化對象的CRUD操作(增刪改查)。Session對象是非線程安全的。Session 相當于jdbc的connection 4.Query與Criteria接口
總之Query和Criteria接口負責執行各種數據庫查詢。5.Transaction接口
28
Transaction(事務)負責操作相關的事務。
十五、Hibernate與JDBC的區別
1、hibernate和jdbc主要區別就是,hibernate先檢索緩存中的映射對象(即hibernate操作的是對象),而jdbc則是直接操作數據庫.2、Hibernate是JDBC的輕量級的對象封裝,它是一個獨立的對象持久層框架。Hibernate可以用在任何JDBC可以使用的場合
3、Hibernate是一個和JDBC密切關聯的框架,所以Hibernate的兼容性和JDBC驅動,和數據庫都有一定的關系,但是和使用它的Java程序,和App Server沒有任何關系,也不存在兼容性問題。
4、如果正確的使用JDBC技術,它的執行效率一定比hibernate要好,因為hibernate是基于jdbc的技術.5、JDBC使用的是SQL語句,Hibernate使用的是HQL語句,但是HQL語句最終還會隱式轉換成SQL語句執行。
十六、Hibernate中的兩大配置文件
*.hbm.xml:主鍵生成策略,映射關系,一對多,一對一的關系。
Hibernate.cfg.xml:方言(用哪個數據庫),數據庫連接信息,包含*.hbm.xml內容,映射 文件,也可以配事務。
十七、Hibernate事務處理
開啟事務 session.beginTransaction();執行相關的操作,如果成功則session.getTransaction().commit();執行操作失敗則 session.getTransaction.rollback();
十八、Hibernate的三種狀態以及狀態的轉換
Transient(臨時)
new 一個初始化對象后,并沒有在數據庫里保存數據,處于臨時狀態; Persistent(持久化)
當執行save()方法,調用session.close()方法之前,內存中的對象與數據庫有
對應關系處于持久化狀態;
Detached(托管/游離)
當執行session.close()之后,處于托管狀態; 狀態的轉換
處于托管狀態下,調用update()方法后,轉換為持久化狀態;
在持久化狀態下,執行delete()方法后,轉換為臨時狀態;
在未初始化對象之前,調用get(),load(),find(),iterate()之后,直接進入持久化
狀態。
29
十九、分頁步驟
①前臺封裝一個顯示分頁的組件 ②查詢總條數
③后臺封裝分頁工具類,計算開始位置、結束位置、總頁數 ④后臺寫支持分頁的sql語句
⑤前臺包含分頁組件,實現分頁效果
注意: 查詢總條數的where和查詢列表信息的where條件要保證一致。
二十、hibernate緩存概述
hibernate分為一級緩存即session緩存也叫事務級別的緩存以及
二級緩存sessionFactory即應用級別的緩存,還有查詢緩存即三級緩存.一級緩存的生命周期和session的生命周期保持一致,hibernate默認就啟用了一級緩存,不能將其關閉,可以通過session.clear()和session.evict(object)來管理一級緩存。其中get,load,iterate都會使用一級緩存,一級緩存緩存的是對象。
二級緩存的生命周期和sessionFactory的生命周期保持一致,可以跨session,被多個session共享,hibernate3默認開啟二級緩存,也可以手動開啟并指定緩存插件如ehcache,oscache 等。二級緩存也只能緩存對象。
三級緩存也叫查詢緩存,查詢緩存是針對普通屬性結果集的緩存, 對實體對象的結果集只緩存id。對query.list()起作用,query.iterate不起作用,也就是query.iterate不使用查詢緩存
二十一、Ssh的概述:
ssh是web開發中常見的一種框架 s-struts s-spring h-hibernate 其中struts在框架中充當控制器,實現MVC,主要用來處理用戶的請求,和跳轉頁面。使項目結構清晰,開發者只需要關注業務邏輯的實現即可。
spring在ssh充當粘合劑,粘合struts-sping-hibernate,主要用來進行事物的控制,hibernate-充當數據庫持久層,主要用它來與數據庫交互,提高開發效率,減輕程序員sql控制要求,而且hibernate通過反射機制,有靈活的映射性,還支持各種關系,一對一,一對多,多對多。
在進行ssh整合的時候,我們應該注意: 1.Action繼承于ActionSupport 引入struts-spring-plugin.jar包,從而完成struts和spring的整合
在struts2的action中注入service,保證service的名字和配置文件中的一致,并生成get,set方法
30
Dao層繼承于hibernateDaoSupport 在dao層的配置文件中注入sessionFactory
二十二、防止表單重復提交
針對于重復提交的整體解決方案: 1.用redirect來解決重復提交的問題 2.點擊一次之后,按鈕失效 3.通過loading 4.自定義重復提交過濾器 5.解決struts2重復提交
可以結合s:token標簽來解決重復提交問題
利用token的原理:
1.在前端的jsp頁面中加入s:token標簽,在訪問該頁面時就會生成 隱藏域,該隱藏域中包含一個隨機生成的字符串,并把該字符串
存入session中
2.在struts2的配置文件中加入token攔截器后,當正常訪問action 的時候,會從session中取出該字符串,然后和頁面隱藏域中提交 字符串做對比,如果一致則正常執行并刪除session中存儲的字符串。
二十三、JSP標簽:
1.JSP include動作
jsp:include 動作
以“
2.JSP指令:<%@ include%><%@
%>
以“<%@ ” 開始,以“%> ” 結束。比如:
<%@ include file = “ Filename” %> 3.JSP輸出表達式:<%= %><%=Java表達式 %>
輸出變量的值,后邊不能加<%=;%> 4.JSP Scriptlet【腳本】:<%;%> <% Java 代碼 %>
例子:
<% Calendar now = Calendar.getInstance();%> 5.JSP聲明:<%!%> <%!函數或者方法 %>
例子:
<%!String getHello(String name){ return “Hi,” + name + “!”;}
%> 6.迭代標簽:
Jstl中的核心標簽(core)7.JSP注釋:
<%--這也是注釋,但客戶端不能查看到--%> 8.el表達式:${} 9.jsp:include動作是在運行時動態包含。
@include指令是在編譯時包含。
它們兩個都只能包含本項目的相關文件,不能包含其他項目的。
如果要包含其他項目的文件可以使用c:import 二
十四、過濾器
filter的概述: filter是一個過濾器,用來在請求前和響應后進行數據的處理。
filter的生命周期是: 實例化--->初始化(init)-->進行過濾(doFilter)--->銷毀(destroy)-->釋放資源
一個Filter必須實現javax.servlet.Filter接口
在項目中我們通常通過filter進行編碼轉換,進行安全驗證,進行重復提交的判斷。
了解(不需要主動說)filter 相當于 攔截器 相當于Spring AOP servlet+jsp+javabean+jdbc+filter encode utf-8
二十五、攔截器的理解
什么是攔截器:
攔截器是AOP中的概念,它本身是一段代碼,可以通過定義“織入點”,來指定攔截器的代碼在“織入點”的前后執行,從而起到攔截的作用
正如上面 Struts2的Reference中講述的,Struts2的Interceptor,其攔截的對象是Action代碼,可以定義在Action代碼之前或者之后執行攔截器的代碼。在項目中,我們經常用來攔截通過非正常程序而進行的訪問
32
Struts2的攔截器和Servlet過濾器類似。在執行Action的execute方法之前,Struts2會首先執行在struts.xml中引用的攔截器,在執行完所有引用的攔截器的intercept方法后,會執行Action的execute方法。
其中intercept方法是攔截器的核心方法,所有安裝的攔截器都會調用之個方法。在Struts2中已經在struts-default.xml中預定義了一些自帶的攔截器,如timer、params等。如果在
標簽中繼承struts-default,則當前package就會自動擁有struts-default.xml中的所有配置。代碼如下:
...
攔截器是Struts2框架的核心,它主要完成解析請求參數、將請求參數賦值給Action屬性、執行數據校驗、文件上傳等工作
在struts-default.xml中有一個默認的引用,在默認情況下(也就是
同時可以減輕代碼冗余,提高重用率。
如果要求用戶密碼、權限等的驗證,就可以用自定義的攔截器進行密碼驗證和權限限制。對符合的登入者才跳轉到正確頁面。
二十六、Spring融入框架
我們通過在web.xml中配置ContextLoaderListener這個監聽器也加載 spring的配置文件,從而融入到項目框架中。
二十七、項目的部署方式
1、如果項目單獨部署到tomcat中的時候,應該看tomcat中的server.xml;
2、如果和eclipse結合使用進行項目部署的時候,應該看eclipse里面的server.xml.數據庫篇
一、JDBC連接數據庫步驟(以MYSQL為例)
1、加載JDBC驅動程序:
通過Class類的forName方法實現,并將驅動地址放進去
成功加載后,會將Driver類的實例注冊到DriverManager類中。
33
2、提供JDBC連接的URL、創建數據庫的連接
?要連接數據庫,需要向java.sql.DriverManager請求并獲得Connection對象,該對象就代表一個數據庫的連接。
?使用DriverManager的getConnectin()方法傳入指定的欲連接的數據庫的路徑、數 據庫的用戶名和密碼。
Connection con=DriverManager.getConnection(url , username , password);&&&:“jdbc:mysql://localhost/test?user=root&password=123&useUnicode=true&characterEncoding=utf-8”;
3、創建一個Statement
?要執行SQL語句,必須獲得java.sql.Statement實例
?執行靜態SQL語句。通常通過Statement實例實現。
?執行動態SQL語句。通常通過PreparedStatement實例實現。
String sql = “”;
Statement st = con.createStatement();
PreparedStatement pst = con.prepareStatement(sql);
4、執行SQL語句
Statement接口提供了executeQuery、executeUpdate、execute三種方法
executeQuery:執行select語句,返回ResultSet結果集
ResultSet rst = pst.executeQuery();
? executeUpdate:執行insert、update、delete語句
pst.executeUpdate();
5、關閉JDBC對象
操作完成以后要把所有使用的JDBC對象全都關閉,以釋放JDBC資源。
二、數據庫連接池
數據庫連接池的優點運行原理: 在我們不使用數據庫連接池的時候,每次訪問數據庫都需要創建連接,使用完成之后需要釋放關閉連接,而這樣是很耗費資源的。當我們使用 數據庫連接池的時候,在tomcat啟動的時候就創建了指定數量的連接,之后當我們程序使用的時候就直接從連接池里面取,而不需要創建,同理,當我們使用完的時候也不需要關閉連接,而是將連接返回到連接池中,供 其他請求繼續使用。
DBCP:比較穩定。C3P0: 性能比較高。
34
三、mysql的數據庫導入導出
配置:
首先找到mysql的安裝目錄,進入bin目錄下復制路徑 將mysql的bin目錄粘貼在計算機環境變量的path中 授權:
登錄mysql 將某張表的某個權限賦給某個用戶
grant [select,insert,update,delete,create,drop] on [databaseName].[tableName]
to [userName]@[userIP] identified by [?連接口令?]
grant select,insert,update,delete,create,drop on oa_ssh.user to root@[IP] identified by 'root';將所有庫的所有權限賦給某個用戶
grant all privileges on *.* to [userName]@[userIp] identified by [?連接口令?] grant all privileges on *.* to root@[IP] identified by ?root';將所有庫的所有權限賦給所有用戶
grant all privileges on *.* to root@'%' identified by ?root?;
導出本地數據庫:
mysqldump-u 用戶名-p 數據庫名 > 磁盤:導出的文件名(加后綴)
遠程導出數據庫:
mysqldump-h IP-u 用戶名-p 數據庫名稱 >導出的文件名(加后綴)
遠程導出數據表:
mysqldump-u root-p-d--add-drop-table 數據庫名稱 > 導出文件
名(加后綴)
導入數據:
mysql-u root-p登錄成功后 ==》 source 磁盤:導入的文件名(加后綴)
四、jdbc分段批量提交的時候出現異常怎么處理?
通過Map來解決性能問題。首先在分段批量提交的時候,我們不采用事務,這樣就保證了合法的數據就自動提交,不合法的數據就自己自動進行回滾,為了避免不合法數據影響后續合法數據的提交,采用定義業務規則字典表,實現對數據的驗證,將不合法的數據記錄下來,供用戶進行后續處理,而合法的數據就全部提交。
五、jdbc批量處理數據
批量處理數據:(代碼優化:提高程序執行性能)
35
降低了java程序代碼(客戶端)和數據庫之間的 網絡通信的次數。
在jdbc中進行批量插入的核心API為 addBatch,executeBatch
大數據量的插入問題:(jdbc,hibernate,ibatis)
1.每次只插入一條和數據庫交互多次(很耗時間)
2.批量插入和數據庫只交互一次(內存溢出)
3.分段批量插入(推薦)
jdbc批量處理數據是通過PreparedStatement對象的 addbatch(), executebatch()clearbatch()進行和數據庫的交互。通常我們使用分段批量處理的方式 這樣可以提高程序的性能,防止內存溢出。
1.每個sql語句都和數據庫交互一次(非批量操作)2.只和數據庫交互一次(批量操作)(內存溢出)當數據達到一定額度的時候就和數據庫進行交互,分多次進行(分段批量操作)
(500或者1000)pst.addBatch();if(i > 0 && i%1000 == 0){
pst.executeBatch();
pst.clearBatch();}
六、Oracle分頁
select * from(select * from(select s.*,rownum rn from student s)where rn<=5)where rn>0
七、Oracle的基本數據類型
Oracle的基本數據類型(常用):
1、字符型
Char 固定長度字符串
占2000個字節 Varchar2 可變長度字符串 占4000個字節
Nvarchar2 占2000個字符(最多能存2000個字母/中文)
2、大對象型(lob)
Blob :二進制數據 最大長度4G Blob 用于存一些圖片,視頻,文件。
36
比如:當我們在進行文件上傳時,我們一般把上傳的文件存在硬盤上,可以不占用 數據庫,下載時,如果項目遷移時,文件也要跟著遷移。因此我們可以把用blob把它存在數據庫中。但這樣也增加了數據庫的負擔。
Clob :字符數據 最大長度4G,可以存大字符串
varchar2和nvarchar2都具有一定的局限性,它們長度有限,但數據庫中無論用varchar2或nvarchar2類型,還是用clob,在java端都使用String接收。
3、數值型
Integer 整數類型,小的整數。Float 浮點數類型。Real 實數類型。
Number(p,s)包含小數位的數值類型。P表示精度,s表示小數后的位數。
Eg: number(10,2)表示小數點之前可有8位數字,小數點后有2位。
4、日期類型
Date 日期(日-月-年)DD-MM-YY(HH-MI-SS)Timestamp 跟date比 它可以精確到微秒。精確范圍0~9 默認為6.八、id、rowid、rownum的區別
rowid物理位置的唯一標識。
而id是邏輯上的唯一標識,所以rowid查找速度要快于id,是目前最快的定位一條記錄的方式
rowid和rownum都是”偽數列“ 所謂“偽數列”也就是默認隱藏的一個數列。rownum用于標記結果集中結果順序的一個字段,它的特點是按順序標記,而且是連續的,換句話說就是只有有rownum=1的記錄,才可能有rownum=2的記錄。rownum關鍵字只能和<或者<=直接關聯 如果是>或者=則需要給他起個別名
九、主鍵和唯一索引的區別?
在創建主鍵的同時會生成對應的唯一索引,主鍵在保證數據唯一性的同時不允許為
空,而唯一可以有一個為空數據項,一個表中只能有一個主鍵,但是一個主鍵可以
有多個字段,一個表中可以有多個唯一索引。
十、Preparedstatement和statement的區別
用Prepared statement進行開發。Prepared statement是預編譯的,而statement不是,在每次執行sql語句的增刪改時,如果是一條數據兩者沒差距,但如果數據量大于1,那么每次執行sql語句statement都要重新編譯一次,而Prepared statement不用,Prepared statement的運行效率大于statement;從代碼的可維護性和可讀性來說,雖然
37
用Prepared statement來代替statement會使代碼多出幾行,但這樣的代碼無論從可讀性還是可維護性來說,都比直接使用statement的代碼高很多檔次;最重要的一點,從安全角度來說,使用Prepared statement可以大大提高程序的安全性,因為Prepared statement是用???傳參,可以防止sql注入,具有安全性,而statement用的是?+?字符串拼接,安全性較低。
十一、數據庫三范式
第一范式:數據庫表中的所有字段值都是不可分解的原子值。
第二范式:需要確保數據庫表中的每一列都和主鍵相關,而不能只與主鍵的某一部
分相關(主要針對聯合主鍵而言)
第三范式:需要確保數據表中的每一列數據都和主鍵直接相關,而不能間接相關
十二、視圖概述
視圖可以視為“虛擬表”或“存儲的查詢”
創建視圖所依據的表稱為“基表”
視圖的優點:
提供了另外一種級別的表安全性:隱藏了一些關鍵的字段
簡化的用戶的SQL命令
隔離基表結構的改變
十三、存儲過程概述
存儲過程(Stored Procedure)
可以包含邏輯判斷的sql語句集合。
是經過預編譯,存在于數據庫中。
通過調用指定存儲過程的名字(可有參,可無參)來執行。優點:
簡化了復雜的業務邏輯,根據需要可重復使用
屏蔽了底層細節,不暴露表信息即可完成操作
降低網絡的通信量,多條語句可以封裝成一個存儲過程來執行
設置訪問權限來提高安全性
提高執行效率,因為它是預編譯以及存儲在數據庫中 缺點:
可移植性差,相同的存儲過程并不能跨多個數據庫進行操作
大量使用存儲過程后,首先會使服務器壓力增大,而且維護難度逐漸增加
存儲過程的語法:
--下面是在oracle數據庫下最基本的語法
38
--僅創建一個名為testProcedure 的無參的存儲過程--IS也可以是AS--如果已經存在名為 testProcedure 的存儲過程,下面的語法會出現 名稱已被使用的錯誤
--解決辦法:
--第一句可以寫成 create or replace procedure testProcedure--這樣會替換原有的存儲過程
--NULL表示任何可以正確執行的sql 語句,但至少一句
create procedure testProcedure IS BEGIN
NULL
END;
存儲過程的參數的分類: IN OUT INOUT
注意:
存儲過程之間可相互調用
存儲過程一般修改后,立即生效。
十四、索引概述
1、索引的概念
索引就是為了提高數據的檢索速度。
數據庫的索引類似于書籍的索引。
在書籍中,索引允許用戶不必翻閱完整個書就能迅速地找到所需要的信息。
在數據庫中,索引也允許數據庫程序迅速地找到表中的數據,2、索引的優點
39 而不必掃描整個數據庫.1.創建唯一性索引,保證數據庫表中每一行數據的唯一性
2.大大加快數據的檢索速度,這也是創建索引的最主要的原因
3.減少磁盤IO(向字典一樣可以直接定位)
3、索引的缺點
1.創建索引和維護索引要耗費時間,這種時間隨著數據量的增加而增加
2.索引需要占用額外的物理空間
3.當對表中的數據進行增加、刪除和修改的時候,索引也要動態的維護,降低了數據的維護速度
4、索引的分類
1.普通索引和唯一性索引
普通索引:CREATE INDEX mycolumn_index ON mytable(myclumn)
唯一性索引:保證在索引列中的全部數據是唯一的
CREATE unique INDEX mycolumn_index ON mytable(myclumn)
2.單個索引和復合索引
單個索引:對單個字段建立索引
復合索引:又叫組合索引,在索引建立語句中同時包含多個字段名,最多16個字段
CREATE INDEX name_index ON userInfo(firstname,lastname)
3.順序索引,散列索引,位圖索引
40
十五、必背的sql語句
1:oracle 分頁
select * from(select t.*, rownum rn from(select * from menu order by id desc)t where
rownum < 10)where rn >=5
2: mysql 分頁
select * from music where id limit 5,5
3:oracle中如何快速將一張表的數據復制到另外一張表中(另外一張表不存在,另外一張
表存在,但數據為空)
1、.不存在另一張表時:
create table 新表
as select * from 將要復制的表
2、存在另一張表時:
insert into 新表名
select 字段
from 將要復制的表名
4:音樂專輯
查詢出special
Select s.id , min(s.sname),count(m.mid)from special s inner
join ms m on s.id=m.id group by s.id
5:快速刪除一張表(不可事物回滾,也就是沒有日志記錄)
TRUNCATE from 表名
6:inner join
select 查找信息 from 表名 1 inner join 表名2 on 表名1.列名 = 表名2.列名
7:left join
左外連接
select 查找信息 from 表名1 left join 表名2 on 表名1.列名 = 表名2.列名
8:right join
右外連接
select 查找信息 from 表名1 right join 表名2 on 表名1.列名 = 表名2.列名
41
9:oracle中查詢遍歷樹形結構(start with)
select * from extmenu
start with pid=1 connect by prior id = pid
快速刪除父節點以及父節點下的所有節點: Delete from extmenu where id in(elect * from extmenu
start with pid=1 connect by prior id = pid)
10:查詢出來60-70,80-90,95-100學生的信息
select * from stu where chengji between 60 and 70 or between 80 and 90 or between 95 and 100 select * from stu where chengji > 60 and chengji < 70 or chengji > 80 and chengji < 90 or chengji > 95 and chengji < 100
11:用exists替換in------進行聯表查詢
select * from dept where exists(select * from emp where emp.deptno=dept.deptno);或
select * from dept d inner join emp e on d.deptno = e.deptno(只查詢出兩表共同擁有的字段數據)
12:刪除表中的重復數據:
delete from xin a where a.rowid!=(select max(b.rowid)from xin b
where a.name = b.name);13:row_number(),rank()over,dense_rank()over 按工資排序
select sal,row_number()over(order by sal desc)rank1,rank()over(order by sal desc)rank,dense_rank()over(order by sal desc)drank
from emp
14:select * from(select emp.* from(dense_rank()over(partition by departNo order by sal desc)rk from emp)Where rk=4
42
十六、ibatis批量
this.getSqlMapClientTemplate().execute(new SqlMapClientCallback(){ public Object doInSqlMapClient(SqlMapExecutor executor)
throws SQLException {
executor.startBatch();
for(int i = 0, n = list.size();i < n;i++){
executor.insert(”productAttach.insertProductAttach“,list.get(i));
}
executor.executeBatch();
return null;} });
ibatis,jdbc,hibernate的分段的實現: 都應該在組裝list的時候進行拆分(如:action層加入)if(list.size()% 1000 == 0){ productAttachService.addBatch(list);list.clear();}
if(list.size()> 0)productAttachService.addBatch(list);
43
業務場景篇
一、Spring的概述
Spring 是完全面向接口的設計,降低程序耦合性,主要是事務控制并創建bean實例對象。在ssh整合時,充當黏合劑的作用。
IOC(Inversion of Control)控制反轉/依賴注入,又稱DI(Dependency Injection)(依賴注入)
IOC的作用:產生對象實例,所以它是基于工廠設計模式的
Spring IOC的注入
通過屬性進行注入,通過構造函數進行注入,注入對象數組
注入List集合 注入Map集合注入Properties類型
Spring IOC 自動綁定模式:
可以設置autowire按以下方式進行綁定
按byType只要類型一致會自動尋找,按byName自動按屬性名稱進行自動查找匹配.AOP 面向方面(切面)編程
AOP是OOP的延續,是Aspect Oriented Programming的縮寫,意思是面向方面(切面)編程。
注:OOP(Object-Oriented Programming)面向對象編程
AOP 主要應用于日志記錄,性能統計,安全控制,事務處理(項目中使用的)等方面。
Spring中實現AOP技術:
在Spring中可以通過代理模式來實現AOP
代理模式分為
靜態代理:一個接口,分別有一個真實實現和一個代理實現。
動態代理:通過代理類的代理,接口和實現類之間可以不直接發生聯系,而
可以在運行期(Runtime)實現動態關聯。
動態代理有兩種實現方式,可以通過jdk的動態代理實現也可以通過cglib
來實現而AOP默認是通過jdk的動態代理來實現的。jdk的動態代理必須要有
接口的支持,而cglib不需要,它是基于類的。
Spring AOP事務的描述:
在spring-common.xml里通過
如:對add* ,delete*,update*等開頭的方法進行事務攔截。我們需 44
要配置事務的傳播(propagation=”REQUIRED“)特性,通常把增,刪,改以外的操作需要配置成只讀事務(read-only=”true“).只讀事務可以提高性能。之后引入tx:advice,在tx:advice引用 transactionManager(事務管理),在事務管理里再引入sessionFactory,sessionFactory注入 dataSource,最后通過
Spring實現ioc控制反轉描述:
原來需要我們自己進行bean的創建以及注入,而現在交給 spring容器去完成bean的創建以及注入。
所謂的“控制反轉”就是 對象控制權的轉移,從程序代碼本身轉移到了外部容器。
官方解釋: 控制反轉即IoC(Inversion of Control),它把傳統上由程序代碼直接操控的對象的調用權交給容器,通過容器來實現對象組件的裝配和管理。
所謂的“控制反轉”概念就是對組件對象控制權的轉移,從程序代碼本身轉移到了外部容器。
二、事務概述
在數據庫中,所謂事務是指一組邏輯操作單元即一組sql語句。當這個單元中的一部分操作失敗,整個事務回滾,只有全部正確才完成提交。
事務的ACID屬性
1.原子性(Atomicity)
原子性是指事務是一個不可分割的工作單位,事務中的操作要么都發生,要么都不發生。
2.一致性(Consistency)
事務必須使數據庫從一個一致性狀態變換到另外一個一致性狀態。(數據不被破壞)
3.隔離性(Isolation)
事務的隔離性是指一個事務的執行不能被其他事務干擾.4.持久性(Durability)
持久性是指一個事務一旦被提交,它對數據庫中數據的改變就是永久性的.在JDBC中,45
事務默認是自動提交的,每次執行一個 SQL 語句時,如果執行成功,就會向數據庫自動提交,而不能回滾
為了讓多個 SQL 語句作為一個事務執行:
(1)執行語句前調用 Connection 對象的 setAutoCommit(false);
以取消自動提交事務
(2)在所有的 SQL 語句都成功執行后,調用 commit();方法提交事務(3)在出現異常時,調用 rollback();方法回滾事務。
三、權限概述
權限涉及到5張表:
用戶表,角色表,權限表(菜單表),用戶角色關聯表,角色權限關聯表
當用戶登錄時,根據用戶名和密碼到用戶表驗證信息是否合法,如果合法 則獲取用戶信息,之后根據用戶id再到用戶角色關聯表中得到相關連的角色
id集合,之后根據角色id再到角色權限關聯表中獲取該角色所擁有的權限id集合,然后再根據權限id集合到權限表(菜單表)中獲取具體的菜單,展現給當前 登錄用戶,從而達到不同用用戶看到不同的菜單權限。
我們通過ZTree來給角色賦權并且通過ZTree來展示菜單,以及通過ZTree來管 理菜單即增加和編輯菜單。
我們做的權限控制到url級別,為了防止用戶不登錄直接輸入url訪問的這個弊端,通過攔截器進行攔截驗證。
四、OSCache業務場景
在我以前的項目中,我們考慮了系統性能問題,這個時候我們采用了Oscache緩存,剛開始把這個功能交給了項目組中的另外一個同事來做的,但是他做完的時候他發現緩存中明明已經緩存了數據,但是在取得時候發現沒有數據,我們項目經理讓我去幫忙看看這個問題,我閱讀完他的代碼之后,我發現了他每次緩存的時候都是調用一個新的緩存對象的方法,結果出現了明明已經走了緩存的方法而取不到數據的問題,通過我多年的工作經驗,我就想到了應該用單例模式去封裝一個單例工具類來調用oscache。但是,在后來的測試過程中,發現當并發訪問的時候也會出現上述的問題,這個時候我直接采取的DCL(雙重判定鎖)單例模式封裝了工具類,既解決了線程安全問題,相對的性能問題也考慮到了,這個問題才得到了完善的解決。
46
五、線程概述
線程的狀態以及狀態之間的相互轉換:
1、新建狀態(New):新創建了一個線程對象。
2、就緒狀態(Runnable):線程對象創建后,其他線程調用了該對象的start()方法。該狀態的線程位于可運行線程池中,變得可運行,等待獲取CPU的使用權。
3、運行狀態(Running):就緒狀態的線程獲取了CPU,執行程序代碼。
4、阻塞狀態(Blocked):阻塞狀態是線程因為某種原因放棄CPU使用權,暫時停止運行。直到線程進入就緒狀態,才有機會轉到運行狀態。阻塞的情況分三種:
(一)、等待阻塞:運行的線程執行wait()方法,JVM會把該線程放入等待池中。
(二)、同步阻塞:運行的線程在獲取對象的同步鎖時,若該同步鎖被別的線程占用,則JVM會把該線程放入鎖池中。
(三)、其他阻塞:運行的線程執行sleep()或join()方法,或者發出了I/O請求時,JVM會把該線程置為阻塞狀態。當sleep()狀態超時、join()等待線程終止或者超時、或者I/O處理完畢時,線程重新轉入就緒狀態。
5、死亡狀態(Dead):線程執行完了或者因異常退出了run()方法,該線程結束生命周期。
實現線程的兩種方式:
是繼承Thread類或實現Runnable接口,但不管怎樣,當new了這個對象后,線程就已經進入了初始狀態 wait和sleep的區別:
線程訪問:
鎖池狀態,之后等待鎖釋放,然后訪問代碼
wait
等待隊列(釋放資源)--->調用notify或者notifyall之后鎖池狀態--->(等待鎖釋放)--->可運行狀態--->運行狀態---->訪問代碼
sleep,join
不釋放資源-->結束后直接進入可運行狀態--->運行狀態---->訪問代碼
一個java控制臺程序,默認運行兩個線程,一個主線程,一個垃圾回收線程。線程與進程的區別:
1.線程(Thread)與進程(Process)進程定義的是應用程序與應用程序之間的邊界,通常來說一個進程就代表一個與之對應
的應用程序。不同的進程之間不能共享代碼和數據空間,而同一進程的不同線程可以共
享代碼和數據空間。
2.一個進程可以包括若干個線程,同時創建多個線程來完成某項任務,便是多線程。
六、Ajax請求Session超時問題
我在做項目時有時會遇到session超時問題,如果session超時,平常請求沒有什么問題,通過攔截器可以正確跳到登陸頁面,可是你如果用ajax請求的話這就出現問題了,因為ajax是異步的,局部刷新,所以登陸界面不會再全頁面中顯示,他只會顯示到頁面的一部分當中。所以根據我這幾年的經驗找到了我認為比較好的一種方法。因為那我用的框架是和struts2集成的,所以就在攔截器中進行設置:
47
首先判斷session是否為空就是判斷session是否超時,如果超時就取出請求的head頭信息request.getHeader(”x-requested-with“),如果不為空就和XMLHttpRequest(Ajax標識)進行比較(request.getHeader(”x-requested-with“).equalsIgnoreCase(”XMLHttpRequest“)))如果相等說明此請求是ajax請求。
如果是ajax請求就可以用response.setHeader(”鍵“,”值“)來設置一個標識來告訴用戶這是ajax請求并且session超時時發出的,這樣我就可以在回調函數中取出自己設置的那個唯一標識:XMLHttpRequest.getResponseHeader(”“);如果取出的值是和自己在后臺中設置的值一樣的話,就證明session已經超時,這樣就可以設置window.location.replace(”登陸界面"),來跳轉到登陸界面了。
這樣做雖然解決了問題,但是,會在每個回調函數中寫入那些代碼,這樣的話代碼就會顯得特別零散,所以就想能不能定義一個全局的設置所以就找到了jqery的ajaxSetUp方法,通過ajaxSetUp對jqery的ajax進行全局的判斷(ajaxSetUp就相當于ajax的攔截器),通過設置ajaxSetUp里的complete,它就相當于回調函數,這樣那就彌補了上一方法的不足。我做項目時還用到$(document).ajaxStart(),這是ajax請求時的事件;$(document).ajaxSuccess(),這是AJAX請求成功后的事件。我一般用他們來顯示遮罩層和隱藏遮罩層用的加遮罩層是為了不讓用戶重復提交,更提高了用戶體驗度,讓用戶知道已經提交了。
七:java線程池概述
java線程池的工作原理和數據庫連接池的差不多,因為每次重新創建線程 都是很耗資源的操作,所以我們可以建立一個線程池,這樣當需要用到線程 進行某些操作時,就可以直接去線程池里面找到空閑的線程,這樣就可以直接 使用,而不用等到用到的時候再去創建,用完之后可以把該線程重新放入線程池 供其他請求使用從而提高應用程序的性能。
線程池的核心流程: 1.構建一個 ThreadPoolExecutor 并指定默認要創建的線程的數量 2.通過 threadPool.execute()去添加一個個要執行的線程即實現了Runable接口的java類
3.在實現了Runable接口的java類的run方法中寫入具體的業務代碼 線程池的業務場景:
我在工作的時候,當時一個同事給我提了一個需求,目前有大量的圖片 需要處理生產縮略圖并進行加水印,因為按照普通的處理方法一個個的 進行處理太慢了,問我有沒有好的解決方案,這個時候我就想到了java中 的線程池,我構建了一個線程數為5個線程池,然后采用分段批量提取的
方式每500條為一組數據進行圖片信息的提取,然后再把這些通過Threadpool的 execute方法交給線程池中的線程進行處理,即充分使用了CPU硬件資源又加快 了大數據情況下程序的處理效率。
48
我當時在工作的過程中,認識一個做電商的朋友,他們當時公司才起步,很多 技術都不成熟,所以就常常和我探討一些技術問題,有次他向我請教一個問題,問我如何才能提高網站的性能,我根據自己在項目中的經驗以及自己以前閱讀的
關于優化方面的資料給他提出了很多建議,如用lucene進行全文檢索,用memcached 進行分布式緩存,以及通過spring定時器結合freeMarker模板引擎來生成靜態 頁面,由于要生成的頁面的數量比較多,考慮到程序的性能,我建議他結合 java的線程池進行工作,這樣就可以充分使用了CPU硬件資源又加快 了大數據情況下程序的處理效率。
八、OSCache概述
oscache是一個高性能的j2ee框架,可以和任何java代碼進行集成,并且還可以通過標簽對頁面內容進行緩存,還以緩存請求。
我們通常將那些頻繁訪問但是又不是經常改變的數據進行緩存。為了保證緩存數據的有效性,在數據發生改變的時候,我們要刷新緩存,避免臟數據的出現。刷新緩存的策略有兩種,一種是定時刷新,一種手動刷新。
緩存數據的時機通常也分為兩種,即在tomcat(web容器)啟動時候加載數據進行緩存,另外也可以在用戶第一次訪問數據的時候進行緩存,這個相當于緩存的立即加載和按需加載。
緩存的層次如下:jsp-->action-->service-->dao,緩存越靠前對性能的提升越大
一個action里面可以有多個service,一個service中可以有多個dao或者多個service
任何類之間都可以進行相互調用,可以通過構造函數傳參,set,get傳參或者是方法傳
參將相關的類連接起來。
九、OSCache+autocomplete+單例業務場景
在我以前做某項目的過程中,其中我們在做產品列表的查詢的時候為了提高用戶的體驗度,我們使用了autocomplete插件來代替select進行品牌的選擇,才開始的時候每次都要根據用戶輸入的信息去查詢數據庫進行模糊匹配返回結果,后來我們考慮到系統的性能,因此我們采用了oscache緩存,才開始這個功能是交給我們項目組中的另外一個同事來做的,但是他做完后,我們在使用這個工具類的時候,發現有時緩存中明明已經有時我們需要的數據,但是從緩存里面取的時候,發現沒有,之后項目經理讓我去幫這個同事看看這個問題,我經過閱讀他的代碼發現,它里面在使用緩存的時候,針對于每次方法的調用都產生一個新的實例,結果導致了上面的問題,這個時候我想起了可以使用設計模式中的單例模式來解決這個問題,才開始我直接采用了普通的單列模式,但是后來在測試的過程中,發現當用戶并發量大的時候還是會出現上面的問題,之后我再次考慮了代碼,最后發現是因為沒有給單列模式加鎖的原因,從而導致了大用戶并發的時候,線程安全的問題,之后我便在方法上加上了synchronized關鍵字,解決上述的問題,但是后來測試人員反饋,覺的這段的性能有問題,我考慮之后便采用在方法體內加鎖并結合雙重判定的方式解決了上面的問題。
49
我們是將數據在tomcat啟動的時候加載到緩存中,之后用戶進行查詢的時候直接從緩存中獲取數據,根據前綴匹配進行查詢,將結果返回給用戶。這樣在提高用戶體驗度的同時也提高性能。
十、緩存概述
應用程序為了提高性能,可以通過使用緩存來達到目的,緩存的存儲介質可以 內存或者硬盤,通常將數據存儲在內存里,確切的說是jvm的內存中,緩存是 基于Map這種思想構建的,以鍵值對的方式進行存取,之所以還可以將
緩存的數據存儲在硬盤中,是因為內存資源相當有限和寶貴,所以當內存資源 不足的時候,就可以將其存儲到硬盤中,雖然硬盤的存取速度比內存要慢,但是 因為減少了網絡通信量,所以還是提高程序的性能。緩存可以分為客戶端緩存和 服務器端緩存,所謂的客戶端緩存通常指的是IE瀏覽器的緩存,服務器端緩存指 的web服務器的緩存,通??梢酝ㄟ^第三方組件實現,如oscache,memcache
我們通常將那些頻繁訪問但是又不是經常改變的數據進行緩存。為了保證緩存數據的 有效性,在數據發生改變的時候,我們要刷新緩存,避免臟數據的出現。刷新緩存的 策略有兩種,一種是定時刷新,一種手動刷新。
緩存的層次如下:jsp-->action-->service(通常放置在service)-->dao, 緩存越靠前對性能的提升越大
緩存的策略:(緩存空間不足需要進行清理的時候使用)LRU:最近最少使用原則.(理解:存儲書)FIFO:先進先出的緩存策略.(理解:排隊)
你來說說緩存?說說你對緩存的理解(如果遇到重復的,就可以省略)
我們在項目中使用緩存的目的是為了提高應用程序的性能,減少訪問數據庫 的次數,從而提高應用程序的吞吐量。我們通常將權限,菜單,組織機構
這些頻繁訪問但是不經常改變的基礎數據進行緩存,其中我在做()某某項目的時候 就通過oscache對ZTree的樹形菜單進行了緩存,并且在做的時候和單列設計 模式進行結合,考慮到多線程下的安全問題,還對單例模式加入了雙重判定鎖 的檢查方式。
十一、實現頁面靜態化業務場景
我們在做某項目時,涉及到程序訪問的性能問題,這時候我們想到可以通過靜態化來提高用戶訪問時候的性能,所以我們就采用了freemarker模板引擎,考慮到頁面也是要有動態的變化的,所以我們采用spring定時器在每天晚上2點鐘的時候定時再次生成html靜態
50
第三篇:JAVA基礎知識點總結
1)開發Java語言的公司? Sun(Sun Microsystems)太陽微電子公司開發 2)
Java的3個版本?
J2SE(Java2 Standard Edition)標準版
J2EE(Java 2 Platform,Enterprise Edition)企業版 J2ME(Java 2 Micro Edition)微小版
在5.0以后新版本中稱作:JavaSE JavaEE JavaME 3)
Java語言的幾個主要特點?平臺無關性:能運行于不同的平臺上
安全性:去掉了指針操作,內存由操作系統分配 面向對象:利用類使程序更加利于維護
分布式:可以使用網絡文件和使用本機文件一樣容易 健壯性:檢查程序編譯和運行的錯誤 4)
Java的三大核心機制
虛擬機機制:利用虛擬機解釋字節碼執行java程序實現跨平臺 垃圾收集機制:自動內存回收
代碼安全性機制:加載代碼后校驗代碼后再執行代碼 第2章Java語言的開發環境 1)
JDK是什么?
JDK(Java Development Kit)Java開發工具包。包括了JRE,是開發Java的人員必備的開發運行Java程序的工具。2)
JRE是什么?
JRE(Java Runtime Environment)Java運行環境,運行JAVA程序所必須的環境的集合,包含JVM標準實現及Java核心類庫。3)
JVM是什么?
JVM(Java Virtual Machine)Java虛擬機,它是一個虛構出來的計算機,是通過在實際的計算機上仿真模擬各種計算機功能來實現的。4)
安裝JDK的操作系統問題?
必須針對于不同的操作系統下載安裝不同的JDK,例如windows下安裝針對于windows的JDK,linux下安裝針對于linux的JDK。
5)需要配置的相關環境變量? path:用于搜索外部命令,例如編譯程序的javac命令,執行程序的java命令
classpath:用于搜索類,即class文件,例如可以在不同的位置執行類文件 6)
配置環境變量的方式? 有兩種:臨時配置和持久配置
臨時配置:在命令行下用set 變量名=變量值,僅在當前命令行窗口有效
持久配置:在我的電腦——屬性中配置,持久有效 7)可以編寫Java程序的常見開發工具? 記事本,EditPlus,ULTRAEDIT,Eclipse,Jbuilder,NetBeans 8)
Java文件的類型?
有兩種:
擴展名為java的文件:是Java源文件,屬于編譯之前的純文本文件,存儲java源代碼。
擴展名為class的文件:是Java類文件,屬于編譯之后的二進制文件,存儲字節碼。9)
Java的編譯運行原理?
首先編寫java源文件,然后編譯成class類文件,然后通過虛擬機解釋成機器碼到硬件執行。
10)Java是編譯型語言還是解釋型的語言?
既不是完全編譯型,也不是完全解釋型,是半編譯半解釋的。第3章Java程序的基本結構 1)
Java語言區分大小寫嗎?
區分,不管是數據還是標識符或者關鍵字都區分大小寫,例如public不能寫成Public,“abc”不能寫成“ABC”,int i不能寫成INT I等等。2)main方法是作什么用處的? 這是程序的入口方法,是由虛擬機自動調用的。
3)語句必須用分號結束嗎? 必須的,但是代碼塊{}可以用分號結束,也可以不用分號結束
4)
Java中有幾種注釋,各自的功能
有三種:
單行注釋//:加在行首只能注釋一行 多行注釋/* */:注釋多行,但不能嵌套使用
文檔注釋/***/:用于生成HTML形式的文檔,需要配合javadoc命令實現 5)Java語言的數據類型是強類型還是弱類型? 是強類型,意味著每一個變量都必須明確聲明數據類型。6)
Java語言中數據類型的劃分?有什么區別? 分成基本類型和引用類型兩大類。
基本類型:有8種,只能存儲單一的值,不以對象的形式存在引用類型:除了基本類型之外其他的都是引用類型,能夠存儲復雜數據類型,以對象的形式存在 7)
基本類型都有哪8種類型? 布爾類型:boolean 占1字節 字符類型:char 占2字節
整型:byte 占1字節 short 占2字節 int 占4字節 long 占8字節
浮點型:float 占4字節double 占8字節 8)
布爾值可不可以用0或者非0數代替?
不可以,布爾值只能是true和false,不能使用數字,這和C語言是不一樣的。9)
直接寫個整數10默認是什么類型的?
整型的直接量例如10,100等默認的數據類型都是int型 10)如何讓一個整型的直接量變成long型的? 在直接量后面加大寫L后者小寫l,例如10L 11)整型數據在程序中直接使用可以使用什么進制? 10進制,8進制,16進制,但不能使用二進制 12)浮點運算在Java中有沒有誤差? 有誤差,所以精密運算請使用BigDecimal類 13)直接寫一個3.14的直接量是什么數據類型的?
是double型,如果想表示是float的3.14必須寫成3.14F或者3.14f,double型的3.14也可以寫成3.14D 14)char型采取的是什么類型的字符集?
是Unicode全球統一編碼,支持任何世界上官方的語言中的字符
15)常見的轉義字符有哪些? 轉義序列 名稱 b 退格 t 制表 n 換行 r
回車
” 雙引號 ’ 單引號 反斜杠
16)常見的Unicode字符對應的編碼?
大寫的A到Z是對應65到90,小寫的a到z是對應97到122,字符0到9是對應48到57
17)空字符是不是用’’(兩個并列的單引號)來表示? 不是,空字符用’u0000’來表示,兩個并列的單引號什么也不是。
18)點,分號,花括號的各自的作用?
點的作用有兩個:一個是使用類或對象中的成員,用對象.成員,再一個就是包名和子包名之間的分隔符,例如頂層包名.子包名 分號的作用是表示語句結束 花括號的作用是代表一個語句塊
19)語句和關鍵字之間可以有任意的空白嗎? 可以的,例如System.out.println(100);就是正確的語句,但是關鍵字本身不能加空白或換行
20)標識符是什么?
標識符就是指在程序中給包,類,接口,方法,變量起的名字 21)標識符有什么起名規則? 1. 應以字母、下劃線、美元符開頭 2. 后跟字母、下劃線、美元符或數字 3. 不能用關鍵字和保留字
4. 嚴格區分大小寫 5. 名稱長度沒有限制 22)中文的變量名可以嗎?
是可以的,例如 int 數字 = 10;這個語句是正確的。因為java中采取Unicode字符集,所以任何的Unicode中的字符都可以作為標識符的名稱,但考慮字符集的支持問題推薦還是使用英文字母命名。
23)關鍵字和保留字有區別嗎?
在1.5后沒有區別,都被稱作關鍵字,但是1.5之前認為關鍵字是在Java中有特殊用途的不允許編程人員擅自改作其他用途,而保留字是在Java中沒有特殊用途但不允許編程人員擅自改作其他用途,按此說法goto和const應該是此意義上的保留字。
24)true,false,null可以用作標識符命名嗎?
不可以,這3個雖然不是關鍵字,但都是有特殊用途的值,也不能作為標識符命名
25)一條聲明語句可以聲明多個變量嗎? 可以的,例如以下聲明都是正確的int i;int i,j;int i = 10,j;int i,j = 10;
int i = 10,j = 20;
26)變量在沒有賦值的情況下可以使用嗎?
不可以,變量沒有賦值使用會報出變量未初始化的編譯錯誤。27)常量有什么特點?
在聲明變量的時候加上final修飾符即為常量,表示這個變量只能被賦一次值。
28)算數運算符有哪些? 基本算數運算符有+-* / % ++--
29)單目運算符,雙目運算符,三目運算符都是什么意思? 其實也有叫一元運算符,雙元操作符,三元操作符的,指的是
有幾個操作數形成一個完整表達式,例如++就是一個單目運算符,只需要一個操作數就可以形成表達式,像i++,而+運算符就是雙目運算符,需要兩個操作數形成表達式,例如5 + 3,還有三目運算符,例如5 > 3 ? 0 :-1
30)++和--放在前面和放在后面有什么區別?
如果是在一個表達式中,那++放后面表示先運算表達式,然后再進行自增運算,如果在一個表達式中,++放前面,則表示先進行自增運算然后在運算表達式。--同樣道理。例如: int i = 10;int j = i ++;//先進行賦值運算然后再進行自增運算j的結果是10
int i = 10;
int j = ++ i;//先進行自增運算然后再進行賦值運算
j的結果是11
31)-5 % 2等于幾,5 %-2等于幾?
-5 % 2等于-1,5%-2等于1,運算得到是正數還是負數取決于第一個操作數的符號 32)5 / 2 結果是不是2.5?
不是,是2,因為5和2都是int類型,所以不可能得到double型的結果。
33)比較運算符有哪些?
有><>=<===!= 六項基本比較運算 34)任何數據類型都可以使用> < >= <=運算符嗎?
不是所有數據類型,例如true>false這個表達式就是編譯錯誤,布爾類型和引用類型的表達式只能用==和!=兩個比較運算,例如”abc” <= ”xyz” 這個表達式也是編譯錯誤的 35)’a’ > ’b’這個表達式編譯正確嗎?
編譯正確,’a’和’b’是字符類型,內部用Unicode編碼表示的話a是97,b是98,所以實際上比較的是97>98,結果為false 36)邏輯運算符有哪些?
有 &邏輯與,|邏輯或,!邏輯非,^ 異或,&& 短路與,||短路或
37)邏輯與,邏輯或和短路與,短路或有什么區別? 邏輯與和短路與的區別是: ?
如果是邏輯與&,不管第一個表達式是true還是false,都會執行第二個表達式,例如a > b & x < y,即使a > b為false,也會執行x > y ?
如果是短路與&&,如果第一個表達式為false,將不會執行第二個表達式
例如a > b && x < y,如果a > b為false,就不會執行x > y
以此類推,邏輯或和短路或的區別是:
? 如果是邏輯或|,不管第一個表達式是true還是false,都會執行第二個表達式 ?
如果是短路或||,如果第一個表達式為true,將不會執行
第二個表達式
38)與或非三個邏輯運算符的優先級是怎么排列的? “非”優先級最高,“與”其次,“或”優先級最低 39)原碼,反碼,補碼分別是什么意思? ?
原碼:將數字轉換為二進制,第一位為符號位,正數為0,負數為1
例如:12的原碼是00001100-12的原碼是10001100 ?
反碼:正數的反碼和原碼相同,負數的反碼將原碼符號位之外的位逐位取反
例如:12的反碼是00001100-12的反碼是11110011 ?
補碼:正數的補碼和原碼相同,負數的補碼將反碼加1 例如:12的補碼是00001100-12的補碼是11110100 最后強調一點,計算機存儲數據用補碼形式來存儲。40)位運算符都有哪些?
&與 |或 ^異或 ~非 >>右移 <<左移 >>>無符號右移 41)1<<35怎么理解?
1是int類型是32位,所以需要把35%32=3,所以事實上是和執行1<<3等價的42)數據類型轉換需要遵循什么原則?
小類型向大類型轉換,是自動轉換的,或者說隱式轉換的 大類型向小類型轉換,是需要強制轉換的,或者說顯式轉換例如:byte b = 1;
short s = b;//自動轉換
b =(byte)s;//強制轉換
43)byte b = 10這個語句是正確的,為什么10是int型比byte大還不需要強制轉換呢?
因為在java中做了特殊處理,其中規定byte,short,char類型可以直接賦予int類型的直接量,例如: byte b = 10;short s = 10;char c = 10;
以上賦值語句都是正確的。
但是不能超出超出類型的范圍,例如以下賦值就是錯誤的: byte b = 128;
如果超出范圍,必須得作強制轉換,例如以下語句是正確的: byte b =(byte)128;
需要強調的是,必須是int類型的直接量,以下語句就是錯誤的: byte b = 10L;
10L不是int類型的直接量。
44)byte b =(byte)300;強制轉換后的結果是44,是按照什么規律得出來的?
是先把300轉換成二進制,然后根據byte類型的大小截取了后8個位
300的補碼是00000000 00000000 00000001 00101100
b的結果是:00000000 00000000 00000001 00101100 結果為44 45)byte b =(byte)true;這個轉換成立嗎?
不成立,布爾值和數字是不兼容的,不能作任何轉換。
46)int i =(int)“100”;這個轉換成立嗎?
不成立,引用類型和基本類型是不能直接強制轉換的,需要用包裝類的方法來轉換。
47)char型和short型哪個比較大?
不能說哪個大,哪個小,這兩個類型char的取值是從0~65535,而short類型的取值是-32768~32767,這個兩個類型之間的轉換都需要強制轉換。
48)字符串是不是基本類型?
不是,String是java.lang包中的一個類,是引用類型的,8種基本類型中沒有一個是String類型。49)空字符串用什么來表示?
用””(兩個并列的雙引號)表示,代表0個長度的字符串對象。50)String s = “”;和String s = null;有什么區別?
第一個表示s被賦值,指向了一個字符串對象,第二個表示s沒有指向任何對象實例,是真空
51)兩個字符串用什么運算符可以連成一個字符串? 用+運算符,例如”abc” + “xyz”最后的結果就是“abcxyz” 52)數學運算符加法和字符串連接符都是+,怎么區分? 是通過運算符兩邊的操作數來判斷的,如果兩邊的操作數都是數字型的基本類型,則進行數學運算,如果兩邊的操作數有一個是字符串,則把另一個操作數也轉換為則進行字符串連接運算。例如:+ 4 的結果是9 “5” + 4的結果是54
53)判斷字符串內容相同用什么方法?
用equals方法判斷內容相同,==只能判斷引用是否相同 54)提供用戶輸入使用哪個類 使用javav.util.Scanner類
55)if語句可以用if(-1)形式判斷嗎? 不可以,數字不能代替布爾值
56)if語句和循環語句的花括號什么時候可以省略?
當執行的語句只有一句的時候 57)switch語句有哪些規則?
表達式expr的返回值必須是下述幾種類型之一:int, byte, char, short或枚舉常量;
case子句中的值必須是常量,且所有case子句中的值應是不同的,也必須是下述幾種類型之一:int, byte, char, short或枚舉常量
default子句是任選的;
break語句用來在執行完一個case分支后使程序跳出switch語句塊;
58)對于退出循環break和continue有什么區別? break是退出整個循環
continue是退出當前循環繼續下一次循環 59)聲明數組創建數組的方法? 以下聲明都是合法的: int [] a;int a[];String[] a;
以下創建數組對象都是合法的: int[] a = new int[3];int[] a = {1,2,3};int[] a = new int[] {1,2,3};
60)int[] x和String[] s這兩個數組對象,哪個是基本類型,哪個是引用類型?
兩個都是數組對象,都是引用類型的61)數組元素下標最小是多少,最大是多少,超出范圍會怎么樣?
最小是0,最大是數組元素個數減一,超出范圍將會出現下標越界異常
62)得到數組長度用length屬性還是length()方法? 是length屬性,得到字符串長度才有length方法
63)聲明int[][] a = new int[3][],a是一個二維數組,a[0]本身
是什么類型的?
二維數組的元素都是一維數組,a[0]是int[]類型的 64)數組的大小一經創建可不可以改變大小了? 不可以,數組是定長的,一經創建就不能再改變大小了 65)可以把2個int型,3個double型,4個String型的值放到一個數組中嗎?
不可以,數組的元素類型必須是相同類型的。66)java中的多維數組必須是要形成矩陣排列嗎? 不一定,也可以是不規則的。67)操作數組比較方便的實用類?
java.util.Arrays類提供了很多關于數組的實用方法。第4章對象和類 1)OOP是什么意思? Object Oriented Programming(面向對象編程)
2)
類和對象的區別?
類:對象的藍圖,生成對象的模板,是對一類事物的描述,是抽象的概念上的定義
對象:對象是實際存在的該類事物的每個個體,因而也稱為實例 3)
類之間的3種關系? 依賴關系(uses-a)聚集關系(has-a)繼承關系(is-a)4)
一個java源文件可以寫多個類嗎?
可以,但必須只能有一個公有類,并且文件名和公有類的類名相同。5)類中有哪些成員?
有屬性(數據域),方法,構造器(構造方法)
6)
構造方法和普通方法的區別?
構造方法沒有返回值,方法名必須和類名相同,需要用new語句調用構造方法。7)
普通方法可不可以也類名作為方法名?
是可以的,因為調用普通方法的語法和調用構造器的語法不一樣。8)
一個構造器調用另外一個構造器需要用什么語法? 用this()語法調用另外一個重載構造器,需要注意的是調用語句必須是構造器中的第一句 9)
什么時候虛擬機會自動添加一個默認構造器?
當類中沒有顯式定義任何構造器的時候,虛擬機會自動添加一個無參的構造器
10)實例成員和靜態成員的區別?
實例成員:是屬于對象實例的,用對象.成員名稱語法調用 靜態成員:和對象實例無關,是屬于類本身的,用類名.成員名稱語法調用
11)靜態初始化塊statci{}的執行時機是什么時候? 在類被加載的時候,僅執行一次。
12)靜態方法可不可以直接調用同一個類中的非靜態方法? 不可以,靜態方法不能直接調用一個非靜態成員,需要用對象調用。
13)包是什么?
包實際上就是物理上的文件夾,可以把類放到不同的包中。14)把一個類放到包中,需要在類中加上什么語句? 需要加上包聲明package語句,必須寫在源文件的第一句。15)什么時候需要導入類?用什么語句?
當使用的類和當前類并不在同一個包中的時候,用import語句導入。
16)默認包中的類可以導入嗎?
不可以,不在默認包中的類無法使用默認包中的類。17)java中哪個包中的類是自動導入的? java.lang包
18)什么叫做完整類名? 頂層包名.子包名.類名
19)靜態導入語句有什么作用?
在使用類中的靜態成員的時候前面不需要加類名前綴。
20)局部變量和全局變量的區別? 區別 局部變量 全局變量
聲明位置 方法或塊內部 方法外類內部 訪問權限修飾符 沒有訪問權限 有訪問權限
默認值 沒有默認值
有默認值
使用形式 直接使用 對象調用
作用域
在方法或語句塊內部 整個類
生命周期 進入方法或語句塊創建退出方法或語句塊銷毀 隨著對象的創建而創建隨著對象的銷毀而銷毀
21)賦值語句賦給目標的是值還是引用?
如果是基本類型則賦的是值本身,引用類型則賦的是引用地址 第5章繼承和多態 1)類的繼承是誰繼承誰?
是子類繼承了父類,子類也稱為派生類,父類也稱為超類或基
類 2)子類繼承了父類的什么東西?
子類可以繼承父類的數據域(屬性),方法,但構造器不能繼
承 3)
私有成員能被子類繼承嗎?
能繼承,但是由于訪問權限的控制,在子類中不能直接使用父類的私有成員 4)
Object是什么類?
這個所有類的根類,任何類如果沒有寫顯式的繼承語句,默認都是直接繼承Object類的 5)java中是單繼承還是多繼承?
是單繼承,一個子類只能有一個父類 6)
訪問權限修飾符有幾種,訪問的范圍又是多大? 有四種:
private:私用 只能在被類中被訪問 default:默認 只能被同一個包中的類訪問
protected:受保護的 只能被同一個包中的類和不同包中的子類
訪問
public:公有 可以被任何類訪問 7)
覆蓋方法的規則有哪些?
子類覆蓋方法和父類被覆蓋方法的方法返回類型,方法名稱,參數列表必須相同
子類覆蓋方法的訪問權限必須大于等于父類的方法的訪問權限
方法覆蓋只能存在于子類和父類之間
子類覆蓋方法不能比父類被覆蓋方法拋出更多異常 8)
參數列表是否相同從哪幾方面看?
從三方面看:參數個數,類型和順序,需要注意的是參數的名字不相同是無所謂的 9)
覆蓋方法的規則有哪些? 方法名相同
方法的參數類型,個數,順序至少有一項不同 方法的返回類型和修飾符均不受限制
10)可變長參數的聲明格式是什么?實際上是什么類型的? 類型 ? 變量,實際上是一個一維數組 11)this和super是作什么用處的?
this:本身代表當前的對象引用,可以用this.成員名稱調用當前對象的屬性和方法,如果屬性和局部變量重名,可以用this.屬性名和局部變量區分開。也可以用this()語法調用本類重載構造器。
super:本事是一個特殊關鍵字,可以用super.成員名稱調用從父類繼承的屬性和方法,也可以用super()語法調用父類構造器。
12)super代表子類中的父類對象引用嗎?
不,這個錯誤的說法,super不代表任何對象引用,僅僅是一個關鍵字
13)什么時候子類構造器會自動調用父類無參構造器? 當子類構造器中沒有任何顯式構造器調用的時候,即既沒有this()調用也沒有super()調用的時候
14)一個父類類型的引用變量可以引用一個子類的實例嗎? 可以,這個引用變量是一個多態對象 15)多態對象有什么特點?
多態對象只能使用父類的成員,但如果多態對象使用了被子類覆蓋的方法,則會動態綁定使用子類的成員,稱為虛擬方法調用
16)引用類型之間的類型轉換需要遵循哪些規則? 自動轉換:從子類到父類的類型可以自動轉換 強制轉換:從父類到子類的類型要強制轉換 無繼承關系的類型轉換是非法的 17)instanceof操作符是作什么用處的?
可以判斷一個對象的類型是否是某一個類的類型或子類,也可以判斷這個對象的類型是否是一個接口的實現類 18)toString方法什么時候會自動被調用?
在打印語句中傳入引用類型的對象或者對象和字符串作連接時
19)默認的equals方法實現的是比較內容還是比較引用地址?
在Object中是比較引用地址。
20)覆蓋equals方法和hashCode方法有什么規則? 必須保證當兩個對象equals比較為true的時候,返回的hashCode相同,當比較為false的時候,返回的hashCode不同21)java中有幾個包裝類?
有8個包裝類,正好對應8種基本數據類型。
分別是:Boolean Byte Short Integer Long Character Float Double 22)裝箱和拆箱分別是什么意思?
裝箱指的是把基本類型包裝成包裝類的引用類型 拆箱指的是把包裝類形式的引用類型轉換為基本類型 例如:
Integer objInt = new Integer(10);//裝箱
int i = objInt.intValue();
//拆箱
23)JDK1.4和1.5的裝箱和拆箱有什么區別?
自動拆裝箱,例如: Integer intObj = 10;//自動裝箱 int i = intObj + 5;//自動拆箱
24)final修飾符如何使用,使用了final修飾符有什么特點? final修飾符可以修飾類,方法,變量 final類為最終類,不能被子類繼承 final方法為最終方法,不能被子類覆蓋 final變量為常量,只能賦一次值
25)abstract修飾符如何使用,使用了abstract修飾符有什么特點?
abstract修飾符可以修飾類和方法 abstract類為抽象類,是不能創建對象的abstract方法為抽象方法,只有方法的聲明,沒有具體的實現 需要注意的是:
有抽象方法的類一定是抽象類 抽象類不一定有抽象方法
抽象類也有構造器,但不能創建對象實例 26)abstract不能和哪些修飾符配合使用? 不能和private,static,final一起使用 27)可以在非抽象方法中調用抽象方法嗎? 可以,模板方法設計模式就是典型的這種調用 第6章 泛型程序設計 1)泛型的特點是什么? 主要特點是類型參數化,后期綁定數據類型 2)泛型支持基本類型嗎?
不支持,只支持引用類型 3)如果沒有傳入類型參數,默認是什么類型? 默認是Object類型
4)泛型方法有什么特點?
將泛型參數聲明在方法中,調用方法的時候綁定泛型 5)
泛型類聲明泛型參數的時候,
么意思?
表示綁定的類型必須是A類型后者是A類型的子類或實現類 第7章 接口和內部類
1)聲明一個接口的關鍵字是什么? interface關鍵字
2)
接口中的成員有什么特點?
數據域必須是(public static final修飾)公有靜態常量 方法必須是(public abstract修飾)公有抽象 沒有構造方法 3)接口能創建對象實例嗎? 不能,接口沒有構造器,不能創建對象
4)
接口和類的關系?
接口和類之間是實現關系,一個類用implements語句實現了某接口,這個類被稱為接口的實現類,一個類可以實現多個接口,一個類實現了某接口,必須覆蓋這個接口中的所以方法,否則這個類必須是個抽象類 5)
接口和接口的關系?
接口和接口之間是繼承關系,一個接口用extends繼承另外一個接口,稱為這個接口的子接口。一個接口可以繼承多個父接口 6)
內部類如何定義?
一個類聲明在另一個類的里面,這個類就被稱為內部類,而外面的類被稱為外部類 7)
內部類可以分成幾種?
實例內部類:聲明在方法外邊沒有static修飾符 靜態內部類:聲明在方法外邊有static修飾符 局部內部類:聲明在方法里邊 8)
如何創建實例內部類的對象實例? 需要用外部類的對象來創建 例如: class A {class B {
}
}
如果像創建B類的實例,則必須用以下語句: A a = new A();A.B b = a.new B();9)
如何在實例內部類中訪問外部類的成員?
在實例內部類中可以直接使用外部類的成員,不需要創建外部類的對象實例,但是如果在內部類中的成員名稱屏蔽隱藏了外部類的成員(即外部類和內部類的成員名相同),則需要用“外部類名.this.成員名”訪問外部類成員 第8章異常處理
1)異常的對象的根類是哪個類? 是Throwable類
2)
Throwable類有哪兩個分支?
分成Error類和Excepion類兩個分支 Error類表示嚴重錯誤
Exception類表示可以在程序中處理的錯誤 3)
Exception類有哪兩個分支?
分成運行時異常和非運行時異常(已檢查異常)運行時異常編譯不檢查,在運行時才會發生異常
已檢查異常編譯時就會作檢查,不處理異常則通不過編譯 4)如果在try塊中發生異常,那么程序將會跳轉到哪? 會跳轉到catch語句塊 5)catch語句可以用父類類型捕獲子類異常嗎? 因為有多態特點,是可以的6)處理異常代碼finally語句會在什么時候執行? finally代碼在任何時候都會執行,不管有沒有發生異常。7)
如何聲明已檢查異常,由誰來處理這個異常? 用throws語句來聲明一個已檢查異常,由方法的調用者來處理這個異常 8)
如何拋出一個異常? 用throw語句拋出
9)如何創建一個自定義的異常類? 創建一個類,只要讓它繼承任何一個現有的異常類就可以了 10)覆蓋方法對于異常有什么要求? 覆蓋方法不能比父類方法拋出更多異常 第9章反射,代理,標注
1)
獲得一個類型的Class對象有哪幾種途徑?
方法1:對象.getClass()方法2:類型名.class 方法3:Class.forName()2)
反射相關的類型都有哪些? Class 代表一個運行時類 Field 代表一個類的屬性 Method 代表一個類的方法 Constructor 代筆一個類的構造器 3)
如何聲明一個自定義標注? [<修飾符>] @interface <標注名>{ 返回值方法名稱(); 返回值方法名稱(); ?? } 例如:
public @interface MyComment { int id();String info();} 4)
java有幾個內置標注? 有3個
@Override——用于修飾此方法覆蓋了父類的方法,而非重載。@Deprecated——用于修飾已經過時的方法。
@SuppressWarnings——用于通知Java編譯器禁止特定的警告。第10章 java常用類 1)
字符串String是可變類還是不可變類?
是不可變類,一經創建就不能修改其內容了 2)
字符串的常用方法有哪些? charAt方法:可以返回指定位置的字符 substring方法:可以截取子字符串 length方法:返回字符串長度 indexOf方法:查找子串的位置 lastIndexOf方法:反向搜索字串的位置 replaceAll方法:替換字符串 split方法:分解字符串
toLowerCase, toUpperCase方法:字符串大小寫轉換 3)StringBuffer類和String類有什么區別? StringBuffer是可變類,String是不可變類
4)StringBuffer類和StringBuilder類有什么區別? StringBuffer類是線程安全的,StringBuilder類是線程不安全的5)Math類主要提供了哪些方法?
Math類提供了大量的和數學運算相關的靜態方法 6)Set集合和List集合共同的父接口是什么? 是Collection集合7)
Set集合和List集合有什么區別? Set: Collection的子接口,不記錄元素的保存順序,且不允許有重復元素
List: Collection的子接口,記錄元素的保存順序,且允許有重復元素 8)
ArrayList和LinkedList有什么不同?
ArrayList 的內部實現是基于內部數組Object[],所以從概念上
講它更像數組
LinkedList的內部實現是基于一組連接的記錄,所以它更象一個鏈表 結構,所以它們在性能上有很大的差別。ArrayList 隨機訪問比較塊,但插入和刪除元素比較慢 LinkedList但插入和刪除元素比較快,但隨機訪問比較慢 9)
HashTable和HashMap有什么不同?
HashTable是線程安全的,HashMap是線程不安全的10)Vector和ArrayList有什么不同? Vector是線程安全的ArrayList是線程不安全的 第11章 IO流 1)
流分成哪兩類?
按照單位劃分分成字節流和字符流。按輸入輸出分成輸入流和輸出流 2)
和文件流相關的有那幾個類? FileInputStream文件輸入字節流 FileOutputStream文件輸出字節流 FileReader文件輸入字符流 FileWriter文件輸出字符流 3)
文件流操作應該用字節流還是字符流? 如果是純文本文件應該用字符流 如果是二進制文件應該用字節流 4)
文件操作用哪個類? 用java.io.File類 第12章 線程 1)
創建一個線程類的兩種方式? 繼承Thread類 實現Runnable接口 2)線程體應該放在哪個方法里面? run方法 3)啟動新的線程用什么方法?
用start方法
4)一個線程對象能夠用start多次啟動嗎? 不可以,一個線程方法只能start一次
5)線程有哪幾種主要狀態? 有四種,分別是:新生狀態,可運行狀態,阻塞狀態,死亡狀
態 6)
線程的同步需要用什么方法? 舊的方法是用synchronized關鍵字
新的方法是用ReentrantLock類的lock和unlock方法
第四篇:java期末考試知識點總結(范文模版)
java知識點總結
應同學要求,特意寫了一個知識點總結,因比較匆忙,可能歸納不是很準確,重點是面向對象的部分。
java有三個版本:JAVA SE 標準版JAVA ME移動版JAVA EE企業版 java常用命令:java, javac, appletview java程序文件名:.java,.class java的兩類程序:applet, application;特點,區別,這兩類程序如何運行 java的主方法,主類,共有類;其特征
java的數據類型,注意與C++的不同,如字符型,引用型,初值 java與C++的不同之處,期中已總結 java標記符的命名規則
1)標識符有大小寫字母、下劃線、數字和$符號組成。
2)開頭可以是大小寫字母,下劃線,和$符號(不能用數字開頭)3)標識符長度沒有限制
4)標識符不能使關鍵字和保留字 面向對象的四大特征 抽象、封裝、繼承、多態
封裝,類、對象,類與對象的關系,創建對象,對象實例變量
構造函數,默認構造函數,派生類的構造函數,構造函數的作用,初始化的順序,構造方法的重載 構造函數:創建對象的同時將調用這個對象的構造函數完成對象的初始化工作。把若干個賦初值語句組合成一個方法在創建對象時一次性同時執行,這個方法就是構造函數。是與類同名的方法,創建對象的語句用new算符開辟了新建對象的內存空間之后,將調用構造函數初始化這個新建對象。構造函數是類的特殊方法: 構造函數的方法名與類名相同。構造函數沒有返回類型。
構造函數的主要作用是完成對類對象的初始化工作。構造函數一般不能由編程人員顯式地直接調用。
在創建一個類的新對象的同時,系統會自動調用該類的構造函數為新對象初始化。類的修飾符:public類 VS 默認;abstract類;final類;1)類的訪問控制符只有一個:public,即公共的。公共類表明它可以被所有其他類訪問和引用。
若一個類沒有訪問控制符,說明它有默認訪問控制特性,規定該類智能被同一個包中的類訪問引用(包訪問控制)。2)abstract類:用abstract修飾符修飾的類被稱為抽象類,抽象類是沒有具體對象的概念類,抽象類是它所有子類的公共屬性集合,用抽象類可以充分利用這些公共屬性來提高開發和維護效率。
3)final類:被final修飾符修飾限定的,說明這個類不能再有子類。所以abstract與final不能同時修飾一個類。域和方法的定義
1)域:定義一個類時,需要定義一組稱之為“域”或“屬性”的變量,保存類或對象的數據??梢允莏ava任意的數據類型,其中包括簡單類型、類、接口、數組等。一個類中域名應該是唯一的。
2)方法是類的動態屬性,標志了類所具有的功能和操作。方法由方法頭和方法體組成: 修飾符1 修飾符2 ?返回值類型方法名(形式參數列表)throw(異常列表){ 方法體個語句; } static域和方法,特點,本質,與普通域和方法區別,初始化問題
1)靜態域:用static修飾符修飾的域是僅屬于類的靜態域。特點是:它們是類的域,不屬于任何一個類的具體對象。保存在類的內部區域的公共存儲單元,任何一個類的對象訪問它都是相同的數值,任何一個類的對象去修改它,都是在對同一個內存單元操作。2)靜態方法:用static修飾的方法,是屬于整個類的方法;(1)調用靜態方法時,應該使用類名做前綴,而不是使用某個具體對象名。非靜態方法屬于某個對象的方法,在這個對象創建時,對象的方法在內存中擁有自己專用代碼段;而靜態方法屬于整個類,它在內存中的代碼段將隨著類的定義而分配和裝載,不被任何一個對象專有。
由于static方法是屬于整個類的方法,所以它不能操縱和處理屬于某個對象的成員變量,而只能處理屬于整個類的成員變量,static方法只能處理static域。final關鍵字,final類,final域,final方法
1)final類:一個類如果被final修飾符修飾限定,說明這個類不再能有子類
2)final域:final是用來修飾修飾常量的修飾符,一個類的域如果被聲明為final,那么它的值在程序的整個執行過程中都不能改變。用final修飾符說明常量是注意:1.需要說明常量的數據類型;2.需要同時指出敞亮的具體取值;3.因為所有類對象的常量成員,其數值固定一致,為了節省空間,常量通常聲明為static.3)final方法:不能被當前類的子類重新定義的方法。被private限定為私有方法,以及final類中的方法,都是默認為最終方法。訪問控制符
是一組想定類、屬性、方法是否可以被程序中的其他部分訪問和調用的修飾符,其他部分指這個程序中這個類之外的類。1)類的訪問控制:
類的訪問控制符只有一個Public,公共的。一個類被聲明為公共類,表明它可以被所有的其他類訪問和引用,程序其他部分可以創建這個類的對象,訪問這個類內部可見的成員變量和調用它的可見方法。
如果類沒有訪問控制符public說明它是默認訪問控制,規定該類只能被同一個包中的類訪問和引用,不可被其他包中的類使用(包訪問)。2)類成員的訪問控制:
Public:公共。一個方法或者域被聲明為公共的,表明它可以被所有的類訪問。
默認訪問控制符:類的定義中,域和方法沒有指定訪問控制符,則域和方法具有包訪問性,即可以被同一個包中的所有類(的方法)訪問。Protected:保護訪問控制符,類中限定為protected的成員可以被這個類本身、它的子類(包括同一個包和不同包中的子類)以及同一個包中的其他類來訪問。Private:私有訪問控制符,被private修飾的域和方法只能被同一個類中的成員方法所訪問,而不能被任何其他類(包括該類的子類)訪問。它們也被稱之為私有域和方法。類的繼承,繼承的特性可給面向對象編程帶來哪些好處?什么是單繼承,什么是多重繼承? 繼承:是存在于面向對象程序中的兩個類之間的一種關系,當一個類獲取另一個類的所有非私有的數據和操作的定義作為自己的一部分或全部成分時,就稱兩個類之間是繼承關系。繼承能夠使程序結構清晰,降低編碼和維護工作量??梢蕴岣叱绦虺橄蟪潭?,使之更接近人的思維方式,同時也可以提高程序開發效率,降低維護工作量。單繼承:只任何一個類都只有一個單一的父類; 多重繼承:只一個類可以有一個以上的父類,它的靜態的數據屬性和操作從所有這些父類中繼承。Java處于安全性可靠性考慮,僅支持單繼承。域的繼承與隱藏
在子類中重新定義一個與從父類哪里繼承來的域變量完全相同的變量,導致子類中有兩個同名變量,一般情況,子類的方法所操作的是子類自己定義的變量,而從父類繼承的變量為不可見,即被子類同名變量隱藏,成為域的隱藏。方法的繼承與覆蓋,與方法重載有什么不同?
子類可以重新定義與父類同名的方法,實現對父類方法的覆蓋(overload),與域的隱藏不同在于:子類隱藏父類的域只是使之不可見,父類同名域在子類對象中仍然占有自己的獨立內存空間;子類方法對父類同名方法的覆蓋將清除父類方法占用的內存,從而使父類方法在子類對象中不復存在。注意:子類重新定義父類已有方法時,應保持與父類完全相同的方法頭聲明,即應與父類具有完全相同的方法名,返回值和參數列表。
重載(override)是在一個類中定義同名方法的情況。由于重載發生在同一個類里,不能再用類名來區分不同的方法,所以一般采用不同形式參數列表,包括形式參數個數、類型和順序不同來區分重載方法。super
this super調用父類構造函數:嚴格來說子類并不繼承父類構造函數。但子類構造函數與父類構造函數存在一定關系并遵循以下原則:
如果子類自己沒有定義任何構造函數,那么創建子類對象時將調用父類無參數構造函數。如果子類自己定義了構造函數,則在創建子類對象時,系統將首先隱含執行父類無參數的構造函數,然后再執行子類自己的構造函數。
如果在子類自己定義的構造函數中,利用super關鍵字顯式地調用父類的構造函數,系統將不再隱含調用父類的無參數的構造函數。super的顯式調用語句必須是子類構造函數的第一個可執行語句。(P126有例子)
this:一個類的不同構造函數之間可以互相調用。一個構造函數需要另一個構造函數時,應使用關鍵字this,同時這個調用語句應該是整個構造函數的第一個可執行語句。當使用this并給他一個參數列表時,this顯式調用參數匹配的另一個構造方法。(P125例子)。多態:重載,覆蓋,對象引用多態(兼容性原則)
多態,指一個程序中同名的不同方法共存的情況。突出Java語言的繼承性。面向對象程序中多態可以表現在:1)子類對父類方法的覆蓋;2)一個類中方法的重載;3)將子類對象作為父類的對象實現多態。父類與子類對象的轉換
子類繼承了父類所有的非私有的成員(屬性和方法),父類成員也就是子類成員。我們可以通過父類變量讓一個子類對象做父類對象可做的全部事情(P115).如果父類變量指向的實際是一個子類對象,即早先曾將子類對象的引用賦值給這個父類變量,那么可以用強制類型轉換將這個父類變量引用轉換為子類對象的引用,也就是將作為父類對象看待的子類對象轉變為作子類對象看待。Employee emp = new Manager(…)Manager mgr;mgr =(Manager)emp;最后結果相當于:
Manager mgr = new Manager(…)
包,package
import, 簡單知道作用和使用 接口,會定義,有何特點?作用,會實現,會使用
接口是用來實現類間多重繼承功能的結構。Java中接口在語法上有些相似與類,它定義了若干個抽象方法和常量,形成一個屬性集合,屬性集合通常對應了某一組功能,主要是可以幫助實現類似于類的多重繼承功能。聲明接口:
[public] interface 接口名 [extends 父接口名列表] { //接口體
// 常量域聲明
[public] [static] [final] 域類型域名 = 常量值;
//抽象方法聲明
[public] [abstract][native] 返回值方法名(參數列表)[throw 異常列表]; } 實現接口:
在類的聲明部分,用implements關鍵字聲明該類將要實現那些接口。如果實現某接口的類不是abstract的抽象類,則在類的定義部分必須實現指定接口的所有抽象方法,即為所有方法定義方法體,方法頭部分應該與接口中的定義完全一致。如果實現接口類是abstract類,它可以不實現該接口的所有的方法。一個類在實現某接口的抽象方法時,必須使用完全相同的方法頭。
接口的抽象方法的訪問限制符都已指定為public,所以類實現方法時候,必須顯式地使用pubic修飾符。
4-1什么是抽象?什么是過程抽象?什么是數據抽象?面向對象軟件開發如何實現?
抽象:即去除掉被研究對象中與主旨無關的次要部分,或暫時不考慮的部分,而僅抽取與研究工作有關的性質的內容加以考察。
過程抽象:將整個系統的功能劃分為若干部分,強調功能完成的過程及步驟。數據抽象:把系統中需要處理的數據和數據上的操作結合在一起,根據功能性質和作用等因素抽象成為不同的抽象數據類型。
面向對象軟件開發采用數據抽象的方法構建程序的類,對象及方法。4-2什么是封裝?面向對象程序如何實現封裝? 封裝是指利用抽象數據類型將數據和基于數據的操作封裝在一起,數據被保護在抽象數據類型內部,系統的其他部分只有通過包裹在數據外面的被授權操作,才能夠與這個抽象數據類型交流和交互。
抽象數據類型用“類”這個面向對象工具可理解和操縱的結構來代表的,每個類封裝了相關數據和操作。
4-3使用抽象和封裝有哪些好處? 抽象可以幫助人們明確工作重點,理清問題的脈絡。封裝特性使抽象數據類型的可重用性大為提高,利于構建,開發大型標準化的應用軟件系統,大幅提高生產效率,縮短開發周期和降低各種費用。
4-4Java程序中使用的類分為哪兩種?什么事系統定義的類?什么事用戶自定義類?
1)系統定義的類及用戶自定義類2)Java類庫是一組由開發人員或軟件供應商編寫的Java程序模塊,每一個模塊通常對應一種特定的基本功能和任務可以直接利用這些類庫無需從頭編寫。3)用戶自己根據需要定義的類。
4-6 使用已經存在的類(包括類庫中系統類和用戶類)有哪三種主要方法?如何在程序中引入已經存在的類?
第一、繼承系統類或繼承已經定義好的類。第二、創建已經定義好的類的對象。第三、直接使用類。2)利用import語句引入它所用的類所在的包。4-15 什么事靜態初始化器?它有什么特點?與構造函數有什么不同?
靜態初始化器:由static引導的一對大括號括起的語句組,作用與類的構造函數相似,都完成初始化工作。與構造函數的不同:
構造函數是對每個新創建的對象初始化,而靜態初始化器是對類自身進行初始化。
構造函數是在用new運算符產生新對象時由系統自動執行,而靜態初始化器是在它所屬的類加載入內存時由系統調用執行。
不同于構造函數,靜態初始化器不是方法,沒有方法名、返回值、和參數列表。4-16 最終域和易失域各有有何特點?如何定義?
(1)最終域:一個類的域如果被聲明為final,那么它的值在程序的整個執行過程中是不能變的。final修飾常量時注意:1)說明常量的數據類型2)需要同時指出常量的具體值。3)所有類對象的常量成員,其數值固定一致,為了節省空間,常量通常聲明為static.例:static final String phoneNum =”123”。
(2)易失域:一個域被volatile修飾符修飾,說明這個域可能同時被幾個線程控制修改,即這個域不僅被當前程序掌握,運行過程中可能存在其他未知程序,操作來影響和改變域的取值。
4-17 如何定義方法?在面向對象程序設計中方法由什么作用? 方法名后面的小括號()是方法的標志。程序用方法名調用方法。定義方法的目的:是定義具有相對獨立和常用功能的模塊,使程序結構清晰也利于模塊在不同場合重復利用。
4-18 什么事抽象方法?它有何特點?如何定義、如何使用?
由abstract 修飾符修飾的抽象方法是一種僅有方法頭,沒有具體方法體和操作實現的方法。例如:abstract void performDial();
注意:所有抽象方法,都必須存在抽象類中,一個非抽象類中出現抽象方法時非法的。一個抽象類的子類若不是抽象類,它必須為父類中所有的抽象方法寫方法體,不過抽象類不一定只能擁有抽象方法,它也可以包括非抽象方法。
4-22修飾符是否可以混用?混合使用應該注意什么問題?
修飾符可以混合使用。例如:public abstract final 三者之間并非互斥。Public abstract class ? Abstract不能與final 并列修飾一個類。
Abstract 不能與private、static、final、native修飾同一個方法。Abstract 類不能有private域和方法。Abstract方法必須在abstract類中。Abstract方法不能處理非static屬性。
5-2 子類的域和方法數目一定大于等于父類的域和方法數目,說法是否正確? 不正確,子類并不能繼承父類的私有域和私有方法。5-7構造函數是否可以被重載?試舉例。
可以被重載。構造函數的重載指同一個類中存在若干個具有不同參數列表的構造函數 例:D200_Card(){} / /無形式參數,無任何操作的構造函數
D200_Card(long cn){ cardNumber = cn;} //一個參數的構造函數
D200_Card(long cn,int pw;){ cardNumber = cn;password = pw;} //兩個參數的構造函數 簡答題new1 1 什么是靜態變量?什么是靜態方法?各自有何特點?
被static修飾的變量叫靜態變量,被static修飾的訪問靜態方法。靜態變量最主要特點是它們是類的域(變量),不屬于任何一個類的具體對象,它不保存在對象空間,而是保存在類的內存區域的公共存儲單元,任何類的對象訪問它時,取到的都是相同的數值,修改它時,都是對同一個內存單元進行操作。靜態方法是屬于整個類的的類方法,不是屬于某個具體對象的方法。Java中對變量和成員方法的訪問控制主要有哪四種?有何區別?
a)Private:私有訪問屬性,被private修飾的變量或方法只能被同一個類的成員方法訪問,而不能被任何其他類訪問。Private訪問控制符提供最高的成員保護級別,使它們不為其他類所見,體現了類的封閉和信息隱藏。b)默認訪問控制符:如果在類的定義中,域和方法前沒有指定訪問控制符,則具有包訪問性,即被同一包的所有類所訪問,稱之為“包友元”成員。c)Protected保護訪問控制符:被portected修飾的成員可以被類本身、它的子類、以及同一個包中所有類訪問。d)Public公共訪問控制符:成員可以被所有類訪問。填空:
1.創建類的對象時,使用運算符__new______給對象分配內存空間。2.若有定義:float[] b={1.1f, 3.5f, 6.8f};,則b.length()的值是_3____ 3.在子類中使用關鍵字__super_____做前綴可調用被子類覆蓋的父類中的方法
4.Java語言中, 通常把可能發生異常的方法調用語句放到try塊中,并用緊跟其后的_catch____塊來捕獲和處理異常
5.程序中實現多線程的方法有兩種:繼承_Thead____類和實現Runnable接口 6.面向對象的三大特征是()()()封裝性、繼承性、多態性
第五篇:Java基礎知識點總結-Ch1
Java基礎知識點總結
第一章 Java語言概述
1.面性對象語言的基本特征。
Java語言的特點。最大優勢。
Java語言是區分大小寫的。
2.Java虛擬機的核心。
環境變量classpath設置中的“.;”是指可以加載應用程序當前目錄及其子目錄中的類。環境變量的變量值的最后是以“rt.jar;.;”結束。
3.編寫源文件時不可以使用Word編輯器,因為他含有不可見字符。
要用記事本或Edit。源文件的擴展名是java。
4.一個Java應用程序的源文件必須有一個類含有public static void main(String args[ ])的方法,這樣類的應用程序叫做主類。
5.源文件的名稱必須與有public修飾的類的名稱相同。
若源文件有多個類,那么只能有一個是public類;
若只有一個類是 public類,那么源文件的名字必須與這個類的名字完全相同,擴展名是.java;
若源文件沒有public類,那么源文件的名字只要和某個類的名字相同即可,并且擴展名為.java。
6.編譯時,Java編譯器是什么。
進入某個文件夾的命令是“cd 目錄名”;退出某個文件夾的命令是“cd..”。
7.編譯源文件后將生成多個擴展名為.class的文件,每個擴展名是.class的文件夾存放一個類的字節碼文件,文件名與該類的類名相同。這些字節碼文件被存放在與源文件相同的目錄中。
8.運行時,Java解釋器是什么。
Java應用程序總是從主類的main方法開始執行。
9.在運行字節碼文件是不可以帶有擴展名。
當Java應用程序有多個類時,Java命令執行的類名必須是主類的名字(不帶擴展名)。
10.例子:有一個源文件名字叫Apple.java,其中包括3個類,名字分別是Apple, Banana, Orange,有1個是主類,則主類名是什么,生成多少個字節碼文件,字節碼文件名稱是什么,在編譯,運行時語句分別是怎樣的。
11.Application程序又稱什么,Applet程序又稱什么,哪一個是源文件編譯時運行的程序。
12.J開發一個Java程序要經過的三個步驟。
13.單行注釋,多行注釋的標記分別是什么
14.javac *.java的意思。
15.Allmans風格又稱什么,Kernighan風格又稱什么,兩者各自的意思是什么。