1. 程式人生 > >java面試題,各大企業常見的java筆試題之八

java面試題,各大企業常見的java筆試題之八

IO 流及Socket 部分:(共5 題:基礎5 道)

1、什麼是java 序列化,如何實現java 序列化?【基礎】
答:序列化就是一種用來處理物件流的機制,所謂物件流也就是將物件的內容進行流化。可以對流化後的物件進行讀寫操作,也可將流化後的物件傳輸於網路之間。序列化是為了解決在對物件流進行讀寫操作時所引發的問題;序列化的實現:將需要被序列化的類實現Serializable 介面,該介面沒有需實現的方法,implements Serializable 只是為了標註該物件是可被序列化的,然後使用一個輸出流(如FileOutputStream)來構造一個ObjectOutputStream(物件流)物件,接著,使用ObjectOutputStream 物件的writeObject(Object obj)方法就可以將引數為obj 的物件寫出(即儲存其狀態),要恢復的話則用輸入流。

2、java 中有幾種型別的流?JDK 為每種型別的流提供了一些抽象類以供繼承,
請說出他們分別是哪些類?【基礎】
答:位元組流,字元流。位元組流繼承於InputStream、OutputStream,字元流繼承於Reader、Writer。在java.io 包中還有許多其他的流,主要是為了提高效能和使用方便。

3、檔案和目錄(IO)操作:
1)如何列出某個目錄下的所有檔案?
2)如何列出某個目錄下的所有子目錄?
3)如何判斷一個檔案或目錄是否存在?
4)如何讀寫檔案?【基礎】
答:1)示例程式碼如下:
File file = new File(“e:\\總結”);
File[] files = file.listFiles();
for(int i=0; i<files.length; i++){
if(files[i].isFile()) System.out.println(files[i]);
}
2)示例程式碼如下:
File file = new File(“e:\\總結”);
File[] files = file.listFiles();
for(int i=0; i<files.length; i++){
if(files[i].isDirectory()) System.out.println(files[i]);
}
3)建立File 物件,呼叫其exsit()方法即可返回是否存在,如:
第22 頁共59 頁
System.out.println(new File(“d:\\t.txt”).exists());
4)示例程式碼如下:
//讀檔案:
FileInputStream fin = new FileInputStream(“e:\\tt.txt”);
byte[] bs = new byte[100];
while(true){
int len = fin.read(bs);
if(len <= 0) break;
System.out.print(new String(bs,0,len));
}
fin.close();
//寫檔案:
FileWriter fw = new FileWriter(“e:\\test.txt”);
fw.write(“hello world!” + System.getProperty(“line.separator”));
fw.write(“你好!北京!”);
fw.close();

4、寫一個方法,輸入一個檔名和一個字串,統計這個字串在這個檔案中出現的次數。【基礎】
答:程式碼如下:
public int countWords(String file, String find) throws Exception{
int count = 0;
Reader in = new FileReader(file);
int c;
while ((c = in.read()) != -1) {
while (c == find.charAt(0)) {
for (int i = 1; i < find.length(); i++) {
c = in.read();
if (c != find.charAt(i)) break;
if (i == find.length() – 1) count++;
}
}
}
return count;
}

5、Java 的通訊程式設計,程式設計題(或問答),用JAVA SOCKET 程式設計,讀伺服器幾個字元,再寫入本地顯示?【基礎】
答:Server 端程式:
package test;
import java.net.*;
import java.io.*;
public class Server{
private ServerSocket ss;
private Socket socket;
private BufferedReader in;
private PrintWriter out;
public Server(){
try {
ss=new ServerSocket(10000);
while(true){
socket = ss.accept();
String RemoteIP =
socket.getInetAddress().getHostAddress();
String RemotePort = “:”+socket.getLocalPort();
System.out.println(“A client come in!IP:”
+ RemoteIP+RemotePort);
in = new BufferedReader(new
InputStreamReader(socket.getInputStream()));
String line = in.readLine();
System.out.println(“Cleint send is :” + line);
out =
new PrintWriter(socket.getOutputStream(),true);
out.println(“Your Message Received!”);
out.close();
in.close();
socket.close();
}
}catch (IOException e){
out.println(“wrong”);
}
}
public static void main(String[] args){
new Server();
}
}
Client 端程式:
package test;
import java.io.*;
import java.net.*;
public class Client {
Socket socket;
BufferedReader in;
PrintWriter out;
public Client(){
try {
System.out.println(“Try to Connect to
127.0.0.1:10000″);
socket = new Socket(“127.0.0.1″,10000);
System.out.println(“The Server Connected!”);
System.out.println(“Please enter some Character:”);
BufferedReader line = new BufferedReader(new
InputStreamReader(System.in));
out = new PrintWriter(socket.getOutputStream(),true);
out.println(line.readLine());
in = new BufferedReader(
new InputStreamReader(socket.getInputStream()));
System.out.println(in.readLine());
out.close();
in.close();
socket.close();
}catch(IOException e){
out.println(“Wrong”);
}
}
public static void main(String[] args) {
new Client();
}
}

