java基礎題

[size=medium][color=red]20100414更新[/color][/size]

一、從´a´到´z´字母,隨機取10個不能相同的字母,然後對這10個字母按從小到大的方式排序。打印出排序前的字母序列與排序後的字母序列。

實現思路1:

1. 實例一個HashMap對象;

2. 實例一個ArrayList對象;

3. 調用隨機函數*26+‘a’產生字母;

4. for循環10次;

5. 循環體內調用判斷map是否有重複key,若存在則i--;否則將結果添加到map及list中;

6. 利用Collections.sort(list)方法從小到大的方式排序

7. 最後輸出list中10個從小到大排序不同的字母;

// 方法1

HashMap map = new HashMap();

List list = new ArrayList();

for (int i = 0; i < 10; i++) {

char c = (char) (Math.random() * 26 + 'a');

if (map.containsKey(c)) {

i--;

}

map.put(c, c);

list.add(c);

}

Collections.sort(list);

for (int i = 0; i < list.size(); i++) {

System.out.print(list.get(i));

}



實現思路2:

1. 實例一個HashSet對象;

2. 調用隨機函數*26+‘a’產生字母;

3. for循環10次;

4. 循環體內調用判斷set是否有重複,若存在則i--;否則將結果添加到set中;

5. 利用TreeSet comparator()方法從小到大的方式排序

6. 最後輸出list中10個從小到大排序不同的字母;



//方法2

HashSet set=new HashSet();

for (int i = 0; i < 10; i++) {

char c = (char) (Math.random() * 26 + 'a');

if (set.contains(c)) {

i--;

}

set.add(c);

}

SortedSet ss= new TreeSet(set);

ss.comparator();

System.err.println(ss);

方法三:

實現思路:

1. 生成26個字母存入與數組中;

2. 隨機產生10個數字,並以數字爲數組下標取10個字母;

3. 調用Arrays.sort(cha)排序;



public static void getChar(int count) {

char[] allChar = new char[26];

for (int i = 97; i < 123; i++) {

allChar[i - 97] = (char) i;

}

String s = "";

while (count > 0) {

double numDouble = Math.random() * 26;

int position = (int) numDouble / 1;

String str = String.valueOf(allChar[position]);

if(s.indexOf(str)!=-1)

continue;

s+=str;

count--;

}

System.out.println(s);

System.out.println(sortNum(s));

}





public static String sortNum(String str){

char[] cha = str.toCharArray();

Arrays.sort(cha);

return new String(cha);

}


[size=medium][color=red]20100416更新[/color][/size]

1:HttpServletRequest的getParameter和getAttribute方法有什麼區別?
  request.getParameter()方法傳遞的數據,會從Web客戶端傳到Web服務器端,代表HTTP請求數據。request.getParameter()方法返回String類型的數據。

request.setAttribute()和getAttribute()方法傳遞的數據只會存在於Web容器內部,在具有轉發關係的Web組件之間共享。這兩個方法能夠設置Object類型的共享數據。

request.getParameter()取得是通過容器的實現來取得通過類似post,get等方式傳入的數據。 request.setAttribute()和getAttribute()只是在web容器內部流轉,僅僅是請求處理階段。
getAttribute是返回對象,getParameter返回字符串

總的來說:request.getAttribute()方法返回request範圍內存在的對象,而request.getParameter()方法是獲取http提交過來的數據。

2:一般Singleton模式通常有幾種形式
public class Singleton {
private Singleton(){}
//在自己內部定義自己一個實例,是不是很奇怪?
//注意這是private 只供內部調用
private static Singleton instance = new Singleton();
//這裏提供了一個供外部訪問本class的靜態方法,可以直接訪問
public static Singleton getInstance() {
return instance;
}
}
第二種形式:
public class Singleton {
private static Singleton instance = null;
public static synchronized Singleton getInstance() {
if (instance==null)
instance=new Singleton();
return instance; }
}
使用Singleton.getInstance()可以訪問單態類。
上面第二中形式是lazy initialization,也就是說第一次調用時初始Singleton,以後就不用再生成了。
注意到lazy initialization形式中的synchronized,這個synchronized很重要,如果沒有synchronized,那麼使用getInstance()是有可能得到多個Singleton實例。關於lazy initialization的Singleton有很多涉及double-checked locking (DCL)的討論,有興趣者進一步研究。

