牛客網專項練習java錯題(三)
2018/ 5 /18

解析:
重點在 目前使用者 , application能被同一個應用程式的所有使用者通路,是以目前使用者的資訊就不宜儲存在application中
session會話對象,一個會話隻可能是一個使用者的,生命周期預設30分鐘,也可以自行定義,目前會話結束(如關閉浏覽器),目前session被銷毀。是以目前使用者的資訊應該儲存在session中。
解析:
JSP内置對象和屬性列舉如下:
1.request對象
用戶端的請求資訊被封裝在request對象中,通過它才能了解到客戶的需求,然後做出響應。它是HttpServletRequest類的執行個體。
2.response對象
response對象包含了響應客戶請求的有關資訊,但在JSP中很少直接用到它。它是HttpServletResponse類的執行個體。
3.session對象
session對象指的是用戶端與伺服器的一次會話,從客戶連到伺服器的一個WebApplication開始,直到用戶端與伺服器斷開連接配接為止。它是HttpSession類的執行個體.
4.out對象
out對象是JspWriter類的執行個體,是向用戶端輸出内容常用的對象
5.page對象
page對象就是指向目前JSP頁面本身,有點象類中的this指針,它是java.lang.Object類的執行個體
6.application對象
application對象實作了使用者間資料的共享,可存放全局變量。它開始于伺服器的啟動,直到伺服器的關閉,在此期間,此對象将一直存在;這樣在使用者的前後連接配接或不同使用者之間的連接配接中,可以對此對象的同一屬性進行操作;在任何地方對此對象屬性的操作,都将影響到其他使用者對此的通路。伺服器的啟動和關閉決定了application對象的生命。它是ServletContext類的執行個體。
7.exception對象
exception對象是一個例外對象,當一個頁面在運作過程中發生了例外,就産生這個對象。如果一個JSP頁面要應用此對象,就必須把isErrorPage設為true,否則無法編譯。他實際上是java.lang.Throwable的對象
8.pageContext對象
pageContext對象提供了對JSP頁面内所有的對象及名字空間的通路,也就是說他可以通路到本頁所在的SESSION,也可以取本頁面所在的application的某一屬性值,他相當于頁面中所有功能的集大成者,它的本 類名也叫pageContext。
9.config對象
config對象是在一個Servlet初始化時,JSP引擎向它傳遞資訊用的,此資訊包括Servlet初始化時所要用到的參數(通過屬性名和屬性值構成)以及伺服器的有關資訊(通過傳遞一個ServletContext對象)
解析:
解析:
一旦一個共享變量(類的成員變量、類的靜态成員變量)被volatile修飾之後,那麼就具備了兩層語義:
1)保證了不同線程對這個變量進行操作時的可見性,即一個線程修改了某個變量的值,這新值對其他線程來說是立即可見的。
2)禁止進行指令重排序。
volatile隻提供了保證通路該變量時,每次都是從記憶體中讀取最新值,并不會使用寄存器緩存該值——每次都會從記憶體中讀取。
而對該變量的修改,volatile并不提供原子性的保證。
由于及時更新,很可能導緻另一線程通路最新變量值,無法跳出循環的情況
多線程下計數器必須使用鎖保護。
解析:
下面程式的輸出結果是什麼:
public class A2{
public static void main(String[] args){
int[] a={,,,,,,,};
doSomething(a,,a.length-);
for(int i=;i<=a.length-;i++)
System.out.print(a[i]+" ");
}
private static void doSomething(int[] a,int start,int end){
if(start<end){
int p=core(a,start,end);
doSomething(a,start,p-);
doSomething(a,p+,end);
}
}
private static int core(int[] a,int start,int end)
{
int x=a[end];
int i=start;
for(int j=start;j<=end-;j++){
if(a[j]>=x){
swap(a,i,j);
i++;//交換了幾次
}
}//把最大的放到最後
swap(a,i,end);//把最大的放到i的位置
return i;
}
private static void swap(int[] a,int i,int j)
{
int tmp=a[i];
a[i]=a[j];
a[j]=tmp;
}
}
解析:
按快排的思想,周遊數組将比x大的按順序存至a[0]a[1]a[2]..此時j負責周遊數組,i負責依次指向下一次
周遊判斷得到的大于x的數該存儲的位置,每一次成功存儲向後移動一格
swap(a,i,end);//把最大的放到i的位置
應該是将x交換至分界點,( x并非最大 )至此一趟core完成,x左側大于x,x右側小于x,x左右任是無序數列
然後依據分治的思想,對左序列,右序列疊代。當分至每個序列隻有一個元素序列必然有序。
最終達到排序目的
解析:
main()函數即主函數,是一個前台線程,前台程序是程式中必須執行完成的,而背景線程則是java中所有前台結束後結束,不管有沒有完成,背景線程主要用與記憶體配置設定等方面。
前台線程和背景線程的差別和聯系:
1、背景線程不會阻止程序的終止。屬于某個程序的所有前台線程都終止後,該程序就會被終止。所有剩餘的背景線程都會停止且不會完成。
2、可以在任何時候将前台線程修改為背景線程,方式是設定Thread.IsBackground 屬性。
3、不管是前台線程還是背景線程,如果線程内出現了異常,都會導緻程序的終止。
4、托管線程池中的線程都是背景線程,使用new Thread方式建立的線程預設都是前台線程。
說明:
應用程式的主線程以及使用Thread構造的線程都預設為前台線程
使用Thread建立的線程預設情況下是前台線程,在程序中,隻要有一個前台線程未退出,程序就不會終止。主線程就是一個前台線程。而背景線程不管線程是否結束,隻要所有的前台線程都退出(包括正常退出和異常退出)後,程序就會自動終止。一般背景線程用于處理時間較短的任務,如在一個Web伺服器中可以利用背景線程來處理用戶端發過來的請求資訊。而前台線程一般用于處理需要長時間等待的任務,如在Web伺服器中的監聽用戶端請求的程式,或是定時對某些系統資源進行掃描的程式
解析:
每個線程對a 均做了兩次讀寫操作,分别是 “ +1 ” 和 “ -2 ”
而題目問了是最終a 的結果,是以 a 的結果取決于各自線程對 a 的先後讀寫的順序
結論:a的可能取值為-1、0、-2
解析:
在interface裡面的變量都是public static final 的。是以你可以這樣寫:
public static final int i=10;
或則
int i=10;(可以省略掉一部分)
注意在聲明的時候要給變量賦予初值
解釋:
首先要弄清接口的含義.接口就是提供一種統一的’協定’,而接口中的屬性也屬于’協定’中的成員.它們是公共的,靜态的,最終的常量.相當于全局常量.
抽象類是不’完全’的類,相當于是接口和具體類的一個中間層.即滿足接口的抽象,也滿足具體的實作.
如果接口可以定義變量,但是接口中的方法又都是抽象的,在接口中無法通過行為來修改屬性。有的人會說了,沒有關系,可以通過實作接口的對象的行為來修改接口中的屬性。這當然沒有問題,但是考慮這樣的情況。如果接口A中有一個public通路權限的靜态變量a。按照Java的語義,我們可以不通過實作接口的對象來通路變量a,通過A.a = xxx;就可以改變接口中的變量a的值了。正如抽象類中是可以這樣做的,那麼實作接口A的所有對象也都會自動擁有這一改變後的a的值了,也就是說一個地方改變了a,所有這些對象中a的值也都跟着變了。這和抽象類有什麼差別呢,怎麼展現接口更高的抽象級别呢,怎麼展現接口提供的統一的協定呢,那還要接口這種抽象來做什麼呢?是以接口中不能出現變量,如果有變量,就和接口提供的統一的抽象這種思想是抵觸的。是以接口中的屬性必然是常量,隻能讀不能改,這樣才能為實作接口的對象提供一個統一的屬性。
通俗的講,你認為是要變化的東西,就放在你自己的實作中,不能放在接口中去,接口隻是對一類事物的屬性和行為更高層次的抽象。對修改關閉,對擴充(不同的實作implements)開放,接口是對開閉原則的一種展現。
解析:
try塊中抛出異常,try、catch和finally中都有return語句
public static int WithException(){
int i=;
try{
System.out.println("i in try block is : "+i);
i = i/;
return --i;
}
catch(Exception e){
System.out.println("i in catch - form try block is : "+i);
--i;
System.out.println("i in catch block is : "+i);
return --i;
}
finally{
System.out.println("i in finally - from try or catch block is--"+i);
--i;
System.out.println("i in finally block is--"+i);
return --i;
}
}
執行結果:
============WithException==================
i in try block is :
i in catch - form try block is :
i in catch block is :
i in finally - from try or catch block is--
i in finally block is--
===============================
執行順序:
抛出異常後,執行catch塊,在catch塊的return的–i執行完後,并不直接傳回而是執行finally,因finally中有return語句,是以,執行,傳回結果6。
結論:
try塊中抛出異常,try、catch和finally中都有return語句,傳回值是finally中的return。
總體結論:
結論一:
return語句并不是函數的最終出口,如果有finally語句,這在return之後還會執行finally(return的值會暫存在棧裡面,等待finally執行後再傳回)
結論二:
finally裡面不建議放return語句,根據需要,return語句可以放在try和catch裡面和函數的最後。可行的做法有四:
(1)return語句隻在函數最後出現一次。
(2)return語句僅在try和catch裡面都出現。
(3)return語句僅在try和函數的最後都出現。
(4)return語句僅在catch和函數的最後都出現。
注意,除此之外的其他做法都是不可行的,編譯器會報錯
解析:
解析:
會話跟蹤是一種靈活、輕便的機制,它使Web上的狀态程式設計變為可能。
HTTP是一種無狀态協定,每當使用者送出請求時,伺服器就會做出響應,用戶端與伺服器之間的聯系是離散的、非連續的。當使用者在同一網站的多個頁面之間轉換時,根本無法确定是否是同一個客戶,會話跟蹤技術就可以解決這個問題。當一個客戶在多個頁面間切換時,伺服器會儲存該使用者的資訊。
有四種方法可以實作會話跟蹤技術:URL重寫、隐藏表單域、Cookie、Session。
1).隐藏表單域:,非常适合步需要大量資料存儲的會話應用。
2).URL 重寫:URL 可以在後面附加參數,和伺服器的請求一起發送,這些參數為名字/值對。
3).Cookie:一個 Cookie 是一個小的,已命名資料元素。伺服器使用 SET-Cookie 頭标将它作為 HTTP
響應的一部分傳送到用戶端,用戶端被請求儲存 Cookie 值,在對同一伺服器的後續請求使用一個
Cookie 頭标将之傳回到伺服器。與其它技術比較,Cookie 的一個優點是在浏覽器會話結束後,甚至
在用戶端計算機重新開機後它仍可以保留其值
4).Session:使用 setAttribute(String str,Object obj)方法将對象捆綁到一個會話
解析:
于replaceAll方法的第一個參數是一個正規表達式,而”.”在正規表達式中表示任何字元,是以會把前面字元串的所有字元都替換成”/”。如果隻是要換‘.’的話,先用“\.”表明在這個正規表達式裡“.”并不是表示全部,但是到了java裡面後\表示轉義字元,是以把“\.”看成整體後還需要加轉義字元“\”,是以變成了“\\.”