OOA/D 與UML 部分:(共6 題:基礎2 道,中等難度4 道)
6、UML 是什麼?常用的幾種圖?【基礎】
答:UML 是標準建模語言;常用圖包括:用例圖,靜態圖(包括類圖、物件圖和包圖),行為圖,互動圖(順序圖,合作圖),實現圖。

7、程式設計題: 寫一個Singleton 出來。【基礎】
答:Singleton 模式主要作用是保證在Java 應用程式中,一個類Class 只有一個例項存在。舉例:定義一個類,它的建構函式為private 的,它有一個static的private 的該類變數,在類初始化時例項話,通過一個public 的getInstance方法獲取對它的引用,繼而呼叫其中的方法。
第一種形式:
public class Singleton {
private Singleton(){}
private static Singleton instance = new Singleton();
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;
}
}
其他形式: 定義一個類,它的建構函式為private 的,所有方法為static 的。
一般認為第一種形式要更加安全些。

8、說說你所熟悉或聽說過的j2ee 中的幾種常用模式?及對設計模式的一些看法。【中等難度】
答:Session Facade Pattern:使用SessionBean 訪問EntityBean;
Message Facade Pattern:實現非同步呼叫;
EJB Command Pattern:使用Command JavaBeans 取代SessionBean,實現輕量級訪問;
Data Transfer Object Factory:通過DTO Factory 簡化EntityBean 資料提供特性;
Generic Attribute Access:通過AttibuteAccess 介面簡化EntityBean資料提供特性;
Business Interface:通過遠端(本地)介面和Bean 類實現相同介面規範業務邏輯一致性;
EJB 架構的設計好壞將直接影響系統的效能、可擴充套件性、可維護性、元件可重用性及開發效率。專案越複雜,專案隊伍越龐大則越能體現良好設計的重要性。

9、Java 中常用的設計模式?說明工廠模式?【中等難度】
答:Java 中的23 種設計模式:Factory( 工廠模式),Builder( 建造模式), Factory Method(工廠方法模式),Prototype(原始模型模式),Singleton(單例模式),Facade(門面模式),Adapter(介面卡模式), Bridge(橋樑模式), Composite(合成模式),Decorator(裝飾模式), Flyweight(享元模式), Proxy(代理模式),Command(命令模式), Interpreter(直譯器模式), Visitor(訪問者模式),Iterator(迭代子模式), Mediator(調停者模式), Memento(備忘錄模式),Observer(觀察者模式),State(狀態模式),Strategy(策略模式),Template Method(模板方法模式), Chain Of Responsibleity(責任鏈模式)。
工廠模式:工廠模式是一種經常被使用到的模式,根據工廠模式實現的類可以根據提供的資料生成一組類中某一個類的例項,通常這一組類有一個公共的抽象父類並且實現了相同的方法,但是這些方法針對不同的資料進行了不同的操作。首先需要定義一個基類,該類的子類通過不同的方法實現了基類中的方法。然後需要定義一個工廠類,工廠類可以根據條件生成不同的子類例項。當得到子類的例項後,開發人員可以呼叫基類中的方法而不必考慮到底返回的是哪一個子類的例項。