一般認爲第一種形式要更加安全些。
3.在數據庫中條件查詢速度很慢的時候,如何優化?
a.建索引
b.減少表之間的關聯
c.優化sql,儘量讓sql很快定位數據,不要讓sql做全表查詢,應該走索引(具體怎麼優化有專門的文章介紹)
d.簡化查詢字段,沒用的字段不要,已經對返回結果的控制,儘量返回少量數據

4.在hibernate中進行多表查詢,每個表中各取幾個字段,也就是說查詢出來的結果集並沒有一個實體類與之對應,如何解決這個問題?
解決方案一,按照Object[]數據取出數據,然後自己組bean
解決方案二,對每個表的bean寫構造函數,比如表一要查出field1,field2兩個字段,那麼有一個構造函數就是Bean(type1 filed1,type2 field2) ,然後在hql裏面就可以直接生成這個bean了。具體怎麼用請看相關文檔,我說的不是很清楚。

5:Hibernate session接口的get和load方法有何異同?
當出現異常時get()返回NULL,而load()則會拋出異常.

6:spring裏面事務的傳播屬性和事務隔離級別是怎麼回事?
Spring聲明式事務讓我們從複雜的事務處理中得到解脫。使得我們再也無需要去處理獲得連接、關閉連接、事務提交和回滾等這些操作。再也無需要我們在與事務相關的方法中處理大量的try…catch…finally代碼。 我們在使用Spring聲明式事務時,有一個非常重要的概念就是事務屬性。事務屬性通常由事務的傳播行爲,事務的隔離級別,事務的超時值和事務只讀標誌組成。我們在進行事務劃分時,需要進行事務定義,也就是配置事務的屬性。 Spring在TransactionDefinition接口中定義這些屬性,以供PlatfromTransactionManager使用, PlatfromTransactionManager是spring事務管理的核心接口。 getTimeout()方法,它返回事務必須在多少秒內完成。 isReadOnly(),事務是否只讀,事務管理器能夠根據這個返回值進行優化,確保事務是隻讀的。 getIsolationLevel()方法返回事務的隔離級別,事務管理器根據它來控制另外一個事務可以看到本事務內的哪些數據。 在TransactionDefinition接口中定義了五個不同的事務隔離級別ISOLATION_DEFAULT 這是一個PlatfromTransactionManager默認的隔離級別,使用數據庫默認的事務隔離級別.另外四個與JDBC的隔離級別相對象 ISOLATION_READ_UNCOMMITTED 這是事務最低的隔離級別,它充許別外一個事務可以看到這個事務未提交的數據。這種隔離級別會產生髒讀,不可重複讀和幻像讀。 例如: Mary的原工資爲1000,財務人員將Mary的工資改爲了8000,但未提交事務 與此同時,Mary正在讀取自己的工資 Mary發現自己的工資變爲了8000,歡天喜地! 而財務發現操作有誤,而回滾了事務,Mary的工資又變爲了1000. 像這樣,Mary記取的工資數8000是一個髒數據。
1: 保證一個事務修改的數據提交後才能被另外一個事務讀取。
ISOLATION_READ_COMMITTED 保證一個事務修改的數據提交後才能被另外一個事務讀取。另外一個事務不能讀取該事務未提交的數據。這種事務隔離級別可以避免髒讀出現,但是可能會出現不可重複讀和幻像讀。 ISOLATION_REPEATABLE_READ 這種事務隔離級別可以防止髒讀,不可重複讀。但是可能出現幻像讀。它除了保證一個事務不能讀取另一個事務未提交的數據外,還保證了避免下面的情況產生(不可重複讀)。 在事務1中,Mary 讀取了自己的工資爲1000,操作並沒有完成 在事務2中,這時財務人員修改了Mary的工資爲2000,並提交了事務. 在事務1中,Mary 再次讀取自己的工資時,工資變爲了2000 在一個事務中前後兩次讀取的結果並不致,導致了不可重複讀。 使用ISOLATION_REPEATABLE_READ可以避免這種情況發生。 ISOLATION_SERIALIZABLE 這是花費最高代價但是最可靠的事務隔離級別。事務被處理爲順序執行。除了防止髒讀,不可重複讀外,還避免了幻像讀。 目前工資爲1000的員工有10人。 事務1,讀取所有工資爲1000的員工。 共讀取10條記錄 這時另一個事務向employee表插入了一條員工記錄,工資也爲1000 事務1再次讀取所有工資爲1000的員工 共讀取到了11條記錄,這就產生了幻像讀。 ISOLATION_SERIALIZABLE能避免這樣的情況發生。但是這樣也耗費了最大的資源。 getPropagationBehavior()返回事務的傳播行爲,由是否有一個活動的事務來決定一個事務調用。 在TransactionDefinition接口中定義了七個事務傳播行爲。
2: 如果存在一個事務,則支持當前事務。如果沒有事務則開啓一個新的事務。
PROPAGATION_REQUIRED 如果存在一個事務,則支持當前事務。如果沒有事務則開啓一個新的事務。 使用spring聲明式事務,spring使用AOP來支持聲明式事務,會根據事務屬性,自動在方法調用之前決定是否開啓一個事務,並在方法執行之後決定事務提交或回滾事務。 單獨調用methodB方法 相當於 Spring保證在methodB方法中所有的調用都獲得到一個相同的連接。在調用methodB時,沒有一個存在的事務,所以獲得一個新的連接,開啓了一個新的事務。 單獨調用MethodA時,在MethodA內又會調用MethodB. 執行效果相當於 調用MethodA時,環境中沒有事務,所以開啓一個新的事務. 當在MethodA中調用MethodB時,環境中已經有了一個事務,所以methodB就加入當前事務。
3:如果存在一個事務,支持當前事務。如果沒有事務,則非事務的執行。
PROPAGATION_SUPPORTS 如果存在一個事務,支持當前事務。如果沒有事務,則非事務的執行。但是對於事務同步的事務管理器,PROPAGATION_SUPPORTS與不使用事務有少許不同。 單純的調用methodB時,methodB方法是非事務的執行的。 當調用methdA時,methodB則加入了methodA的事務中,事務地執行。 PROPAGATION_MANDATORY 如果已經存在一個事務,支持當前事務。如果沒有一個活動的事務,則拋出異常。 當單獨調用methodB時,因爲當前沒有一個活動的事務,則會拋出異常 throw new IllegalTransactionStateException("Transaction propagation ''mandatory'' but no existing transaction found"); 當調用methodA時,methodB則加入到methodA的事務中,事務地執行。
4: 總是開啓一個新的事務。如果一個事務已經存在,則將這個存在的事務掛起。
PROPAGATION_REQUIRES_NEW 總是開啓一個新的事務。如果一個事務已經存在,則將這個存在的事務掛起。 當單獨調用methodB時,相當於把methodb聲明爲REQUIRED。開啓一個新的事務,事務地執行。 當調用methodA時 情況有些大不一樣.相當於下面的效果。 在這裏,我把ts1稱爲外層事務,ts2稱爲內層事務。從上面的代碼可以看出,ts2與ts1是兩個獨立的事務,互不相干。Ts2是否成功並不依賴於ts1。如果methodA方法在調用methodB方法後的doSomeThingB方法失敗了,而methodB方法所做的結果依然被提交。而除了methodB之外的其它代碼導致的結果卻被回滾了。 使用PROPAGATION_REQUIRES_NEW,需要使用JtaTransactionManager作爲事務管理器。

