1. 程式人生 > >Core Java

Core Java

file 一行 集合 add ... 是否 map() builder cal

Java 語言核心
1. 面向對象
1) 封裝(成員、方法定義、構造方法、訪問控制、 內部類、static、final)

a.成員和方法的定義,內存結構
JVM內存可以分為:方法區、堆、棧
方法區:類的信息(類的定義、方法代碼、
靜態的成員)
持久(類在第一次被使用時,裝入方法區
JDK的核心類是在JVM啟動的時候自動裝入 的)、唯一(只會裝入一次)
堆:通過new關鍵字創建的對象

持有(被引用指向、在集合中)、
回收(當對象不再被持有時)
棧:在方法中聲明的局部變量
方法調用完之後即會清空

b.構造方法
初始化成員變量
子類的構造方法必須調用父類的構造方法,為了
保證子類中從父類繼承的成員被妥善的初始化
一般情況下Java類都要提供一個無參的構造方法
c.訪問控制
類(為內部) public defualt
成員 public protected default private

public 封裝對外提供的功能
盡量要保證其穩定性
要對參數進行合法性驗證,保證其健壯性
//IllegalArgumentException
必須妥善的處理異常
private 一個類中,多個方法中的公共部分
protected 多個類中的冗余部分,在父類中封裝

成員變量和屬性的區別!!!

設置emp對象的xxx屬性為“goodman”
等價於調用emp的setXxx("goodman")

獲取emp對象的xxx屬性
等價於String name = emp.getXxx();

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