10、開發中都用到了那些設計模式?用在什麼場合? 【中等難度】
答:每個模式都描述了一個在我們的環境中不斷出現的問題,然後描述了該問題的解決方案的核心。通過這種方式,你可以無數次地使用那些已有的解決方案,無需在重複相同的工作。主要用到了MVC 的設計模式,用來開發JSP/Servlet或者J2EE 的相關應用;及簡單工廠模式等。

11、你對軟體開發中迭代的含義的理解;【中等難度】
答:軟體開發中,各個開發階段不是順序執行的,應該是並行執行,也就是迭代的意思。這樣對於開發中的需求變化,及人員變動都能得到更好的適應。

XML 部分:(共4 題:基礎1 道,中等難度1 道,較難2 道)
12、XML 文件定義有幾種形式?它們之間有何本質區別?解析XML 文件有哪幾種方式?【基礎】
答:1)兩種形式:dtd 以及schema;
2)本質區別:schema 本身是xml 的,可以被XML 解析器解析(這也是從DTD
上發展schema 的根本目的);
3)解析方式:有DOM,SAX,STAX 等:
DOM:處理大型檔案時其效能下降的非常厲害。這個問題是由DOM 的樹結構所造成的,這種結構佔用的記憶體較多,而且DOM 必須在解析檔案之前把整個文件裝入記憶體,適合對XML 的隨機訪問;SAX:不同於DOM,SAX 是事件驅動型的XML 解析方式。它順序讀取XML 檔案,不需要一次全部裝載整個檔案。當遇到像檔案開頭,文件結束,或者標籤開頭與標籤結束時,它會觸發一個事件,使用者通過在其回撥事件中寫入處理程式碼來處理XML 檔案,適合對XML 的順序訪問;STAX:Streaming API for XML (StAX)。

13、你在專案中用到了xml 技術的哪些方面?如何實現的? 【中等難度】
答:用到了資料存貯,資訊配置兩方面。在做資料交換平臺時,將不能資料來源的資料組裝成XML 檔案,然後將XML 檔案壓縮打包加密後通過網路傳送給接收者,接收解密與解壓縮後再同XML 檔案中還原相關資訊進行處理。在做軟體配置時,利用XML 可以很方便的進行,軟體的各種配置引數都存貯在XML 檔案中。

14、用jdom 解析xml 檔案時如何解決中文問題?如何解析? 【較難】
答:看如下程式碼,用編碼方式加以解決
package test;
import java.io.*;
public class DOMTest{
private String inFile = “c:\people.xml”;
private String outFile = “c:\people.xml”;
public static void main(String args[]){
new DOMTest();
}
public DOMTest(){
try{
javax.xml.parsers.DocumentBuilder builder =
javax.xml.parsers.DocumentBuilderFactory.
newInstance().newDocumentBuilder();
org.w3c.dom.Document doc = builder.newDocument();
org.w3c.dom.Element root = doc.createElement(“老師”);
org.w3c.dom.Element wang = doc.createElement(“王”);
org.w3c.dom.Element liu = doc.createElement(“劉”);
wang.appendChild(doc.createTextNode(“我是王老師”));
root.appendChild(wang);
doc.appendChild(root);
javax.xml.transform.Transformer transformer =
javax.xml.transform.TransformerFactory.
newInstance().newTransformer();
transformer.setOutputProperty(
javax.xml.transform.OutputKeys.ENCODING,”gb2312″);
transformer.setOutputProperty(
javax.xml.transform.OutputKeys.INDENT, “yes”);
transformer.transform(new
javax.xml.transform.dom.DOMSource(doc),
new javax.xml.transform.stream.StreamResult(outFile));
}catch (Exception e){
System.out.println (e.getMessage());
}
}
}