5:總是非事務地執行,並掛起任何存在的事務。
PROPAGATION_NOT_SUPPORTED 總是非事務地執行,並掛起任何存在的事務。 當單獨調用methodB時,不啓用任何事務機制,非事務地執行。 當調用methodA時,相當於下面的效果 使用PROPAGATION_NOT_SUPPORTED,也需要使用JtaTransactionManager作爲事務管理器。

6:總是非事務地執行,如果存在一個活動事務,則拋出異常 單獨調用methodB,則非事務的執行。
PROPAGATION_NEVER 總是非事務地執行,如果存在一個活動事務,則拋出異常 單獨調用methodB,則非事務的執行。 調用methodA則會拋出異常

7:
PROPAGATION_NESTED如果一個活動的事務存在,則運行在一個嵌套的事務中. 如果沒有活動事務, 則按TransactionDefinition.PROPAGATION_REQUIRED 屬性執行 這是一個嵌套事務,使用JDBC 3.0驅動時,僅僅支持DataSourceTransactionManager作爲事務管理器。需要JDBC 驅動的java.sql.Savepoint類。有一些JTA的事務管理器實現可能也提供了同樣的功能。 使用PROPAGATION_NESTED,還需要把PlatformTransactionManager的nestedTransactionAllowed屬性設爲true; 而nestedTransactionAllowed屬性值默認爲false; 如果單獨調用methodB方法,則按REQUIRED屬性執行。 如果調用methodA方法,相當於下面的效果 當methodB方法調用之前,調用setSavepoint方法,保存當前的狀態到savepoint。如果methodB方法調用失敗,則恢復到之前保存的狀態。但是需要注意的是,這時的事務並沒有進行提交,如果後續的代碼(doSomeThingB()方法)調用失敗,則回滾包括methodB方法的所有操作。 嵌套事務一個非常重要的概念就是內層事務依賴於外層事務。外層事務失敗時,會回滾內層事務所做的動作。而內層事務操作失敗並不會引起外層事務的回滾。 PROPAGATION_NESTED 與PROPAGATION_REQUIRES_NEW的區別:它們非常類似,都像一個嵌套事務,如果不存在一個活動的事務,都會開啓一個新的事務。使用PROPAGATION_REQUIRES_NEW時,內層事務與外層事務就像兩個獨立的事務一樣,一旦內層事務進行了提交後,外層事務不能對其進行回滾。兩個事務互不影響。兩個事務這是一個真正的嵌套事務。同時它需要JTA事務管理器的支持。 使用PROPAGATION_NESTED時,外層事務的回滾可以引起內層事務的回滾。而內層事務的異常並不會導致外層事務的回滾,它是一個真正的嵌套事務。DataSourceTransactionManager使用savepoint支持PROPAGATION_NESTED時,需要JDBC 3.0以上驅動及1.4以上的JDK版本支持。其它的JTA TrasactionManager實現可能有不同的支持方式。 PROPAGATION_REQUIRED應該是我們首先的事務傳播行爲。它能夠滿足我們大多數的事務需求。

