Java基礎筆試題 Java程式設計師筆試題
Java程式設計師筆試題
2018年03月28日 00:00:04 皮蛋蛋168 閱讀數:5982一、單項選擇題(共10題,每題2分,共20分)
1. 下列說法哪一個是正確的。( B )
A.Java程式經編譯後會產生machine code
B.Java程式經編譯後會產生bytecode
C
D.以上都不正確
2. 提供Java存取資料庫能力的包是。( A )
A.java.sql B.java.awt C.java.lang D.java.swing
3. 執行如下程式程式碼後,C的值是。( C )
a=0;c=0;
do{
--c;
a=a-1;
}while(a>0);
A
4. 下面的語句中正確的表示式為。( C )
A.byte b = 128;
B.boolean n = null;
C.double d = 0.9239d;
D.float f = 0.9239;
5. 將一個十六進位制值賦給一個long型變數的正確寫法為。( D )
A.long number = 345L;
B.long number = 0345;
C.long number = 0345L;
D.long number = 0x345L;
6. 以下程式程式碼的輸出是。( B )
public classtest (
public static void main (String args[]) (
System.out.printIn (6 ^ 3);
)
)
A.3 B.5 C.6 D.11
7. 以下程式程式碼的輸出是。(E )
public class test (
private static int j = 0;
private static boolean methodB(int k) (
j += k;
return true;
)
public static void methodA(int i) {
boolean b:
b = i< 10 | methodB (4);
b = i< 10 || methodB (8);
)
publicstatic void main (String args[] } (
methodA (0);
system.out.printIn(j);
)
)
A.0 B.4 C.8 D.12 E.不能編譯通過
8. 以下程式程式碼的輸出是。( A)
public class test {
public static void add3 (Integer i) }
int val = i.intValue ( );
val += 3;
i = new Integer (val);
}
public static void main (String args [ ] ) {
Integer i = new Integer (0);
add3(i);
system.out.printIn (i.intValue ( ) );
}
)
A.編譯失敗 B.編譯成功但在第三行會出現異常 C.0 D.3
9. 以下程式程式碼執行後,哪個說法正確?( B )
int index = 1;
boolean[] test =new Boolean[3];
boolean foo=test [index];
A.有異常丟擲。
B.無法編譯。
C.foo的值是0。
D.foo的值是null。
E.foo的值是true。
F.foo的值是false。
10. 以下哪個類是swt包中的。( D )
A.MessageBox B.MessageDialog C.JDialog D.DisplayMode
多項選擇題(共5題,每題4分,共20分)
11. 在下面的選項中合法的識別符號有。( ADEF )
A._ok
B.*point
C.this
D.$byte
E.const
F.ILikeJLCSS
12. 下面的選項中哪些不是java的關鍵字。( ABD )
A.TRUE
B.sizeof
C.goto
D.const
E.super
F.void
13. 下面的敘述中正確的有。( AC )
A.環境變數可在編譯source code時指定。
B.在編譯程式時,所能指定的環境變數不包括class path。
C. javac一次可同時編譯數個Java原始檔。
D. javac.exe能指定編譯結果要置於哪個目錄(directory)。
14. 下面的敘述中正確的有。( C )
A.equals()方法判定引用值是否指向同一物件。
B.= = 操作符判定兩個分立的物件的內容和型別是否一致。
C.equals()方法只有在兩個物件的內容一致時返回true。
D.類File重寫方法equals()在兩個分立的物件的內容和型別一致時返回true。
15. 下面有關變數及其作用域的陳述哪些是對的。( A C )
A. 在方法裡面定義的區域性變數在方法退出的時候被撤銷。
B. 區域性變數也叫自動變數。
C. 在方法外面定義的變數(譯註:即例項變數)在物件被構造時建立。
D. 在方法中定義的方法的參變數只要該物件被需要就一直存在。
二、簡答題(共7題,共40分)
1. 請寫出一個輸出“Hello World!” 的程式。(3分)
答:public Class Hello World
{
Public static void main(String[]args)
{
System.out.println(“HELLO WOTLD”);
}
}
2. char型變數中能不能存貯一箇中文漢字? 為什麼? (3分)
答:能儲存一個漢字;因為它能儲存四個位元組而每個漢字只佔兩個位元組。
3. 常見的兩種xml解析技術是什麼? 區別是什麼? (4分)
答:常見的兩種有:SAX和DOM。
區別:SAX 是一種事件驅動的xml解析方式。每次訪問一個xml檔案中的某個節點的時候,sax就會搜尋一遍xml檔案,在找到相應的節點後就會觸發一個事件來處理請求。只讀
DOM是一種基於樹狀的查詢方式。DOM會將xml解析成一棵樹,存在記憶體中。開發者可以通過查詢樹的節點來取得檔案的內容或者修改內容。可讀寫
4. MVC是什麼,如何實現? (5分)
答:MVC是一個是一個設計模式,它強制性的使應用程式的輸入,處理和輸出分開。使用MVC應用程式被分為三個核心部件:M----------MODO模型,V ----------VIEW 試圖,C --------- Contral控制
實現:首先有頁面(jsp)傳送請求給控制器(servlet),然後由控制器接收使用者的請求,並決定應該呼叫哪個模型(javabean)來進行處理,然後模型用業務邏輯來處理使用者的請求並返回資料,最後控制器用相應的檢視格式化模型返回的資料,並通過表示層顯示給使用者。
5. .J2EE是什麼?(6分)
答:J2EE 是Sun公司提出的多層(multi-diered),分散式(distributed),基於元件(component-base)的企業級應用模型(enterpriese application model).在這樣的一個應用系統中,可按照功能劃分為不同的元件,這些元件又可在不同計算機上,並且處於相應的層次(tier)中。所屬層次包括客戶層(clietn tier)元件,web層和元件,Business層和元件,企業資訊系統(EIS)層。
6. jsp有哪些內建物件?作用分別是什麼? (9分)
答:1.request 使用者端請求,此請求會包含來自GET/POST請求的引數;2.response 網頁傳回使用者端的迴應;3.pageContext 網頁的屬性是在這裡管理;4.session 與請求有關的會話期;5.application servlet 正在執行的內容;6.out 用來傳送回應的輸出;7.config servlet的構架部件;8.page JSP網頁本身;9.exception 針對錯誤網頁,未捕捉的例外
7. 作用域public,private,protected,以及不寫時的區別 ?(10分)
答:作用域 當前類 同一package 子孫類 其他package
public √ √ √ √
protected √ √ √ ×
friendly √ √ × ×
private √ × × ×
不寫時預設為friendly
編碼及論述題(共2題,每題10分,共20分)
8. 什麼是Singleton,它的作用是什麼,它有幾種形式?請用程式碼寫出一個Singleton類。
答:Java Singleton 模式用來保證在執行的應用程式中,一個Class只是例項化一次,也就是隻有一個相應的物件存在。
它有三種形式
public classSingleton
{
private static Singleton instance = null;
public static synchronized Singleton getInstance()
{
if (instance==null)
instance=new Singleton();
return instance;
}
}
9. 在Struts + Spring + Hibernate的組合框架模式中,三者各自的特點都是什麼?
答:Strtus WEB層 Spring是業務層 Hiebenate是持久化層
SSH試題
1.Hibernate工作原理及為什麼要用?
原理: 1.讀取並解析配置檔案 2.讀取並解析對映資訊,建立SessionFactory 3.開啟Session 4.建立事務Transation 5.持久化操作 6.提交事務 7.關閉Session 8.關閉SesstionFactory
為什麼要用: 1. 對JDBC訪問資料庫的程式碼做了封裝,大大簡化了資料訪問層繁瑣的重複性程式碼。 2. Hibernate是一個基於JDBC的主流持久化框架,是一個優秀的ORM實現。他很大程度的簡化DAO層的編碼工作 3. hibernate使用Java反射機制,而不是位元組碼增強程式來實現透明性。 4. hibernate的效能非常好,因為它是個輕量級框架。對映的靈活性很出色。它支援各種關係資料庫,從一對一到多對多的各種複雜關係。
2.Hibernate是如何延遲載入?
1. Hibernate2延遲載入實現:a)實體物件 b)集合(Collection)
2. Hibernate3 提供了屬性的延遲載入功能 當Hibernate在查詢資料的時候,資料並沒有存在與記憶體中,當程式真正對資料的操作時,物件才存在與記憶體中,就實現了延遲載入,他節省了伺服器的記憶體開銷,從而提高了伺服器的效能。
3.Hibernate中怎樣實現類之間的關係?(如:一對多、多對多的關係)
類與類之間的關係主要體現在表與表之間的關係進行操作,它們都市對物件進行操作,我們程式中把所有的表與類都對映在一起,它們通過配置檔案中的many-to-one、one-to-many、many-to-many
4.Struts1流程:
1、客戶端瀏覽器發出HTTP請求。2、根據web.xml配置,該請求被ActionServlet接收。3、根據struts-config.xml配置,ActionServlet先將請求中的引數填充到ActionForm中,然後ActionServlet再將請求傳送到Action 進行處理。4、是否驗證,需要驗證則呼叫ActionForm的validate方法,驗證失敗則跳轉到input,成功則繼續。5、Action從ActionForm獲得資料,呼叫javabean 中的業務方法處理資料。6、Action返回ActionForward物件,跳轉到相應JSP頁面或Action。7、返回HTTP響應到客戶端瀏覽器。
MVC設計模式:modal:“模型” 也稱業務邏輯,是正真完成任務的程式碼,相當與JavaBeanview:檢視,其實就是顯示介面,相當於JSPcontroller:控制器,他控制模型和檢視的互動過程,相當於servletstruts1是基於MVC設計模式hibernate是基於ORM物件關係對映
5.struts是什麼?
struts1是基於JSP和servlet的一個開源的Web應用框架,使用的是MVC的設計模式struts2是基於webwork技術的框架,是sun和webwork公司聯手開發的一個功能非常齊全的框架,struts2和struts1沒有任何關係,是一個全新的框架
6.spring是什麼?
spring是一個集成了許多第三方框架的大雜燴,其核心技術是IOC(控制反轉,也稱依賴注入)和AOP(面向切面程式設計)
7.hibernate是什麼?
hibernate是基於ORM物件關係對映(完成物件資料到關係資料對映的機制)實現的,做資料持久化的工具
8.JSF是什麼?
JavaServer Face是基於元件的web開發框架,跟sturts差不多的框架
9.資料庫裡面的索引和約束是什麼?
索引是為了提高資料的檢索速度,索引是建立在資料表上,根據一個或多個欄位建立的約束是為了保持資料的完整性,約束有非空約束,主鍵約束,外來鍵約束等等。
10.spring是什麼
這個問題,往往可以通過我們為什麼要使用spring這個問題來切入:AOP 讓開發人員可以建立非行為性的關注點,稱為橫切關注點,並將它們插入到應用程式程式碼中。使用 AOP 後,公共服務(比 如日誌、永續性、事務等)就可以分解成方面並應用到域物件上,同時不會增加域物件的物件模型的複雜性。 IOC 允許建立一個可以構造物件的應用環境,然後向這些物件傳遞它們的協作物件。正如單詞倒置 所表明的,IOC 就像反 過來的 JNDI。沒有使用一堆抽象工廠、服務定位器、單元素(singleton)和直接構造(straight construction),每一個物件都是用其協作物件構造的。因此是由容器管理協作物件(collaborator)。 Spring即使一個AOP框架,也是一IOC容器。 Spring 最好的地方是它有助於您替換物件。有了 Spring,只要用 JavaBean 屬性和配置檔案加入依賴性(協作物件)。然後可以很容易地在需要時替換具有類似介面的協作物件。
11.用自己的話簡要闡述struts2的執行流程。
Struts 2框架本身大致可以分為3個部分:核心控制器FilterDispatcher、業務控制器Action和使用者實現的企業業務邏輯元件。核心控制器FilterDispatcher是Struts 2框架的基礎,包含了框架內部的控制流程和處理機制。業務控制器Action和業務邏輯元件是需要使用者來自己實現的。使用者在開發Action和業務邏輯元件的同時,還需要編寫相關的配置檔案,供核心控制器FilterDispatcher來使用。
Struts 2的工作流程相對於Struts 1要簡單,與WebWork框架基本相同,所以說Struts2是WebWork的升級版本。基本簡要流程如下:1、客戶端瀏覽器發出HTTP請求。2、根據web.xml配置,該請求被FilterDispatcher接收。3、根據struts.xml配置,找到需要呼叫的Action類和方法,並通過IoC方式,將值注入給Aciton。4、Action呼叫業務邏輯元件處理業務邏輯,這一步包含表單驗證。5、Action執行完畢,根據struts.xml中的配置找到對應的返回結果result,並跳轉到相應頁面。6、返回HTTP響應到客戶端瀏覽器。
12.談談你mvc的理解
MVC是Model—View—Controler的簡稱。即模型—檢視—控制器。MVC是一種設計模式,它強制性的把應用程式的輸入、處理和輸出分開。
MVC中的模型、檢視、控制器它們分別擔負著不同的任務。
檢視: 檢視是使用者看到並與之互動的介面。檢視向用戶顯示相關的資料,並接受使用者的輸入。檢視不進行任何業務邏輯處理。
模型: 模型表示業務資料和業務處理。相當於JavaBean。一個模型能為多個檢視提供資料。這提高了應用程式的重用性
控制器: 當用戶單擊Web頁面中的提交按鈕時,控制器接受請求並呼叫相應的模型去處理請求。
然後根據處理的結果呼叫相應的檢視來顯示處理的結果。
MVC的處理過程:首先控制器接受使用者的請求,呼叫相應的模型來進行業務處理,並返回資料給控制器。控制器呼叫相應的檢視來顯示處理的結果。並通過檢視呈現給使用者。
Java筆試演算法試題
1.現在輸入n個數字,以逗號,分開;然後可選擇升或者降序排序
我的評論:
本題的splitStringByComma(String )方法純屬多餘,可以用String的split方法一句話代替,且可讀性也更強,下面的一段話源自JDK1.6API,StringTokenizer類已不再提倡使用,保留僅為舊程式碼。
StringTokenizer是出於相容性的原因而被保留的遺留類(雖然在新程式碼中並不鼓勵使用它)。建議所有尋求此功能的人使用String的split方法或 java.util.regex 包。
importjava.util.*;
publicclass bycomma{
public static String[]splitStringByComma(String source){
if(source==null||source.trim().equals(""))
return null;
StringTokenizer commaToker = newStringTokenizer(source,",");
String[] result = newString[commaToker.countTokens()];
int i=0;
while(commaToker.hasMoreTokens()){
result[i] =commaToker.nextToken();
i++;
}
return result;
}
public static void main(String args[]){
String[] s =splitStringByComma("5,8,7,4,3,9,1");
int[] ii = new int[s.length];
for(int i = 0; i<ii.length;i++){
ii[i] =Integer.parseInt(s[i]);
}
Arrays.sort(ii);
//asc
for(int i=0;i<ii.length;i++ ){
System.out.println(ii[i]);
}
//desc
for(int i=(s.length-1);i>=0;i--){
System.out.println(ii[i]);
}
}
}
2.編寫一個擷取字串的函式,輸入為一個字串和位元組數,輸出為按位元組擷取的字串。但是要保證漢字不被截半個,如"我ABC"4,應該截為"我AB",輸入"我ABC漢DEF",6,應該輸出為"我ABC"而不是"我ABC+漢的半個"。
程式碼:
publicstatic boolean isLetter(char c){
int k=0X80;
return c/k==0?true:false;
}
public static int lengths(String strSrc){
if (strSrc==null){
return 0;
}
int len=0;
char[] strChar=strSrc.toCharArray();
for (int i=0;i<strChar.length;i++){
len++;
if (!isLetter(strChar[i])) len++;
}
return len;
}
public static String subString(Stringorigin,int len){
if (origin==null ||origin.equals("")|| len<1){
return "";
}
if (len>lengths(origin)){
return origin;
}
byte[] strByte=new byte[len];
System.arraycopy(origin.getBytes(),0,strByte,0,len);
int count=0;
for (int i=0;i<len;i++){
int value=(int)strByte[i];
if (value<0) count++;
}
if (count % 2 !=0){
//len=(len==1)?++len:--len;
--len;
}
return new String(strByte,0,len);
}
publicstatic void main(String[] args) {
System.out.println(""+subString("我ABC漢DEF",6));
}
3、排序都有哪幾種方法?請列舉。用JAVA實現一個快速排序。
排序的方法有:插入排序(直接插入排序、希爾排序),交換排序(氣泡排序、快速排序),選擇排序(直接選擇排序、堆排序),歸併排序,分配排序(箱排序、基數排序)
快速排序的虛擬碼。
/ /使用快速排序方法對a[ 0:n- 1 ]排序從a[ 0 :n- 1 ]中選擇一個元素作為m I d d l e,該元素為支點把餘下的元素分割為兩段left 和r I g h t,使得l e f t中的元素都小於等於支點,而right 中的元素都大於等於支點遞迴地使用快速排序方法對left 進行排序遞迴地使用快速排序方法對right 進行排序所得結果為l e f t + m I d d l e + r I g h t
//以下為java程式實現的快速排序演算法:
publicstatic void sort(int[] data) {
quickSort(data,0,data.length-1);
}
publicstatic void quickSort(int[] data,int low,int high){
int pivotIndex=(low+high)/2;
swap(data,pivotIndex,high);
int k=partition(data,low-1,high,data[high]);
swap(data,k,high);
if ((k-low)>1) partition(data,low,k-1);
if ((high-k)>1)partition(data,k+1,high);
}
publicstatic int partition(int[] data int low,int high, int pivot ){
do {
while (data[++low]<pivot) ;
while (high!=0 && data[--high]>pivot);
swap(data,low,high);
}
while (low<high) ;
swap(data,low,high);
return low;
}
publicstatic void swap(int[] data int low,int high){
int tmp=data[low];
data[low]=data[high];
data[high]=tmp;
}
publicstatic void main(String[] args){
int[] data = newint[]{89,32,425,32,78,1,53,92};
sort(data);
}
4.試用遞迴的方法寫一下計算菲波那契數列的通項f(n),已知f1=1,f2=1,以後每項都是前兩項的和。
..............
publicstatic long fibonacci(long m){
if (m==0 ||m==1) return m;
else returnfibonacci(m-1)+fibonacci(m-2);
}
5. 寫一個Singleton出來。
Singleton模式主要作用是保證在Java應用程式中,一個類Class只有一個例項存在。
我的評論:第一種形式是餓漢式單例類,第二種是懶漢式單例類;可以如此速記,餓漢式太餓了,所以迫不及待在內部new出一個例項,而懶漢式太懶了,所以知道應用時才檢查有沒有例項存在,如不存在才new一個例項出來。
一般Singleton模式通常有幾種種形式:
第一種形式: 定義一個類,它的建構函式為private的,它有一個static的private的該類變數,在類初始化時例項話,通過一個public的getInstance方法獲取對它的引用,繼而呼叫其中的方法。
Publicclass Singleton {
private Singleton(){}
//在自己內部定義自己一個例項,是不是很奇怪?
//注意這是private 只供內部呼叫
private static Singleton instance = newSingleton();
//這裡提供了一個供外部訪問本class的靜態方法,可以直接訪問
public static Singleton getInstance() {
return instance;
}
}
第二種形式:
publicclass Singleton {
private staticSingleton instance = null;
public staticsynchronized Singleton getInstance() {
//這個方法比上面有所改進,不用每次都進行生成物件,只是第一次
//使用時生成例項,提高了效率!
if (instance==null)
instance=new Singleton();
return instance;
}
}
其他形式:
定義一個類,它的建構函式為private的,所有方法為static的。
一般認為第一種形式要更加安全些
6、建立一個靜態方法,給它傳入一個物件,請迴圈的打印出該物件所在類的類名和所實現的方法名(華為筆試最後一道程式設計)
importjava.lang.reflect.*;
publicclass Test{
publicstatic void test(Object obj){
Class clazz=obj.getClass();
//System.out.println("類名:"+clazz.getName());
Method[] ms=clazz.getDeclaredMethods();
long len=Array.getLength(ms);
for(int i=0;i<len;i++){
System.out.println("類名:"+clazz.getName()+"方法名:"+ms[i].getName());
}
}
class A{
public void b(){}
public void c(){}
public void d(){}
public void e(){}
}
publicstatic void main(String[] args){
Test t=new Test();
Test.A a=t.new A();
test(a);
}
}
7、假設字串類似這樣的aba和aab就相等,現在隨便給你二組字串,請程式設計比較他們看是否相等
BufferedReaderbr = new BufferedReader(new InputStreamReader(System.in));
String s =null;
try {
s =br.readLine();
} catch(IOException e) {
e.printStackTrace();
}
StringTokenizerst = new StringTokenizer(s);
String s1 =st.nextToken();
String s2 =st.nextToken();
byte[] sa1= s1.getBytes();
byte[] sb2= s2.getBytes();
Arrays.sort(sa1);
Arrays.sort(sb2);
String ss1= new String(sa1);
String ss2= new String(sb2);
if(ss1.equals(ss2))
System.out.println("equal");
else
System.out.println("notequal");
8、給你一組字串如:iu7i8hy4jnb2,讓你程式設計輸出裡面的數字:7842
用正規表示式:"iu7i8hy4jnb2".replaceAll("[^\\d]","");
9、給你一組字串讓你把它倒敘輸出
publicstatic String flashBack(String origin) {
String result = "";
for (int i = origin.length(); i > 0; i--){
String tmp = origin.substring(i - 1, i);
result += tmp;
}
return result;
}
10、給你一組字元如{1,3,4,7,2,1,1,5,2},讓你輸出裡面出現次數最多且數值最大的一個,出現幾次
public voidfun4() {
int[] a = { 4, 1, 2, 4, 5, 1, 1, 1, 5, 1,3, 4, 5 };
Arrays.sort(a);
for (int i = 0; i < a.length; i++) {
System.out.print(a[i] + " ");
}
System.out.println();
int maxNumber = a[a.length - 1], maxCount =1;
int curNumber = a[a.length - 1], curCount =1;
for (int i = a.length - 1; i > 0; i--) {
curNumber = a[i];
if (a[i] == a[i - 1]) {
curCount++;
} else {
System.out.println("i="+ i + ",curCount=" + curCount+ ",maxCount=" + maxCount +",maxNumber=" + maxNumber);
if (curCount > maxCount) {
maxCount = curCount;
maxNumber = curNumber;
}
curCount = 1;
}
}
if (curCount > maxCount) {
maxCount = curCount;
//maxNumber = curNumber;
}
System.out.println("curCount="+ curCount + ",maxCount=" + maxCount + ",maxNumber=" +maxNumber);
}
11、求兩個數的公約數,M,N
int divisor=1;
for (int i= 2; i <= b; i++) {
if(a%i==0&& b%i==0){
divisor =i;
}
}
System.out.println(a+"和"+b+"的最大公約數是:"+divisor);
}
12、實現陣列複製
我的理解:這是深複製,陣列a,b不再有關聯
public voidfun8(){
int[] a ={1,2,3,4,56,7,8};
int[] b =(int[])a.clone();
Conica.print(a);
Conica.print(b);
b[0]=100;
Conica.print(a);
Conica.print(b);
}
13、氣泡排序的實現
public voidfun9(){
int[] a ={1,5,2,6,8,74,1,25,69,8};
Conica.print(a);
for(inti=0; i<a.length-1; i++){
for(intj=0; j<a.length-i-1;j++){
if(a[j]>a[j+1]){
int temp =a[j];
a[j] =a[j+1];
a[j+1] =temp;
}
}
}
Conica.print(a);
}
14、程式設計顯示某一檔案目錄下的檔名
public voidfun10(){
File file =new File("G:\\03月份");
if(file.exists()){
if(file.isDirectory()){
String[]files = file.list();
Conica.println(files);
}
}
}
15、從鍵盤輸入4個十進位制數字字元,將其轉換為4位時間之數並顯示出來
16、程式設計實現統計文字檔案中某個單詞的出現頻率,並輸出統計結果
用HashMap來解決
假設單詞不存在跨行的,每個單詞用,. ;分割
publicstatic void countNum() throws IOException {
BufferedReader br = null;
try {
br = new BufferedReader(newFileReader("c://file.txt"));
Map map = new HashMap();
for (String s = br.readLine(); s != null; s= br.readLine()) {
StringTokenizer st = newStringTokenizer(s, ",. ;");
while (st.hasMoreTokens()) {
String temp = st.nextToken();
if (map.containsKey(temp)) {
map.put(temp, newInteger((Integer)map.get(temp) + 1));
} else {
map.put(temp, new Integer(1));
}
}
}
for (Iterator it =map.entrySet().iterator(); it.hasNext();) {
Map.Entry entry = (Map.Entry) it.next();
System.out.println(entry.getKey() +"-->" + entry.getValue()
+ "times");
}
} finally {
br.close();
}
}
Java面試題
1、作用域public,private,protected,以及不寫時的區別
答:區別如下:
作用域 當前類 同一package 子孫類 其他package
public √ √ √ √
protected √ √ √ ×
friendly √ √ × ×
private √ × × ×
不寫時預設為friendly
4、&和&&的區別
答:&是位運算子,表示按位與運算,&&是邏輯運算子,表示邏輯與(and)
5、Collection 和 Collections的區別
答:Collection是集合類的上級介面,繼承與他的介面主要有Set 和List.
Collections是針對集合類的一個幫助類,他提供一系列靜態方法實現對各種集合的搜尋、排序、執行緒安全化等操作
6、什麼時候用assert
答:assertion(斷言)在軟體開發中是一種常用的除錯方式,很多開發語言中都支援這種機制。在實現中,assertion就是在程式中的一條語句,它對一個boolean表示式進行檢查,一個正確程式必須保證這個boolean表示式的值為true;如果該值為false,說明程式已經處於不正確的狀態下,系統將給出警告或退出。一般來說,assertion用於保證程式最基本、關鍵的正確性。assertion檢查通常在開發和測試時開啟。為了提高效能,在軟體釋出後,assertion檢查通常是關閉的
7、String s = newString("xyz");建立了幾個String Object
答:兩個,一個字元物件,一個字元物件引用物件
9、short s1 = 1; s1 =s1 + 1;有什麼錯? short s1 = 1; s1 += 1;有什麼錯
答:short s1 = 1; s1 = s1 + 1; (s1+1運算結果是int型,需要強制轉換型別)shorts1 = 1; s1 += 1;(可以正確編譯)
11、陣列有沒有length()這個方法? String有沒有length()這個方法
答:陣列沒有length()這個方法,有length的屬性。String有有length()這個方法
13、Set裡的元素是不能重複的,那麼用什麼方法來區分重複與否呢? 是用==還是equals()? 它們有何區別
答:Set裡的元素是不能重複的,那麼用iterator()方法來區分重複與否。equals()是判讀兩個Set是否相等
equals()和==方法決定引用值是否指向同一物件equals()在類中被覆蓋,為的是當兩個分離的物件的內容和型別相配的話,返回真值
15、error和exception有什麼區別
答:error 表示恢復不是不可能但很困難的情況下的一種嚴重問題。比如說記憶體溢位。不可能指望程式能處理這樣的情況
exception 表示一種設計或實現問題。也就是說,它表示如果程式執行正常,從不會發生的情況
16、List, Set, Map是否繼承自Collection介面
答: List,Set是,Map不是
19、介面是否可繼承介面? 抽象類是否可實現(implements)介面? 抽象類是否可繼承實體類(concreteclass)
答:介面可以繼承介面。抽象類可以實現(implements)介面,抽象類是否可繼承實體類,但前提是實體類必須有明確的建構函式
20、構造器Constructor是否可被override
答:構造器Constructor不能被繼承,因此不能重寫Overriding,但可以被過載Overloading
22、try {}裡有一個return語句,那麼緊跟在這個try後的finally {}裡的code會不會被執行,什麼時候被執行,在return前還是後
答:會執行,在return前執行
23、用最有效率的方法算出2乘以8等於幾
答:2 << 3
25、當一個物件被當作引數傳遞到一個方法後,此方法可改變這個物件的屬性,並可返回變化後的結果,那麼這裡到底是值傳遞還是引用傳遞
答:是值傳遞。Java 程式語言只有值傳遞引數。當一個物件例項作為一個引數被傳遞到方法中時,引數的值就是對該物件的引用。物件的內容可以在被呼叫的方法中改變,但物件的引用是永遠不會改變的
28、char型變數中能不能存貯一箇中文漢字?為什麼?
答:是能夠定義成為一箇中文的,因為java中以unicode編碼,一個char佔16個位元組,所以放一箇中文是沒問題的
30、float型float f=3.4是否正確?
答:不正確。精度不準確,應該用強制型別轉換,如下所示:float f=(float)3.4
34、談談final, finally,finalize的區別
答:final—修飾符(關鍵字)如果一個類被宣告為final,意味著它不能再派生出新的子類,不能作為父類被繼承。因此一個類不能既被宣告為 abstract的,又被宣告為final的。將變數或方法宣告為final,可以保證它們在使用中不被改變。被宣告為final的變數必須在宣告時給定初值,而在以後的引用中只能讀取,不可修改。被宣告為final的方法也同樣只能使用,不能過載
finally—再異常處理時提供 finally 塊來執行任何清除操作。如果丟擲一個異常,那麼相匹配的 catch 子句就會執行,然後控制就會進入 finally 塊(如果有的話)
finalize—方法名。Java 技術允許使用finalize() 方法在垃圾收集器將物件從記憶體中清除出去之前做必要的清理工作。這個方法是由垃圾收集器在確定這個物件沒有被引用時對這個物件呼叫的。它是在 Object 類中定義的,因此所有的類都繼承了它。子類覆蓋 finalize() 方法以整理系統資源或者執行其他清理工作。finalize() 方法是在垃圾收集器刪除物件之前對這個物件呼叫的
35、面向物件的特徵有哪些方面
答:主要有以下四方面:
1.抽象:
抽象就是忽略一個主題中與當前目標無關的那些方面,以便更充分地注意與當前目標有關的方面。抽象並不打算了解全部問題,而只是選擇其中的一部分,暫時不用部分細節。抽象包括兩個方面,一是過程抽象,二是資料抽象。
2.繼承:
繼承是一種聯結類的層次模型,並且允許和鼓勵類的重用,它提供了一種明確表述共性的方法。物件的一個新類可以從現有的類中派生,這個過程稱為類繼承。新類繼承了原始類的特性,新類稱為原始類的派生類(子類),而原始類稱為新類的基類(父類)。派生類可以從它的基類那裡繼承方法和例項變數,並且類可以修改或增加新的方法使之更適合特殊的需要。
3.封裝:
封裝是把過程和資料包圍起來,對資料的訪問只能通過已定義的介面。面向物件計算始於這個基本概念,即現實世界可以被描繪成一系列完全自治、封裝的物件,這些物件通過一個受保護的介面訪問其他物件。
4. 多型性:
多型性是指允許不同類的物件對同一訊息作出響應。多型性包括引數化多型性和包含多型性。多型性語言具有靈活、抽象、行為共享、程式碼共享的優勢,很好的解決了應用程式函式同名問題。
36、String是最基本的資料型別嗎
答:基本資料型別包括byte、int、char、long、float、double、boolean和short。
java.lang.String類是final型別的,因此不可以繼承這個類、不能修改這個類。為了提高效率節省空間,我們應該用StringBuffer類
37、int 和 Integer 有什麼區別
答:Java 提供兩種不同的型別:引用型別和原始型別(或內建型別)。Int是java的原始資料型別,Integer是java為int提供的封裝類。Java為每個原始型別提供了封裝類。
原始型別封裝類,booleanBoolean,charCharacter,byteByte,shortShort,intInteger,longLong,floatFloat,doubleDouble
引用型別和原始型別的行為完全不同,並且它們具有不同的語義。引用型別和原始型別具有不同的特徵和用法,它們包括:大小和速度問題,這種型別以哪種型別的資料結構儲存,當引用型別和原始型別用作某個類的例項資料時所指定的預設值。物件引用例項變數的預設值為 null,而原始型別例項變數的預設值與它們的型別有關
38、執行時異常與一般異常有何異同
答:異常表示程式執行過程中可能出現的非正常狀態,執行時異常表示虛擬機器的通常操作中可能遇到的異常,是一種常見執行錯誤。java編譯器要求方法必須宣告丟擲可能發生的非執行時異常,但是並不要求必須宣告丟擲未被捕獲的執行時異常。
41、heap和stack有什麼區別
答:棧是一種線形集合,其新增和刪除元素的操作應在同一段完成。棧按照後進先出的方式進行處理。堆是棧的一個組成元素
43、Java中的異常處理機制的簡單原理和應用
答:當JAVA程式違反了JAVA的語義規則時,JAVA虛擬機器就會將發生的錯誤表示為一個異常。違反語義規則包括2種情況。一種是JAVA類庫內建的語義檢查。例如陣列下標越界,會引發IndexOutOfBoundsException;訪問null的物件時會引發NullPointerException。另一種情況就是JAVA允許程式設計師擴充套件這種語義檢查,程式設計師可以建立自己的異常,並自由選擇在何時用throw關鍵字引發異常。所有的異常都是java.lang.Thowable的子類。
44、垃圾回收的優點和原理。並考慮2種回收機制
答:Java語言中一個顯著的特點就是引入了垃圾回收機制,使c++程式設計師最頭疼的記憶體管理的問題迎刃而解,它使得Java程式設計師在編寫程式的時候不再需要考慮記憶體管理。由於有個垃圾回收機制,Java中的物件不再有"作用域"的概念,只有物件的引用才有"作用域"。垃圾回收可以有效的防止記憶體洩露,有效的使用可以使用的記憶體。垃圾回收器通常是作為一個單獨的低級別的執行緒執行,不可預知的情況下對記憶體堆中已經死亡的或者長時間沒有使用的物件進行清楚和回收,程式設計師不能實時的呼叫垃圾回收器對某個物件或所有物件進行垃圾回收。回收機制有分代複製垃圾回收和標記垃圾回收,增量垃圾回收。
45、你所知道的集合類都有哪些?主要方法?
答:最常用的集合類是 List 和 Map。 List 的具體實現包括 ArrayList 和 Vector,它們是可變大小的列表,比較適合構建、儲存和操作任何型別物件的元素列表。 List 適用於按數值索引訪問元素的情形。
Map 提供了一個更通用的元素儲存方法。 Map 集合類用於儲存元素對(稱作"鍵"和"值"),其中每個鍵對映到一個值。
46、描述一下JVM載入class檔案的原理機制?
答:JVM中類的裝載是由ClassLoader和它的子類來實現的,Java ClassLoader 是一個重要的Java執行時系統元件。它負責在執行時查詢和裝入類檔案的類。
48、JAVA語言如何進行異常處理,關鍵字:throws,throw,try,catch,finally分別代表什麼意義?在try塊中可以丟擲異常嗎?
答:Java通過面向物件的方法進行異常處理,把各種不同的異常進行分類,並提供了良好的介面。在Java中,每個異常都是一個物件,它是Throwable類或其它子類的例項。當一個方法出現異常後便丟擲一個異常物件,該物件中包含有異常資訊,呼叫這個物件的方法可以捕獲到這個異常並進行處理。Java的異常處理是通過5個關鍵詞來實現的:try、catch、throw、throws和finally。一般情況下是用try來執行一段程式,如果出現異常,系統會丟擲(throws)一個異常,這時候你可以通過它的型別來捕捉(catch)它,或最後(finally)由預設處理器來處理。
用try來指定一塊預防所有"異常"的程式。緊跟在try程式後面,應包含一個catch子句來指定你想要捕捉的"異常"的型別。
throw語句用來明確地丟擲一個"異常"。
throws用來標明一個成員函式可能丟擲的各種"異常"。
Finally為確保一段程式碼不管發生什麼"異常"都被執行一段程式碼。
可以在一個成員函式呼叫的外面寫一個try語句,在這個成員函式內部寫另一個try語句保護其他程式碼。每當遇到一個try語句,"異常"的框架就放到堆疊上面,直到所有的try語句都完成。如果下一級的try語句沒有對某種"異常"進行處理,堆疊就會展開,直到遇到有處理這種"異常"的try語句。
49、一個".java"原始檔中是否可以包括多個類(不是內部類)?有什麼限制?
答:可以。必須只有一個類名與檔名相同。
50、java中有幾種型別的流?JDK為每種型別的流提供了一些抽象類以供繼承,請說出他們分別是哪些類?
答:位元組流,字元流。位元組流繼承於InputStream OutputStream,字元流繼承於InputStreamReaderOutputStreamWriter。在java.io包中還有許多其他的流,主要是為了提高效能和使用方便。
51、java中會存在記憶體洩漏嗎,請簡單描述
答:會。自己實現堆載的資料結構時有可能會出現記憶體洩露,可參看effective java.
52、java中實現多型的機制是什麼?
答:方法的重寫Overriding和過載Overloading是Java多型性的不同表現。重寫Overriding是父類與子類之間多型性的一種表現,過載Overloading是一個類中多型性的一種表現。
54、靜態變數和例項變數的區別
答:static i = 10; //常量 class A a; a.i =10;//可變
55、什麼是java序列化,如何實現java序列化?
答:序列化就是一種用來處理物件流的機制,所謂物件流也就是將物件的內容進行流化。可以對流化後的物件進行讀寫操作,也可將流化後的物件傳輸於網路之間。序列化是為了解決在對物件流進行讀寫操作時所引發的問題。
序列化的實現:將需要被序列化的類實現Serializable介面,該介面沒有需要實現的方法,implements Serializable只是為了標註該物件是可被序列化的,然後使用一個輸出流(如:FileOutputStream)來構造一個ObjectOutputStream(物件流)物件,接著,使用ObjectOutputStream物件的writeObject(Object obj)方法就可以將引數為obj的物件寫出(即儲存其狀態),要恢復的話則用輸入流。
56、是否可以從一個static方法內部發出對非static方法的呼叫?
答:不可以,如果其中包含物件的method();不能保證物件初始化.
58、在JAVA中,如何跳出當前的多重巢狀迴圈?
答:用break; return 方法。
59、List、Map、Set三個介面,存取元素時,各有什麼特點?
答:List 以特定次序來持有元素,可有重複元素。Set 無法擁有重複元素,內部排序。Map 儲存key-value值,value可多值。
60、說出一些常用的類,包,介面,請各舉5個
答:常用的類:BufferedReader BufferedWriter FileReader FileWirter String Integer
常用的包:java.lang java.awt java.io java.util java.sql
常用的介面:Remote List Map Document NodeList
Jsp面試題
一、簡答題
1.forward和redirect的區別
forward是伺服器請求資源,伺服器直接訪問目標地址的URL,把那個URL的響應內容讀取過來,然後把這些內容再發給瀏覽器,瀏覽器根本不知道伺服器傳送的內容是從哪兒來的,所以它的位址列中還是原來的地址。
redirect就是服務端根據邏輯,傳送一個狀態碼,告訴瀏覽器重新去請求那個地址,一般來說瀏覽器會用剛才請求的所有引數重新請求,所以session,request引數都可以獲取。
2.說出Servlet的生命週期,並說出Servlet和CGI的區別
Servlet被伺服器例項化後,容器執行其init方法,請求到達時執行其service方法,service方法自動派遣執行與請求對應的doXXX方法(doGet,doPost)等,當伺服器決定將例項銷燬的時候呼叫其destroy方法。
與cgi的區別在於servlet處於伺服器程序中,它通過多執行緒方式執行其service方法,一個例項可以服務於多個請求,並且其例項一般不會銷燬,而CGI對每個請求都產生新的程序,服務完成後就銷燬,所以效率上低於servlet。
3.JSP中動態INCLUDE與靜態INCLUDE的區別?