15、程式設計用JAVA 解析XML 的方式。【較難】
答:用SAX 方式解析XML,XML 檔案如下:
<?xml version=”1.0″ encoding=”gb2312″?>
<person>
<name>王小明</name>
<college>資訊學院</college>
<telephone>6258113</telephone>
<notes>男,1955 年生,博士,95 年調入海南大學</notes>
</person>
事件回撥類SAXHandler.java :
import java.io.*;
import java.util.Hashtable;
import org.xml.sax.*;
public class SAXHandler extends HandlerBase{
private Hashtable table = new Hashtable();
private String currentElement = null;
private String currentValue = null;
public void setTable(Hashtable table){
this.table = table;
}
public Hashtable getTable(){
return table;
}
public void startElement(String tag, AttributeList attrs)
throws SAXException{
currentElement = tag;
}
public void characters(char[] ch, int start, int length)
throws SAXException{
currentValue = new String(ch, start, length);
}
public void endElement(String name) throws SAXException{
if (currentElement.equals(name))
table.put(currentElement, currentValue);
}
}
JSP 內容顯示原始碼,SaxXml.jsp:
<HTML>
<HEAD>
<TITLE>剖析XML 檔案people.xml</TITLE>
</HEAD>
<BODY>
<%@ page errorPage=”ErrPage.jsp”
contentType=”text/html;charset=GB2312″ %>
<%@ page import=”java.io.*” %>
<%@ page import=”java.util.Hashtable” %>
<%@ page import=”org.w3c.dom.*” %>
<%@ page import=”org.xml.sax.*” %>
<%@ page import=”javax.xml.parsers.SAXParserFactory” %>
<%@ page import=”javax.xml.parsers.SAXParser” %>
<%@ page import=”SAXHandler” %>
<%
File file = new File(“c:\people.xml”);
FileReader reader = new FileReader(file);
Parser parser;
SAXParserFactory spf = SAXParserFactory.newInstance();
SAXParser sp = spf.newSAXParser();
SAXHandler handler = new SAXHandler();
sp.parse(new InputSource(reader), handler);
Hashtable hashTable = handler.getTable();
out.println(“<TABLE BORDER=2><CAPTION>” +”教師資訊表</CAPTION>”);
out.println(“<TR><TD>姓名</TD>” + “<TD>” +(String)hashTable.get(new String(“name”)) +”</TD></TR>”);
out.println(“<TR><TD>學院</TD>” + “<TD>” +(String)hashTable.get(new String(“college”))+”</TD></TR>”);
out.println(“<TR><TD>電話</TD>” + “<TD>” +(String)hashTable.get(new String(“telephone”))+ “</TD></TR>”);
out.println(“<TR><TD>備註</TD>” + “<TD>” +(String)hashTable.get(new String(“notes”))+ “</TD></TR>”);
out.println(“</TABLE>”);
%>
</BODY>
</HTML>

四、資料庫及SQL 部分:(共4 題:基礎3 道,中等難度1 道)
16、有3 個表(15 分鐘):【基礎】
Student 學生表(學號,姓名,性別,年齡,組織部門)
Course 課程表(編號,課程名稱)
Sc 選課表(學號,課程編號,成績)
表結構如下:
1)寫一個SQL 語句,查詢選修了’計算機原理’的學生學號和姓名(3 分鐘)
2)寫一個SQL 語句,查詢’周星馳’同學選修了的課程名字(3 分鐘)
3)寫一個SQL 語句,查詢選修了5 門課程的學生學號和姓名(9 分鐘)
答:1)SQL 語句如下:
select stu.sno, stu.sname from Student stu
where (select count(*) from sc where sno=stu.sno and cno =
(select cno from Course where cname=’計算機原理’)) != 0;
2)SQL 語句如下:
select cname from Course
where cno in ( select cno from sc where sno =
(select sno from Student where sname=’周星馳’));
3)SQL 語句如下:
select stu.sno, stu.sname from student stu
where (select count(*) from sc where sno=stu.sno) = 5;

17、有三張表,學生表S,課程C,學生課程表SC,學生可以選修多門課程,一門課程可以被多個學生選修,通過SC 表關聯。【基礎】
1)寫出建表語句;
2)寫出SQL 語句,查詢選修了所有選修課程的學生;
3)寫出SQL 語句,查詢選修了至少5 門以上的課程的學生。
答:1)建表語句如下(mysql 資料庫):
create table s(id integer primary key, name varchar(20));
create table c(id integer primary key, name varchar(20));
create table sc(
sid integer references s(id),
cid integer references c(id),
primary key(sid,cid)
);
2)SQL 語句如下:
select stu.id, stu.name from s stu
where (select count(*) from sc where sid=stu.id)
= (select count(*) from c);
3)SQL 語句如下:
select stu.id, stu.name from s stu
where (select count(*) from sc where sid=stu.id)>=5;