7:什麼是線程安全?
如果你的代碼所在的進程中有多個線程在同時運行,而這些線程可能會同時運行這段代碼。如果每次運行結果和單線程運行的結果是一樣的,而且其他的變量的值也和預期的是一樣的,就是線程安全的。

synchronize 修飾定義一個對象或者方法或者屬性的訪問必須串行化訪問,顧名思義像在銀行取錢要排隊一樣,那個業務員就是一個synchronize 對象。只有像我等無錢之輩纔去排隊,那些個VIP自然不用了。

 wait 和notify notifyAll是一家的,他們是對象級的鎖,余天生駑鈍,這個偶翻了許多資料才理解,如果不能理解就看代碼吧。多線程中的一個去訪問共享資源發現有人使用,於是就在這個資源上面wait,佔用者如果使用完了就notify()一下通知下一個等待者可以進來了,notifyAll()就是說在外面等的一起上吧!可是隻能服務與一個人,於是大家搶着進去,力氣大的自然佔便宜。可是在java世界裏面JVM說了算。 有wait和notify的地方一定有synchronize,反過來不成立,wait 和notify不在Thread的勢力範圍。

8:checkexception和runtimeexception區別?
Java異常分爲兩大類:checked 異常和unChecked 異常。所有繼承java.lang.Exception 的異常都屬於checked異常。所有繼承java.lang.RuntimeException的異常都屬於unChecked異常。
當一個方法去調用一個可能拋出checked異常的方法,必須通過try…catch塊對異常進行捕獲進行處理或者重新拋出。
我們看看Connection接口的createStatement()方法的聲明。
一個是子類,一個是父類.
RuntimeException也不應該去捕獲,因爲這類的Exception都是不可恢復的,而且往往是因爲程序的BUG纔會導致這類Exception,比如說NullPoint,或者IndexOutOfBound等等。捕獲這類Exception事實上是在隱藏錯誤。
發佈了41 篇原創文章 · 獲贊 1 · 訪問量 1826
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章