
2010年3月16日
MVC模式,學(xué)了快半年了,終于領(lǐng)悟到它的內(nèi)涵了。
M-model 模型,V-view 視圖,C-controler控制器
用戶訪問(wèn)到的是視圖層,也就是頁(yè)面,jsp;把請(qǐng)求給servlet也就是控制層,控制層調(diào)用業(yè)務(wù)層來(lái)做出相應(yīng)的處理,將信息返回給視圖層顯示出來(lái)。那么業(yè)務(wù)層怎么做呢,首先需要一個(gè)DAO也就是對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作,然后需要相應(yīng)的Bean。這樣思路就清晰了多了,數(shù)據(jù)層DAO封裝對(duì)數(shù)據(jù)庫(kù)的操作,業(yè)務(wù)層做處理來(lái)訪問(wèn)數(shù)據(jù)層,servlet層用來(lái)響應(yīng)視圖層請(qǐng)求。
在數(shù)據(jù)層和業(yè)務(wù)層中,每個(gè)類(lèi)都配一個(gè)接口,這樣的話,有便于以后程序的擴(kuò)展。
最近在做一個(gè)web項(xiàng)目,老師只把我們領(lǐng)進(jìn)了門(mén),自己修行可真難啊
例如 String a=new String("a");
String b="a";
boolean c=(a==b);
為什么c是false?
String 類(lèi)不是采用共享設(shè)計(jì)模式嗎。同樣的字符串應(yīng)該引用的是同樣的地址。可為什么是false呢?
如果是
String a="a";
String b="a";
boolean c=(a==b);
這個(gè)時(shí)候b就是true了
java.lang.String類(lèi)對(duì)大家來(lái)說(shuō)最熟悉不過(guò)了,我們寫(xiě)java程序很少能不用String的。本文講述如何正確的使用String,內(nèi)容主要涉及初始化、串聯(lián)和比較等操作。
首先我們必須清楚的一點(diǎn)是String類(lèi)是final類(lèi)型的,因此你不可以繼承這個(gè)類(lèi)、不能修改這個(gè)類(lèi)。我們使用String的時(shí)候非常簡(jiǎn)單,通常都是 String s = "hello",但是Java API中同時(shí)提供了一個(gè)構(gòu)造函數(shù)為String(String s),因此你也可以這樣使用String s = new String("hello"),對(duì)于后面這樣初始化一個(gè)String的方式是不推薦的,因?yàn)閚ew操作符意味著將會(huì)在heap上生成一個(gè)新的對(duì)象,如果這樣的操作發(fā)生在一個(gè)循環(huán)中,那么代價(jià)是慘重的。比如
for(int i = 0;i<1000;i++)
{
String s = new String("hello");
}
這將會(huì)創(chuàng)建1000個(gè)String類(lèi)型的對(duì)象,由于String類(lèi)是final的,因此這樣的操作事實(shí)上是每次都生成了一個(gè)新的String對(duì)象的。如果你使用String s = "hello";那么就可以實(shí)現(xiàn)復(fù)用了,為什么可以復(fù)用呢,下面會(huì)有解釋。
當(dāng)我們使用"+"實(shí)現(xiàn)串聯(lián)操作的時(shí)候,比如String s = "hello"+"world";其實(shí)是通過(guò)StringBuffer類(lèi)的append()方法實(shí)現(xiàn)的,最后返回String給s。如果有興趣的話,你可以寫(xiě)一個(gè)簡(jiǎn)單的例子,然后用javap看看虛擬機(jī)是如何工作的。在使用串聯(lián)的時(shí)候我們同樣應(yīng)該注意String是final類(lèi),如果你需要多次串聯(lián)比如:
String sql = "xxx";
sql = "xxxx";
sql = "ssssss";
那么為了提高效率節(jié)省空間,我們應(yīng)該自己用StringBuffer來(lái)替代"+";
通常對(duì)String的比較有兩種情況,一個(gè)是使用==,另一個(gè)是使用equals()方法,注意==是對(duì)對(duì)象的地址進(jìn)行比較的,而String中的 equals()方法是覆蓋了Object類(lèi)的方法,并且實(shí)現(xiàn)為對(duì)String對(duì)象的內(nèi)容的比較。所以String s1 = new String("hello");String s2 = new String("hello"),我們對(duì)s1和s2進(jìn)行上述比較的時(shí)候,前者應(yīng)該返回false,因?yàn)槭褂胣ew生成的是兩個(gè)不同的對(duì)象。后者應(yīng)該返回 true因?yàn)樗麄兊膬?nèi)容是一樣的,都是"hello"。那么如果我們還有一個(gè)String s3 = "hello";他和s1的比較應(yīng)該是什么樣子的呢,答案是s1==s3為false,equals的比較位true。事實(shí)上String類(lèi)是維持著一個(gè) String池的,這個(gè)池初始化為空的,當(dāng)我們String x = "hello"的時(shí)候,hello就會(huì)被放入這個(gè)池中,當(dāng)我們?cè)俅蜸tring y = "hello"的時(shí)候,他首先去檢查池中是否存在一個(gè)和hello內(nèi)容一樣的對(duì)象,如果存在的話就會(huì)把這個(gè)引用返回給y,如果不存在的話,就會(huì)創(chuàng)建一個(gè)并放入到池中。這樣就實(shí)現(xiàn)了復(fù)用。在String有一個(gè)方法intern()他可以把String的對(duì)象放入到池沖并返回池中的對(duì)象。如果我們對(duì) s1(String s1 = new String("hello"))調(diào)用intern,s1 = s1.intern()這時(shí)候,我們?cè)侔裺1和s3進(jìn)行“==”的判斷,你會(huì)發(fā)現(xiàn)結(jié)果返回true!
看下面的例子
public class StringTest
{
public static void main(String[] args)
{
String s1 = "hello";
String s2 = new String("hello");
String s3 = new String("hello");
testString(s1,s2,s3);
s2 = s2.intern();
System.out.println("after s2.intern");
testString(s1,s2,s3);
}
private static void testString(String s1,String s2,String s3)
{
System.out.println("s1 = s2 is "+(s1==s2));
System.out.println("s2 = s3 is "+(s2==s3));
System.out.println("s1.equals(s2) is "+s1.equals(s2));
System.out.println("s2.equals(s3) is "+s2.equals(s3));
}
}
輸出結(jié)果為
s1 = s2 is false
s2 = s3 is false
s1.equals(s2) is true
s2.equals(s3) is true
after s2.intern
s1 = s2 is true
s2 = s3 is false
s1.equals(s2) is true
s2.equals(s3) is true
環(huán)境變量配置
JAVA_HOME=C:\soft\jdk1.6.0
classpath=;%JAVA_HOME%\lib\tools.jar;%JAVA_HOME%\lib\dt.jar;
path=%JAVA_HOME%\bin;
java 特點(diǎn)
1.面向?qū)ο螅?可移植性,跨平臺(tái);3.支持分布式的網(wǎng)絡(luò)應(yīng)用,多線程;4.安全性和健壯性;
一處編譯,處處運(yùn)行;
名詞解析 JDK java development kit
JavaEE-- java Enterprise Edition 企業(yè)版
JavaSE-- java Stand Edition 標(biāo)準(zhǔn)版
JavaME-- java Micro Edition 微型版
OCP--open(對(duì)擴(kuò)展開(kāi)發(fā)),close(對(duì)修改關(guān)閉)
SUN公司官方網(wǎng)站http://java.sun.com
JDK的安裝及目錄結(jié)構(gòu)
-bin目錄:存放可執(zhí)行文件
-lib目錄:存放JAVA的類(lèi)庫(kù)文件;
-include目錄:存放用于本地方法的文件;
-demo目錄:存放演示程序;
-jre目錄:存放Java運(yùn)行環(huán)境文件;
2. "System.out.println();"
System為一個(gè)類(lèi)(class),類(lèi)字段和類(lèi)方法前必須有static 修飾,并且該類(lèi)不能被實(shí)例化,即不能被創(chuàng)建新對(duì)象;
out為字段 靜態(tài)方法里不能用非靜態(tài)變量-----解決方案:將變量改為靜態(tài)變量或者聲明一個(gè)新對(duì)象再次調(diào)用變量
3. Eclipse 簡(jiǎn)單應(yīng)用
建工作空間 → 建一個(gè)包 → 建類(lèi)
4.核心能力培養(yǎng)
①自學(xué)能力 主動(dòng)性、自我控制(EQ)
②獨(dú)立能力 事情==》獨(dú)立思考分析--》出現(xiàn)問(wèn)題,解決問(wèn)題,查資料--》
③團(tuán)隊(duì)合作能力 技術(shù)密集,溝通==》敢于,有效溝通
④英文閱讀能力 官方文檔(API 開(kāi)發(fā)文檔,規(guī)范)
⑤高質(zhì)量編程能力 邏輯性 健壯性 可讀性 設(shè)計(jì)原則(輸入兩個(gè)數(shù)字A和B,“+”) 性能
5.學(xué)習(xí)方法
①筆記
②記憶:大學(xué)的理解+中學(xué)的記憶
③學(xué)習(xí)時(shí)間:8點(diǎn)到十一點(diǎn)
④英文記憶
6.語(yǔ)言的演變
①需求的變化
②編程藝術(shù)
7.設(shè)計(jì)新語(yǔ)言
①易用性
②安全性
③效率性高
④穩(wěn)定性
⑤可擴(kuò)展性
8.數(shù)據(jù)運(yùn)算
被除數(shù)除以除數(shù) 6/5=1;(取整) 5%6=5;(取余)
a+=b;相當(dāng)于a=a+b; 依次類(lèi)推,乘法,除法,減法
閑著沒(méi)事干,把以前的東西寫(xiě)寫(xiě)
對(duì)象流(對(duì)象序列化與反序列化)
ObjectOutputStream和ObjectInputStream 序列化:把對(duì)象寫(xiě)到一個(gè)輸入流中;反序列化:從一個(gè)輸入流中讀取一個(gè)對(duì)象。Serializable序列化接口沒(méi)有方法或字段,僅用于標(biāo)識(shí)可序列化的語(yǔ)義。
序列化步驟:
1.創(chuàng)建一個(gè)對(duì)象輸出流,,該輸出流可以包裝其他類(lèi)型輸出流
2.通過(guò)這個(gè)類(lèi)的writeObject()來(lái)寫(xiě)對(duì)象
反序列化:
1.創(chuàng)建一個(gè)對(duì)象輸入流,它可以包裝其它類(lèi)型的輸入流
2.通過(guò)該對(duì)象輸入流的readObject()方法來(lái)讀取對(duì)象
要序列化的對(duì)象要實(shí)現(xiàn)Serializable這個(gè)接口 要注意讀取的順序
每個(gè)對(duì)象的hashcode是唯一的,也就是說(shuō)內(nèi)存地址是唯一,直到被銷(xiāo)毀。
在String“= =”比較的是地址,equals()比較的是內(nèi)容,在Object中,“==”比較的是地址,equals()比較的是地址(如果不重寫(xiě)此方法),重寫(xiě)后可比較內(nèi)容
下面是部分可用代碼:
1
//存儲(chǔ)數(shù)據(jù),序列化對(duì)象數(shù)組
2
public void ser(Object obj[]) throws Exception
{
3
OutputStream ops=new FileOutputStream("D:\\test\\objcetFile.txt");
4
ObjectOutputStream out=new ObjectOutputStream(ops);
5
6
out.writeObject(obj);
7
out.close();
8
}
9
10
//讀取數(shù)據(jù),反序列化對(duì)象數(shù)組
11
public Object[] dser() throws Exception
{
12
13
14
InputStream ins=new FileInputStream("D:\\test\\objcetFile.txt");
15
ObjectInputStream ois=new ObjectInputStream(ins);
16
17
Object[] obj=(Object[])ois.readObject();
18
ois.close();
19
20
return obj;
21
22
}
該代碼中存儲(chǔ)的是對(duì)象數(shù)組
流是程序和外界進(jìn)行數(shù)據(jù)交換的通道。分為輸入流InputStream和輸出流OutputStream。程序通過(guò)輸入流從數(shù)據(jù)源讀取數(shù)據(jù),通過(guò)輸出流向目的地寫(xiě)數(shù)據(jù)。
在計(jì)算機(jī)世界里,信息就是數(shù)據(jù),信息的交換就是數(shù)據(jù)流。就好比我們?nèi)粘I钪械目梢钥吹降乃骷翱床坏降碾娏鞫际且环N流。
流是指一連串流動(dòng)的字符(應(yīng)該是字節(jié)),以先進(jìn)先出的方式發(fā)送信息的通道。從傳輸上分為字節(jié)流和字符流,字節(jié)占8位,字符占16位。從使用上分為節(jié)點(diǎn)流和過(guò)濾流,其中過(guò)濾流包含處理流、包裝流。
下面我們來(lái)說(shuō)一下流的創(chuàng)建,創(chuàng)建一個(gè)流,那么內(nèi)存怎么分配呢?首先是對(duì)象分配內(nèi)存,然后是OS分配資源內(nèi)存。當(dāng)這個(gè)流用完后,我們要進(jìn)行的操作的是關(guān)閉這個(gè)流,Close通知OS釋放資源(其中OS為操作系統(tǒng))。
輸入流:
InputStream類(lèi)是所有輸入流的父類(lèi),它是一個(gè)抽象類(lèi),不能被實(shí)例化。它提供了一系列和讀取數(shù)據(jù)有關(guān)的方法。
int read(),int read(byte[] b)從數(shù)據(jù)源讀取數(shù)據(jù)
void close() 當(dāng)完成讀操作后,應(yīng)該關(guān)閉輸入流。
常用到的子類(lèi),ByteArrayInputStream字節(jié)數(shù)組輸入流, FileInputStream文件輸入流, StringBufferStream字符串緩沖輸入流, ObjectInputStream對(duì)象輸入流, FilterInputStream過(guò)濾輸入流,其中過(guò)濾輸入流中主要用到的是BufferedInputStream和DataInputStream(實(shí)現(xiàn)了DataInput接口,用于讀取基本數(shù)據(jù)類(lèi)型,如int 、long、float、double、boolean等)
有輸入流,就有相應(yīng)的輸出流,也就是說(shuō)將intput改為output。但是在這里要著重提到的是隨機(jī)讀取文件類(lèi)RandomAccessFile和對(duì)象流Object。本人對(duì)前者沒(méi)有多少嘗試,但對(duì)后者我就可以分享我的一點(diǎn)知識(shí)。對(duì)象流用到了對(duì)象的序列化和反序列化,序列化的意思就是把對(duì)象寫(xiě)到一個(gè)輸入流中;反序列化是從一個(gè)輸入流中讀取一個(gè)對(duì)象。如果要采用對(duì)象輸入輸出流,那么這個(gè)對(duì)象的類(lèi)必須實(shí)現(xiàn)可序列化接口。將對(duì)象也就是對(duì)象的成員變量作為整體,寫(xiě)到流中存儲(chǔ)到文件里邊。或者就是把對(duì)象放到數(shù)組里邊,將這個(gè)對(duì)象數(shù)組存入到同一個(gè)文件中,對(duì)其進(jìn)行操作,在沒(méi)有數(shù)據(jù)庫(kù)的情況下,我個(gè)人認(rèn)為這是最好的保存對(duì)象信息方法。
該睡覺(jué)了,先寫(xiě)到這里,明天將我所做的對(duì)象流代碼寫(xiě)到上邊,供大家參考交流
Java集合有三種
Set(集),List(列表),Map(映射)
在創(chuàng)建Java數(shù)組時(shí),必須明確指定數(shù)組長(zhǎng)度,數(shù)組一旦創(chuàng)建,其長(zhǎng)度就不能被改變。為了使程序能方便的存儲(chǔ)和操縱數(shù)目不固定的一組數(shù)據(jù),JDK類(lèi)庫(kù)提供了Java集合,所有Java集合類(lèi)都位于java.util包中。
1、Set(集):集合中的對(duì)象不按特定方式排序,并且沒(méi)有重復(fù)對(duì)象。TreeSet,HashSet
2、 List(列表):集合中的對(duì)象按照索引位置排序,可以有重復(fù)對(duì)象,允許按照對(duì)象在集合中的索引位置檢索對(duì)象。List與數(shù)組有些相似。ArrayList
3、Map(映射):集合中的每一個(gè)元素包含一對(duì)鍵對(duì)象和值對(duì)象,集合中沒(méi)有重復(fù)的鍵對(duì)象,值對(duì)象可以重復(fù)。它的有些實(shí)現(xiàn)類(lèi)能對(duì)集合中的鍵對(duì)象進(jìn)行排序。
今天老師講了,把對(duì)象存儲(chǔ)到集合里,這樣就可以對(duì)對(duì)象進(jìn)行排序,重寫(xiě)equals()方法,或者重寫(xiě)compareTo方法
Set<類(lèi)對(duì)象> set=new HashSet<類(lèi)對(duì)象>();
集合也是一種比較重要的存儲(chǔ)工具。