1、查看已安裝jdk文件路徑
CMD輸入java -verbose。
2、java學習提升路線
java學習視屏地址:
各階段所需要看的書:
《Java編程思想》,《大話設計模式》,《重構 改善既有代碼的設計》,《effective java》《深入理解Java虛擬機》《Java並發編程實戰》《深入理解計算機系統》
3、java基礎知識匯總
1、java中的四
面相對象的四大特征:抽象,封裝,繼承,多態
2、j2ee原始體系結構:
3、變量
變量其實就是在內存中開辟的一塊用於存儲數據的空間。
對於變量的使用來說大致分為以下幾個步驟:
1)變量的聲明:想要使用變量就要先聲明變量,確定它的類型。(類型有基本類型:byte->short->char->int->long->float->double,boolean;引用類型:除去基本類型以外其余都是引用類型,比如String,Integer,數組,list,對象等。引用類型有四種方式:強引用,弱引用,軟引用,虛引用。
強引用(Final Reference):默認引用類型,類似於Object obj=new Object()這樣的引用。特點如下:
1、GC在任何時候都不會回收強引用,即便拋出了OOM錯誤。
2、可以直接訪問對象。
3、可能存在導致內存泄露的情況.
弱引用(Weak Reference):用來描述非必須的對象,它的生命周期是在產生至下一次GC工作之前,當GC工作時,無論內存情況如何都會對此類引用進行回收。被回收的此類應用會進入到注冊引用隊列。弱引用的相關實際案例可以參考WeakHashMap,后期補充
軟引用(Soft Reference):軟引用一般用來表達一些有用但是非必須的對象,GC會在內存不夠的情況下進行回收
虛引用(Phantom Reference):最弱的一種引用類型,隨時都有可能被GC回收,必須與引用隊列一起使用,作用在於跟蹤垃圾回收過程)
2、變量的命名:符合java命名規范(首字母不能以數字開頭,不可使用保留字,大小寫敏感,可以有數字,字母,_和$組成),符合駝峰命名,符合標識符命名規范,言簡意賅,意思清晰
3、變量的初始化:未被初始化的變量是無法使用的,初始化可以在變量聲明時就初始化,也可以在首次使用之前進行初始化.
4、變量的使用:進行存取,計算等操作。
變量使用的常見問題:
變量在使用的過程中,常見問題總結為如下幾點:
1)使用未經聲明的變量。
2)使用不符合Java標識符命名規則的變量。
3)使用未經初始化的變量。
4)變量的賦值與變量的類型不匹配
整數類型在使用的過程中,常見的問題有以下幾點:
1)整數直接量超出了整數的范圍。
2)關於整數的除法:兩個整數相除,會舍棄小數的部分,結果也是整數。
3)整數運算的溢出:兩個整數進行運算時,其結果可能會超過整數的范圍而溢出。
4)表示long直接量,需要以 L 或 l 結尾。
浮點類型在使用的過程中,常見的問題有以下幾點:
1)浮點數的直接量為double類型。
2)浮點數存在舍入誤差問題。
char類型在使用的過程中,常見的問題有以下幾點:
1)字符類型存儲中文。
2)char類型的值可以作為整數類型直接使用。
數據類型轉換在使用的過程中,常見的問題有以下幾點:
1)強制轉換時的精度喪失和溢出。
2)數值運算時的自動轉換。
3)byte、char、short轉換為int的問題。
4、運算符
補充點:“+”有兩種運算規則,一種是兩端為數字則為數學加法運算,另外一種是實現字符串的連接,也可以實現字符串與其他數據類型的“相連”。上述代碼中,字符串之前的運算按照加法運算,字符串之后的運算按照字符串相連。
5、方法
1.用於封裝一段特定的業務邏輯功能
2.方法應盡可能獨立,一個方法只干一件事
3.方法可以被反復的調用多次
4.較少代碼重復,維護方便,便於協作開發
定義方法的5個要素:
修飾詞 返回值類型 方法名 參數列表 方法體
System.currentTimeMillis() 方法:該方法返回1970年1月1日零點到此時此刻所經歷的毫秒數,其數據類型為long,經常用於計時操作。示例:
以下代碼的功能為計算1累加到1000000的所耗的時間,代碼如下所示:
- public static void main(String[] args) {
- //開始時間
- longstartTime = System.currentTimeMillis();
- //計算從1加到1000000的和
- int sum = 0;
- for (int i = 1; i <= 1000000; i++) {
- sum+=i;
- }
- //結束時間
- longendTime = System.currentTimeMillis();
- //輸出耗時
- System.out.println("耗時:"+(endTime-startTime)+"毫秒");
- }
6、枚舉
enum修飾,一般用於常量的定義,個人感覺比常量類好用。
示例:
@Getter
@AllArgsConstructor
public enum DemoEnum(){
CONSTANT_DEMO("constant","常量");
private String code;
private String desc;
}
7、訪問控制修飾符
public:公有,所有類都可以訪問
default:默認修飾符,同包內訪問
protected:保護型。同包內以及繼承了此類的外包類可以訪問
private:私有類,只有本類內可以訪問。
8、靜態 static
靜態方法不能直接訪問實例變量
靜態塊:
屬於類,被static修飾,在類加載期間自動執行加載,且只加載一次。一般用於加載靜態資源。
9、接口
1.是一個標准,規范
2.是一種數據類型(引用類型)
3.由interface定義,只能包含常量和抽象方法
4.接口不能被實例化
5.接口需要被實現(implements),被實現后必須重寫接口的所有抽象方法
6.一個類可以實現多個接口,如果又繼承又實現,一定要先繼承后實現
7.接口可以繼承接口
10、抽象類
abstract修飾,平常類有的,它都可以有。且extends抽象類時可以選擇override方法,不需要全部override;方法為抽象方法時,所在的類必須為抽象類,且不能被實例化。
11、繼承
一個類只能繼承一個父類;默認情況下所有類都是繼承了Object類。
1)子類繼承父類的成員變量
能夠繼承public,protected成員變量,不能繼承private成員變量;
父類的包訪問權限成員變量,只有子類在與父類同包的情況下才能繼承;
繼承后,如果子類有和父類相同名稱的成員變量,子類的成員變量會屏蔽掉父類的,如果想 要訪問父類的,可以用super關鍵字
2)子類繼承父類的方法
訪問修飾符的繼承與成員變量一致;
如果子類有與父類相同名稱的方法,則會覆蓋掉父類方法,即重寫或重載;調用父類方法,可以使用super關鍵字。
3)構造器
子類不能繼承父類的構造器;父類的構造是子類來引用的,不是繼承的
12、重載與重寫
重載:
存在於子父類和同類中;方法名稱相同,但參數類型,參數順序,參數個數至少有一個是不一致的;只有返回類型不一致時不能重載;對訪問權限修飾符無要求
重寫:
存在於子父類中;方法名稱,返回值,參數類型,順序,個數都相同;訪問權限修飾符只能小於等於父類的修飾符;如果父類中有final修飾的方法,則不能被重寫;(父類返回類型是void或基本類型時,子類必須的返回類型必須相同,返回類型是引用類型時,可以是小於等於父類的)
區別對比:
13、JDBC
1)使用步驟:
加載驅動類:
Class.forName("com.mysql.jdbc.driver");
創建連接
Connection con=DriverManager.getConnection(url,name,password);
創建statement實例
1、執行靜態SQL語句。通常通過Statement實例實現。
Statement ste=con.
createStatement();
2、執行動態SQL語句。通常通過PreparedStatement實例實現。
PreparedStatement pstmt = con.prepareStatement(sql) ;
3、執行數據庫存儲過程。通常通過CallableStatement實例實現。
CallableStatement cstmt = con.prepareCall("{CALL demoSp(? , ?)}") ;
執行sql
1、ResultSet executeQuery(String sqlString):執行查詢數據庫的SQL語句 ,返回一個結果集(ResultSet)對象。
ResultSet rs = stmt.executeQuery(“SELECT * FROM …”) ;
2、int executeUpdate(String sqlString):用於執行INSERT、UPDATE或 DELETE語句以及SQL DDL語句,如:CREATE TABLE和DROP TABLE等
int rows = stmt.executeUpdate(“INSERT INTO …”) ;
3、execute(sqlString):用於執行返回多個結果集、多個更新計數或二者組合的 語句。 具體實現的代碼:
boolean flag = stmt.execute(String sql) ;
處理結果
關閉連接
操作完成以后要把所有使用的JDBC對象全都關閉,以釋放JDBC資源,關閉順序和聲 明順序相反:1、關閉記錄集2、關閉聲明3、關閉連接對象
2)對事務的操作
事務:
滿足以下四點特征的數據庫訪問叫做事務
-原子性:事務是一個完整的過程,要么成功,要么失敗
-一致性:事務訪問前后數據一致
-隔離性:事務訪問過程中,所操作的數據會被鎖住,直到操作完成
-持久性:事務一完成,結果就永久有效
操作方法:
在創建連接之后加上:
conn=DBUtil.getConnection();
//取消自動提交事務
conn.setAutoCommit(false);
在執行完所有SQL之后加上:
//手動提交事務
conn.commit();
在異常捕獲中加上:
//發生異常時回滾事務
DBUtil.rollBack(conn);
此處的DBUtil是事先封裝好的一些對於事務的回滾操作。參考方法:
//回滾事務
public static void rollBack(Connection conn){
if(conn!=null){
try {
conn.rollback();
} catch (SQLException e) {
e.printStackTrace();
throw new RuntimeException("回滾事務失敗?",e);
}
}
}
3)補充一個點:獲取返回數據的總列數
conn= DBUtil.getConnection();
System.out.println(conn);
Statement smt=conn.createStatement();
String sql="select * from emps where empno='"+id+"'";
ResultSet res=smt.executeQuery(sql);
//獲取返回數據的總列數
ResultSetMetaData rsmd = res.getMetaData() ;
while(res.next()){
for(int i=1;i< rsmd.getColumnCount();i++){
System.out.println(res.getString(i));}
}
14、線程
很重要,單獨整理一遍
15、final,finally,finalize
final: 修飾符。
被此修飾符修飾的類不能被繼承;
被此修飾符修飾的變量不能被修改,只能讀取;
被此修飾符修飾的方法只能使用,可以被重載,不能被重寫;
此修飾符不能修飾抽象類;
finally: 捕獲異常后的清除操作。
finalize:一個方法;主要是在GC將對象刪除之前,先對對象調用一下finalize方法,來確定對象是否被引用
16、session與cookie
服務端可以生成一個session,然后把對應的sessionId以cookie的形式發送給客戶端。
session方法:
1)HttpSession s=request.getSession(boolean flag);
-HttpSession是一個接口;
-當flag為true時:先查看請求中有沒有SessionId,如果沒有,服務器則創建一個Session對象;如果有則根據SessionId去查找對應的Session對象,找到則返回,找不到則創建一個新的
-當flag為false時,沒有SessionId或者根據SessionId沒有找到對應的Session對象,都返回null;
-一般使用HttpSession s=request.getSession();這樣的話不管任何情況都可以得到一個Session對象
2)對象的操作
-綁定:session.setAttribute(String name;Object object);
-獲取綁定對象 session.getAttribute(String name);
-移除綁定對象 session.removeAttribute(String name);
3)刪除session對象
session.invalidate();
4)Session超時
指的是:Web服務器會將空閑時間過長的Session對象刪除掉,以節省服務器內存空間資源。web服務器缺省的超時時間限制:一般是30分鍾。修改Session的缺省時間限制,有如下兩種方式:
1. 通過修改tomcat中 conf/web.xml 文件的設置,代碼如下所示:
- <session-config>
- <session-timeout>30</session-timeout>
- </session-config>
2.通過編程的方式來修改,通過調用Session對象的setMaxInactiveInterval方法來修改,該方法的聲明如下所示:
- void setMaxInactiveInterval ( int seconds ){}
cookie方法:
1)創建:
String user=request.getParameter("user");
//Cookie中只能存一條數據,且只能存字符串
Cookie c1=new Cookie("user",user);
2)獲取:
//瀏覽器訪問時自動傳入保存的Cookie
Cookie[] cookies=req.getCookies();
if(cookies != null) {
res.setContentType("text/html;charset=utf-8");
PrintWriter p=res.getWriter();
for(Cookie c : cookies) {
//System.out.println(c.getName()+"按"+c.getValue());
p.println(c.getName()+":"+c.getValue());
}
p.close();
}
3)發送:
//將Cookie綁定到reponse中,服務器響應時自動發送
response.addCookie(c1);
4)設置有效路徑
Cookie c=new Cookie("name","test");
c.setPath("/appName");
response.addCookie(c);
5)編碼問題
Cookie只能保存合法的ASCII字符,若要保存中文,則需要將中文編碼成ASCII字符
Cookie c=new Cookie("city",URLEncoder.encode("北京“,"utf-8");
解碼:
Cookie[] cookies=req.getCookies();
if(cookies != null) {
Cookie c=Cookie[0];
String value=c.getValue();
value=URLEncoder.decode(value,"utf-8");
}
6)生存時間
默認情況下,瀏覽器會將Cookie保存在內存中,只要瀏覽器不關閉,就一直存在;
如果希望瀏覽器關閉了還存在,則需要設置過期時間:
void Cookie.setMaxAge(int seconds);
seconds>0:瀏覽器保存Cookie的最長時間為seconds的值,超過這個時間,瀏覽器就會刪除,這種情況下Cookie是保存在硬盤上的;
seconds=0:響應發送會客戶端時,就會刪除原有Cookie;
seconds<0:缺省值。
瀏覽器禁用Cookie解決方法:
重寫URL:即讓瀏覽器在訪問服務器時,不再使用原有地址,而是在原有地址后面加上SessionId:
response.encodeRedirectURL(java.lang.String url) 用於對sendRedirect方法后的url地址進行重寫。
response.encodeURL(java.lang.String url)用於對表單action和超鏈接的url地址進行重寫
17、equals與==區別
值類型都是用==判斷相等性,醫用對象需要使用equals;equals會比較引用對象的引用地址以及值是否都相等
18、List與Set區別
List:元素有放入的順序;元素可以重復;list支持for循環,也就是通過下標來遍歷,也可以用迭代器,
Set:元素沒有放入的順序,但是位置是固定的,元素的位置是通過HashCode決定的;元素不可以重復,當有重復元素時,會覆蓋前一個;加入Set 的Object必須定義equals()方法 ,set只能用迭代,因為他無序,無法用下標來取得想要的值。
Set和List對比:
Set:檢索元素效率低下,刪除和插入效率高,插入和刪除不會引起元素位置改變。
List:和數組類似,List可以動態增長,查找元素效率高,插入刪除元素效率低,因為會引起其他元素位置改變。
19、內部類
內部類大致分為:成員內部類,局部內部類,匿名內部類,靜態內部類。
1、成員內部類:
成員內部類可以無條件訪問外部類的所有成員屬性和成員方法(包括private成員和靜態成員)。
不過要注意的是,當成員內部類擁有和外部類同名的成員變量或者方法時,會發生隱藏現象,即默認情況下訪問的是成員內部類的成員。如果要訪問外部類的同名成員,需要以下面的形式進行訪問:
雖然成員內部類可以無條件地訪問外部類的成員,而外部類想訪問成員內部類的成員卻不是這么隨心所欲了。在外部類中如果要訪問成員內部類的成員,必須先創建一個成員內部類的對象,再通過指向這個對象的引用來訪問:
內部類可以擁有private訪問權限、protected訪問權限、public訪問權限及包訪問權限。比如上面的例子,如果成員內部類Inner用private修飾,則只能在外部類的內部訪問,如果用public修飾,則任何地方都能訪問;如果用protected修飾,則只能在同一個包下或者繼承外部類的情況下訪問;如果是默認訪問權限,則只能在同一個包下訪問。這一點和外部類有一點不一樣,外部類只能被public和包訪問兩種權限修飾。我個人是這么理解的,由於成員內部類看起來像是外部類的一個成員,所以可以像類的成員一樣擁有多種權限修飾。
2.局部內部類
局部內部類是定義在一個方法或者一個作用域里面的類,它和成員內部類的區別在於局部內部類的訪問僅限於方法內或者該作用域內。
局部內部類就像是方法里面的一個局部變量一樣,是不能有public、protected、private以及static修飾符的。
3、匿名內部類
匿名內部類也是不能有訪問修飾符和static修飾符的。
匿名內部類是唯一一種沒有構造器的類。正因為其沒有構造器,所以匿名內部類的使用范圍非常有限,大部分匿名內部類用於接口回調。匿名內部類在編譯的時候由系統自動起名為Outter$1.class。一般來說,匿名內部類用於繼承其他類或是實現接口,並不需要增加額外的方法,只是對繼承方法的實現或是重寫。
4、靜態內部類
靜態內部類也是定義在另一個類里面的類,只不過在類的前面多了一個關鍵字static。靜態內部類是不需要依賴於外部類的,這點和類的靜態成員屬性有點類似,並且它不能使用外部類的非static成員變量或者方法,這點很好理解,因為在沒有外部類的對象的情況下,可以創建靜態內部類的對象,如果允許訪問外部類的非static成員就會產生矛盾,因為外部類的非static成員必須依附於具體的對象。