18、資料庫表(Test)結構如下:【基礎】
ID NAME AGE MANAGER(所屬主管人ID)
106 A 30 104
109 B 19 104
104 C 20 111
107 D 35 109
112 E 25 120
119 F 45 NULL
要求:列出所有年齡比所屬主管年齡大的人的ID 和名字?
答:SQL 語句如下:
select employee.name from test employee
where employee.age > (select manager.age from test manager
where manager.id=employee.manager);

19、有如下兩張表:【中等難度】
表city: 表state:
CityNo CityName StateNo
BJ 北京(Null)
SH 上海(Null)
GZ 廣州GD
DL 大連LN
欲得
到如下結果: City
No City Name State No State Name BJ
北京(Null) (Null) DL
大連LN 遼寧GZ
廣州GD 廣東SH
上海(Null) (Null) 寫相
應的SQL 語句。
答:SQL 語句為:
SELECT C.CITYNO, C.CITYNAME, C.STATENO, S.STATENAME
FROM CITY C, STATE S
WHERE C.STATENO=S.STATENO(+)
ORDER BY(C.CITYNO);

五、JDBC 及Hibernate:(共12 題:基礎10 道,中等難度2 道)
20、資料庫,比如100 使用者同時來訪,要採取什麼技術解決?【基礎】
答:可採用連線池。

21、什麼是ORM?【基礎】
答:物件關係對映(Object—Relational Mapping,簡稱ORM)是一種為了解決面向物件與面向關係資料庫存在的互不匹配的現象的技術;簡單的說,ORM 是通過使用描述物件和資料庫之間對映的元資料,將java 程式中的物件自動持久化到關係資料庫中;本質上就是將資料從一種形式轉換到另外一種形式。

22、Hibernate 有哪5 個核心介面?【基礎】
答:Configuration 介面:配置Hibernate,根據其啟動hibernate,建立
SessionFactory 物件;
SessionFactory 介面:初始化Hibernate,充當資料儲存源的代理,建立session 物件,sessionFactory 是執行緒安全的,意味著它的同一個例項可以被應用的多個執行緒共享,是重量級、二級快取;
Session 介面:負責儲存、更新、刪除、載入和查詢物件,是執行緒不安全的,避免多個執行緒共享同一個session,是輕量級、一級快取;
Transaction 介面:管理事務;
Query 和Criteria 介面:執行資料庫的查詢。

23、關於hibernate: 【基礎】
1)在hibernate 中,在配置檔案呈標題一對多,多對多的標籤是什麼;
2)Hibernate 的二級快取是什麼;
3)Hibernate 是如何處理事務的;
答:1)一對多的標籤為<one-to-many> ;多對多的標籤為<many-to-many>;
2)sessionFactory 的快取為hibernate 的二級快取;
3)Hibernate 的事務實際上是底層的JDBC Transaction 的封裝或者是JTA
Transaction 的封裝;預設情況下使用JDBCTransaction。
State
No
State
Name
GD 廣東
LN 遼寧
SD 山東
NMG 內蒙古

24、Hibernate 的應用(Hibernate 的結構)?【基礎】
答://首先獲得SessionFactory 的物件
SessionFactory sessionFactory = new Configuration().configure().
buildSessionFactory();
//然後獲得session 的物件
Session session = sessionFactory.openSession();
//其次獲得Transaction 的物件
Transaction tx = session.beginTransaction();
//執行相關的資料庫操作:增,刪,改,查
session.save(user); //增加, user 是User 類的物件
session.delete(user); //刪除
session.update(user); //更新
Query query = session.createQuery(“from User”); //查詢
List list = query.list();
//提交事務
tx.commit();
//如果有異常,我們還要作事務的回滾,恢復到操作之前
tx.rollback();
//最後還要關閉session,釋放資源
session.close();

