----------------------------------------------------------------------------------------------------
在Java語言中,判斷兩個對象是否相等有兩種方法:
1.判斷兩個對象的內存地址是否相同;
2.判斷兩個對象的值是否相同。
‘==’運算符就是判斷內存地址是否相同的;Object類中的equals()方法也是根據(jù)內存地址來判斷,所以說如果一個類沒有覆蓋Object類中的equals()方法,那么用‘==’和 equals()是等同的;但Java API中的一些類覆蓋了Object類的equals()方法,實現(xiàn)按‘值’進行比較。這些類包括:
String、Date、Java所有包裝類(基本數(shù)據(jù)類型包裝類);
----------------------------------------------------------------------------------------------------
Java集合類之Set集:
它最像數(shù)學中的集合—無序的;不能有重復元素。它有兩個實現(xiàn)類:HashSet和TreeSet。
HashSet類按照哈希酸法來存/取集合中的對象,存:根據(jù)對象的哈希碼類計算對象應該存放的位置。注意,HashSet集合里的元素如果覆蓋了Object類中的equals()方法,那么也應該覆蓋Object類中的HashCode()方法,否則兩個對象相等(用equals()方法判斷),卻有不同的哈希碼,從而把兩個對象存儲到集合的不同地方,是HashSet不能正常工作。換過來說,HashSet里添加的對象不能重復,依據(jù)是兩個對象的hashCode不同 。
TreeSet類實現(xiàn)了SortedSet接口,能對集合中的對象排序。
1.自然排序
TreeSet調用ComparaTo()方法比較對象的大小,進行排序。
向TreeSet里加入的對象必須滿足兩個前提:一,同類型,否則無法排序;二,實現(xiàn)了Comparable接口,否則無法調用ComparaTo()方法。有一條不滿足將會拋出ClassCastException。
Set<Role> roleSet = new HashSet<Role>();
for(int i = 0;i < roles.length;i++){
Role role = new Role();
role = (Role)session.get(Role.class,roles[i]);
roleSet.add(role);//如果是TreeSet添加第二個對象時會出錯
}
開始我用的是TreeSet,用短點調試,每循環(huán)到第二次就會報錯-類型轉換異常,無意間換成了HashSet對了,但是不知道原因,查了些網(wǎng)站都是泛泛介紹下兩者的區(qū)別,一個有序,一個無序,但都沒深入的去介紹,知道今天看了孫衛(wèi)琴‘孫衛(wèi)琴精通Hibernate才豁然開朗。原因就是我的Role類沒有實現(xiàn)Comparable接口,不能進行對象的比較,無從排序。
學習一個新知識,死記可以記住一周,看懂可以記得一月,而寫出來一年忘不了,及時進行總結,堅持寫blog是一個很好的習慣,深刻領悟到。
2.客戶化排序
用戶可以先創(chuàng)建一個實現(xiàn)了java.util.Comparator接口的類xxxComparator()來指定具體的排序方式,如下構造TreeSet實例:Set set = new TreeSet(new xxxComparator());可以實現(xiàn)按xxxComparator()中定義的排序方式排序。
用Hibernate來做持久化框架時最好每個PO都重寫equals()和hashCode()方法,并且應該按照業(yè)務主鍵來比較/計算。為什么不按照主鍵來比較計算,請參考孫衛(wèi)琴精通Hibernate第15.1節(jié)的介紹。
Java集合類之List:
list最大的特點對象以線性方式存儲,可以插人重復元素;他的實現(xiàn)類有ArrayList和LinkedList,ArrayList以大小可變的數(shù)組形式存儲對象,LinkedList以鏈表數(shù)據(jù)結構來存儲對象;還一個類似ArrayList的Vector,唯一的區(qū)別是Vector采用了同步機制?
--------------------------------------------------------------------------------------------------
AJAX不是一種新技術,而是一種新模式,是幾中技術的組合。它是異步JS+XML的組合。
AJAX速度為什么會快?因為整個頁面不刷新,刷新的只是提交的表單范圍,其他范圍的數(shù)據(jù)不用重新去請求服務器。
AJAX采用異步機制,當用戶發(fā)送http請求后,瀏覽器不會被掛起,等著服務器響應,而是繼續(xù)對用戶與頁面進行響應,并在服務器響應達到時進行處理。在服務器端,把對客戶端的響應序列化成XML,并把XML寫入HttpServletResponse。回到客戶端時,調用注冊在xmlHttpRequest上的回調函數(shù),處理服務器返回的XML,最后,根據(jù)服務器返回的數(shù)據(jù),用javaScript操縱頁面的HTML DOM,把用戶截面刷新。
DWR簡單說就是一個引擎,他把服務器端JAVA對象中的方法公開給javascript,就好象在本地調用方法一樣快捷。有了DWR,系統(tǒng)中不必再出現(xiàn)AJAX請求-響應循環(huán)代碼,這意味著客戶端再也不需要處理XMLHttpRequest對象,不必處理服務器端的響應,不用編寫對象序列化代碼,不用自己編碼生成XML文件。
---------------------------------------------------------------------------------------------------
用jtds連接sqlserver時出現(xiàn)java.sql.SQLException: "Network error IOException: Connection refused: connect"異常,折騰了半天突然想起一個叫SPX的東西,找了個sp4裝上,再試,好了。哎,已經(jīng)是第二次栽在這里了,也聽說過SP3 、SP4的重要性,但因為我第一次接觸數(shù)據(jù)庫、第一份工作沒有用到SP*之類的東西,經(jīng)常忽視掉它,到現(xiàn)在依然不明白為什么我以前不裝SP*也能正常運行。
又花了我倆小時時間。
利用struts開發(fā)項目,報錯java.lang.IllegalArgumentException: Resources cannot be null.
原因之一是因為找不到formBean里定義的form類,其一是路徑錯,其二是你的form類沒有繼承Struts的ActionForm,我屬于第二種情況,忘記寫上extends ActionForm。
又花我倆小時。
在eclipse里書寫代碼更容易發(fā)現(xiàn)錯誤,但它的速度實在慢,所以可以折中,對于一些重要的文件,比如xml,先在editPlus里編寫好,再從eclipse里打開,看看是否有錯誤。
資源文件:不必要做國際化時是沒用的。
盡量在高層捕獲異常,但這樣的話每個地方都要捕獲異常,如果在低層捕獲異常,那么調用它的每個地方都不用捕獲,使代碼簡潔易讀。到底哪種好呢?
---------------------------------------------------------------------------------------------------
web.xml里的hibernateFilter段:
<filter>
<filter-name>hibernateFilter</filter-name>
<filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
<init-param>
<param-name>sessionFactoryBeanName</param-name>
<param-value>sessionFactory</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>hibernateFilter</filter-name>
<url-pattern>*.do</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>hibernateFilter</filter-name>
<servlet-name>dwr-invoker</servlet-name>
</filter-mapping>
作用:當用hibernate查詢時,查詢完畢后session關閉,此時在結果集里是沒有子表里的信息的,當取其結果集中子表信息時session再次被打開,查詢子表信息,此功能就由這一段來實現(xiàn)。
加了這一段有時會出現(xiàn)以下異常:
Write operations are not allowed in read-only mode (FlushMode.NEVER) - turn your Session into FlushMode.AUTO or remove 'readOnly' marker from transaction definition
錯誤解決辦法:
<init-param>
<param-name>singleSession</param-name>
<param-value>false</param-value>
</init-param>
不解是什么原理。
只知道這樣可能會出現(xiàn)數(shù)據(jù)庫連接數(shù)過多異常。
--------------------------------------------------------------------------------------------
提問:
1.Object類中hashCode()方法如何定義的呢,哈希碼如果計算的?
--------------------------------------------------------------------------------------------------
java中有自帶的正則表達式引擎,位于java.util.regex包。里面包括兩個類Pattern、Matcher。
1.書寫用于匹配的表達式;
String regEx="a|f";
2.將正則表達式編譯為Pattern的實例,得到一個匹配模式。
Pattern p=Pattern.compile(regEx);
3.調用匹配模式的matcher(str)方法得到一個匹配器
Matcher m=p.matcher(str);
matcher只是得到了一個包含“正則表達式”和“字符串信息”匹配器的實例,并沒有進行任何的匹配、查找動作。而對字符串的匹配及其他操作都在此匹配器 m 上進行。
使用舉例:
boolean result=m.find();
查找是否有匹配項;
String newStr = m.replaceAll("p");
將匹配子串都替換為"p";注意原來字符串的內容并沒有改變,因為字符串本身是不可邊量,所以字符串內容不會改變。
---------------------------------------------------------------------------------------------
java中的流分為兩中:字節(jié)流、字符流。分別由四個抽象類來表示InputStream、outputStream、Reader和Writer,其他種類的流都是由他們派生出來的。
其他類如:BufferedReader是Reader的一個子類,它具有緩沖的功能,避免頻繁得從物理設備中讀取信息;
若目的地是文件需要用FileWriter來包裝,若要在寫過程緩沖需要用BufferedWriter包裝,若要格式化輸出需要再用PrintWriter包裝。
最基本的方法有read和write,其他用得最多的是readLine()方法。
posted on 2007-06-21 12:33
楊愛友 閱讀(517)
評論(0) 編輯 收藏