Core Java
Java 語言核心
1. 面向對象
1) 封裝(成員、方法定義、構造方法、訪問控制、 內部類、static、final)
a.成員和方法的定義,內存結構
JVM內存可以分為:方法區、堆、棧
方法區:類的信息(類的定義、方法代碼、
靜態的成員)
持久(類在第一次被使用時,裝入方法區
JDK的核心類是在JVM啟動的時候自動裝入 的)、唯一(只會裝入一次)
堆:通過new關鍵字創建的對象
回收(當對象不再被持有時)
棧:在方法中聲明的局部變量
方法調用完之後即會清空
b.構造方法
初始化成員變量
子類的構造方法必須調用父類的構造方法,為了
保證子類中從父類繼承的成員被妥善的初始化
一般情況下Java類都要提供一個無參的構造方法
c.訪問控制
類(為內部) public defualt
成員 public protected default private
盡量要保證其穩定性
要對參數進行合法性驗證,保證其健壯性
//IllegalArgumentException
必須妥善的處理異常
private 一個類中,多個方法中的公共部分
protected 多個類中的冗余部分,在父類中封裝
成員變量和屬性的區別!!!
設置emp對象的xxx屬性為“goodman”
等價於調用emp的setXxx("goodman")
獲取emp對象的xxx屬性
d.內部類
公有類 public
包內類 default
內部類 定義在一個類內部(多線程)
匿名類 定義在一個方法中
e.static
static方法
定義在類中的一個方法,
該方法不對該類的對象進行操作
其操作僅僅和輸入相關(參數)
定義在該類中完全是出於邏輯上的考慮
static成員
static final 常量在編譯的時候會被替換為常量值
定義該常量的類甚至都不會被加載
f.final
類前很少寫final,動態代理
方法前寫final,防止方法被無意中重寫
2) 類和類之間的關系(關聯、依賴、繼承)
關聯
public class A {
private B b;
public A() {
b...
}
}
public class B {
}
依賴
public class A {
public void f(B b) {}
public B g() {}
}
public class B {
}
關聯優於繼承(如果僅僅是重用,不需要繼承)
依賴優於關聯(如果僅僅是一個方法要用到,不 需要關聯)
3) 多態(抽象類、接口)
Pet P = new Cat();
Growsable g = new Cat();
*4) 常見的設計模式
2. JavaSE核心
1) String、StringBuilder、(Commons)
String類
String str1 = "abc";
String str2 = "abc";
int length()
String name = ....;
boolean b = "whatisjava".equals(name)
.equalsIgnoreCase
int indexOf(String str)
int indexOf(String str, int fromIndex)
String substring(int start, int end)
String[] split(String regx)
String trim()
StringBuilder
StringBuilder append(...)
StringBuilder delete(int start, int end)
StringBuilder insert(..., int fromIndex
2) Date、Calendar、SimpleDateFormat
java.util.Date
Date d = new Date();
long getTime();
void setTime(long m);
java.util.Calendar
Calendar c = Calendar.getInstance();
c.set(Calendar.YEAR, 2013);
c.set(Calendar.MONTH, 9)
c.set(Calendar.DAY, 1)
System.out.println
(c.get(Calendar.DAY_OF_WEEK));
SimpleDateFormat
SimpleDateFormat sdf =
new SimpleDateFormat("yyyy-MM-dd");
String str = sdf.format(new Date());
Date date = sdf.parse(str);
3) 集合框架、ArrayList、HashMap
如何選取List和Map:
List 線性表 排序,按下標索引
Map 查找表 查找
Map<String,Student> map = ...
map.put(stu.getName(),stu);
map.get("zhangsan");
class Student {
private String name;
private String score;
... ... ...
}
常見的實現類:
ArrayList, LinkedList
HashMap, TreeMap
常用的方法:
List<E>
追加:add(E e);
插入:add(int index, E e);
刪除:remove(E e); (和equals)
remove(int index);
獲取:E get(int index);
更改:E set(int index, E e)
set(i, list.set(j, list.get(i)));
是否包含:contains(Object o) (和equals)
清空:clear();
大小:size();
addAll,removeAll
Map<K,V>
put(K k, V v);
V get(K k)
boolean containsKey(K k)
遍歷:
Map<String, Object> map =
new HashMap<String, Object>();
Set<String> keys = map.keySet();
for (String key : keys) {
System.out.println(key+":"+map.get(key));
}
4) FIS/FOS、BIS/BOS、ISR/OSW、BR/PW、OIS/OOS
文件流(節點)連接文件
FileInputStream
FileOutputStream
緩存流(處理)
通過內部的緩沖區提高讀寫效率
BufferedInputStream
BufferedOutputStream
字符轉化流(處理)
把字節數據根據特定的編碼轉化成字符
InputStreamReader
OutputStreamWriter
字符緩存流(處理)
readLine可以一次讀取一行字符
BufferedReader
字符打印流(處理)
print,println
可以把各種數據轉化為字符串形式輸出
PrintWriter
對象流(處理)
writeObject
readObject
對象的序列化和反序列化
ObjectInputStream
ObjectOutputStream
拷貝文件
FIS fis = new FIS("src");
FOS fos = new FOS("dest");
BIS bis = new BIS(fis);
BOS bos = new BOS(fos);
int b = -1;
while((b=bis.read())!=-1) {
bos.writer(b);
}
bis.close();
// bos.flush();
bos.close();
讀寫文本文件
FOS fos = new FOS("src.txt");
OSW osw = new OSW(fos, "utf-8");
osw.write("你好");
osw.close();
FIS fis = new FIS("dest.txt");
ISR isr = new ISR(fis,"utf-8");
char c = (char)isr.read();
isr.close();
讀文本文件,一次讀一行
FIS fis = new FIS("dest.txt");
ISR isr = new ISR(fis,"utf-8");
BR br = new BR(isr);
String line = br.readLine();
br.close();
將各種數據信息的字符串表示輸出到文件中
FOS fos = new FOS("log.txt");
OSW osw = new OSW(fos);
PW pw = new PW(osw);
pw.println(emp);
pw.println(250);
pw.println("hello");
... ... ...
從控制臺輸入一行數據
BR br = new BR(new ISR(System.in));
String line = br.readLine();
從Socket中輸入數據(文本)
InputStream is = socket.getInputStream();
ISR isr = new ISR(is);
BR br = new BR(isr);
向Socket中輸出數據(文本)
OutputStream os = socket.getOutputStream();
OSW osw = new OSW(os);
PW pw = new PW(osw);
5) 多線程和網絡
a. 線程和進程的區別
進程操作系統的多個任務(不同的內存)
線程是在一個進程中的多個任務 (同一內存)
b. Java語言中創建線程的方法
public class MyThread extends Thread {
public void run() {...}
}
MyThread t = new MyThread();
t.start();
public class Some implements Runnable {
public void run() {...}
}
Thread t = new Thread(new Some());
t.start();
public class BO {
private class MyThread extends Thread {
public void run() {...}
}
}
c. 線程的狀態和相互轉換
d. 線程同步
多個線程訪問同一個可變的對象
訪問的方法加鎖(效率下降)
synchronized
public void f() {
... ... ...
synchronized(obj) {
XXX XXX XXX
}
... ... ...
}
e.線程安全API
StringBuffer -- StringBuilder
Vector * -- ArrayList
Hashtable * -- HashMap
Collections的方法對List和Map的同步
1. 表單提交時GET和POST的區別?
1) GET和POST是兩種不同的協議
POST在協議中可以傳輸數據
GET只能在請求地址中通過請求參數傳輸數據
(限於文本)
2) POST提交的數據量受服務器的限制
GET提交的數據量受瀏覽器地址欄長度的限制
3) 都不安全,如果要保證安全使用HTTPS協議
2. 描述Servlet的生命周期
1) Servlet重要的生命周期方法(容器調用的方法):
init, service, destroy
默認情況下第一次訪問Servlet時實例化對象
(也可以配置為啟動即加載)
實例化後調用init
每次收到請求調用service
實例被銷毀前調destroy
2) 單實例,多線程
3. 列舉HttpServletRequest的常用方法
1) 獲取請求參數, getParameter(String name);
getParameterMap();
2) 獲得請求的地址,getRequestURI();
3) 獲取請求的應用名,getContextPath();
4) 獲取請求的頭信息,getHeader(String name);
5) 根據請求信息中的SessionID獲得Session,
getSession();
6) 作為一個容器,存取數據,
setAttribute(String name, Object value);
getAttribute(String name);
7) 設置解碼的字符集(默認為ISO8859-1)
setCharacterEncoding(String charset)
8) 獲取請求信息中提交的Cookie
getCookies();
9) 實現轉發,
request.getRequestDispatcher("...")
.forward(request, response)
4. 列舉HttpServletResponse的常用方法
1) 獲得響應內容的輸出流
getWriter() 文本信息
getOutputStream() 字節信息
2) 設置響應頭中ContentType setContentType(String)
3) 通過響應頭傳遞Cookie addCookie
4) 生成一個重定向響應 sendRedirect
5. 談一談使用Session的經驗
1) 不能放安全級別要求高的信息 (SessionID容易獲得)
2) 不能放大量的信息(服務器的性能問題)
3) 不能放持久性的信息
能放的很有限(一般不是業務信息,
而是為了操作方便的信息):
登錄後的用戶ID,服務器端生成的驗證碼,....
6. 轉發和重定向的區別?
1) 轉發請求一個組件,該組件在服務器端
把請求轉發給另外一個組件
由另外一個組件實現相應。(一個請求)
2) 重定向請求一個組件,該組件生成一個重定向相應
瀏覽器收到此響應後訪問其他的組件。(多個請求)
3) 一個事情兩個組件協同完成,用轉發(JSP Model2)
兩個組件之間一般需要傳遞數據用request
一個事情完成,自動的開始另外一個事情,用重定向
7. 相對地址和絕對地址的區別
1)
鏈接,表單提交 b.jsp /webapp/jsp/b.jsp
重定向 b.jsp /webapp/jsp/b.jsp
轉發 b.jsp /jsp/b.jsp
2) 相對地址在轉發時容易出錯!
8. Java WEB開發中的編碼問題
1) 頁面顯示
Servlet
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
JSP
<[email protected] pageEncoding="utf-8"%>
<[email protected] contentType="text/html; charset=utf-8"%>
2) 提交數據的問題
Servlet
request.setCharacterEncoding("utf-8");
request.getParameter("...");
JSP 這樣寫是否有效???一般用Filter
<%
request.setCharacterEncoding("utf-8");
request.getParameter("...");
%>
Core Java