25、什麼是重量級?什麼是輕量級?【基礎】
答:輕量級是指它的建立和銷燬不需要消耗太多的資源,意味著可以在程式中經常建立和銷燬session 的物件;重量級意味不能隨意的建立和銷燬它的例項,會佔用很多的資源。

26、資料庫的連線字串?【基礎】
答:MS SQL Server
//第二種連線方式
Class.forName(“com.microsoft.jdbc.sqlserver.SQLServerDriver”).
newInstance();
conn = DriverManager.getConnection(“jdbc:Microsoft:sqlserver
://localhost:1433;DatabaseName=pubs”,”sa”,””);
//Oracle
Class.forName(“oracle.jdbc.driver.OracleDriver”).newInstance();
conn = DriverManager.getConnection(“jdbc:oracle:thin:
@localhost:1521:sid”, uid, pwd);
//Mysql
Class.forName(“org.git.mm.mysql.Driver”).newInstance();
conn = DriverManager.getConnection(“jdbc:mysql
://localhost:3306/pubs”,”root”,””);
處理中文的問題:
jdbc:mysql://localhost:3306/pubs?useUnicode=true
&characterEncoding=GB2312

27、事務處理?【基礎】
答:Connection 類中提供了3 個事務處理方法:
setAutoCommit(Boolean autoCommit):設定是否自動提交事務,預設為自動提交事務,即為true,通過設定false 禁止自動提交事務;
commit():提交事務;
rollback():回滾事務。

28、Java 中訪問資料庫的步驟?Statement 和PreparedStatement 之間的區別?【基礎】
答:Java 中訪問資料庫的步驟如下:
1)註冊驅動;
2)建立連線;
3)建立Statement;
4)執行sql 語句;
5)處理結果集(若sql 語句為查詢語句);
6)關閉連線。
PreparedStatement 被建立時即指定了SQL 語句,通常用於執行多次結構相同的SQL 語句。

29、用你熟悉的語言寫一個連線ORACLE 資料庫的程式,能夠完成修改和查詢工作。【基礎】
答:JDBC 示例程式如下:
public void testJdbc(){
Connection con = null;
PreparedStatement ps = null;
ResultSet rs = null;
try{
//step1:註冊驅動;
Class.forName(“oracle.jdbc.driver.OracleDriver”);
//step 2:獲取資料庫連線;
con=DriverManager.getConnection(
“jdbc:oracle:thin:@192.168.0.39:1521:TARENADB”,
“sd0605″,”sd0605″);
/************************查詢************************/
//step 3:建立Statement;
String sql = “SELECT id, fname, lname, age, FROM
Person_Tbl”;
ps = con.prepareStatement(sql);
//step 4 :執行查詢語句,獲取結果集;
rs = ps.executeQuery();
//step 5:處理結果集—輸出結果集中儲存的查詢結果;
while (rs.next()){
System.out.print(“id = ” + rs.getLong(“id”));
System.out.print(” , fname = ” +rs.getString(“fname”));
System.out.print(” , lname = ” +rs.getString(“lname”));
System.out.print(” , age = ” + rs.getInt(“age”));
}
/************************JDBC 修改*********************/
sql = “UPDATE Person_Tbl SET age=23 WHERE id = ?”;
ps = con.prepareStatement(sql);
ps.setLong(1, 88);
int rows = ps.executeUpdate();
System.out.println(rows + ” rows affected.”);
} catch (Exception e){
e.printStackTrace();
} finally{
try{
con.close(); //關閉資料庫連線,以釋放資源。
} catch (Exception e1) {
}
}
}

30、JDBC,Hibernate 分頁怎樣實現?【中等難度】
答:方法分別為:
1) Hibernate 的分頁:
Query query = session.createQuery(“from Student”);
query.setFirstResult(firstResult);//設定每頁開始的記錄號
query.setMaxResults(resultNumber);//設定每頁顯示的記錄數
Collection students = query.list();
2) JDBC 的分頁:根據不同的資料庫採用不同的sql 分頁語句
例如: Oracle 中的sql 語句為: “SELECT * FROM (SELECT a.*, rownum r FROM
TB_STUDENT) WHERE r between 2 and 10″ 查詢從記錄號2 到記錄號10 之間的所有記錄