Java面試2019常考題系列——java 基礎類庫(io 流,集合類,線程,Socket,AWT,Swing,sql)

1、java 中有幾種類型的流?JDK 爲每種類型的流提供了一些抽象類以供繼承,請說出他們分別是哪些類?

 

字節流,字符流。字節流繼承於 InputStream OutputStream,字符流繼承於 Reader Writer。

在 java.io 包中還有許多其他的流,低層流與調層流,高層流主要是爲了提高性能和使用方便。

 

 

2、啓動一個線程是用 run()還是 start()?

啓動一個線程是調用 start()方法,啓動線程並調用 run 方法。

 

 

3、線程的基本概念、線程的基本狀態以及狀態之間的關係

 

線程是進程內的併發,沒有自已內存空間,共享進程的,線程間的通信成本較低。

Java 中的線程有四種狀態分別是:運行、就緒、掛起、結束。

 

 

4、多線程有幾種實現方法,都是什麼?同步有幾種實現方法,都是什麼? 用什麼關鍵字修飾同步方法?

stop()和 suspend()方法爲何不推薦使用?

Extends Thread

Implements Runnable

同步

Public synchronized aa()

{

}

Public void cc(object aa)

{

synchronized(aa)

{

}

}

用 synchoronized 修飾同步方法。

答:多線程有兩種實現方法,分別是繼承 Thread 類與實現 Runnable 接口

同步的實現方面有兩種,分別是 synchronized,wait 與 notify反對使用 stop(),是因爲它不安全。它會解除由線程獲取的所有鎖定,而且如果對象處於一種不連貫狀態,那麼其他線程能在那種狀態下檢查和修改它們。結果很難檢查出真正的問題所在。suspend()方法容易發生死鎖。調用 suspend()的時候,目標線程會停下來,但卻仍然持有在這之前獲得的鎖定。此時,其他任何線程都不能訪問鎖定的資源,除非被"掛起"的線程恢復運行。對任何線程來說,如果它們想恢復目標線程,同時又試圖使用任何一個鎖定的資源,就會造成死鎖。所以不應該使用 suspend(),而應在自己的 Thread 類中置入一個標誌,指出線程應該活動還是掛起。若標誌指出線程應該掛起,便用 wait()命其進入等待狀態。若標誌指出線程應當恢復,則用一個 notify()重新啓動線程。

 

5、集合框架有什麼?

Collection Map

List set HashMap

ArrayList linkedList HashSet TreeSet

 

6、設計 4 個線程,其中兩個線程每次對 j 增加 1,另外兩個線程對 j 每次減少 1。寫出程序

public class TestThread

{

private int j;

public synchronized void inc()

{

j++;

System.out.println(Thread.currentThread().getName() + "-inc:" + j);

}

public synchronized void dec()

{

j--;

System.out.println(Thread.currentThread().getName() + "-dec:" + j);

}

public static void main(String[] args)

{

TestThread t=new TestThread();

for (int i = 0; i < 2; i++)

{

Thread inc=new Thread(new Inc(t));

Thread dec=new Thread(new Dec(t));

inc.start();

dec.start();

}

}

}

class Inc implements Runnable

{

private TestThread obj;

public Inc(TestThread obj)

{

this.obj=obj;

}

public void run()

{

// for (int i = 0; i < 100; i++)

// {

this.obj.inc();

// }

}

}

class Dec implements Runnable

{

private TestThread obj;

public Dec(TestThread obj)

{

this.obj=obj;

}

public void run()

{

// for (int i = 0; i < 100; i++)

// {

this.obj.dec();

// }

}

}

 

7、同步和異步有和異同,在什麼情況下分別使用他們?舉例說明。

同步:上一段代碼沒的完成,下一段必須等到上一段代碼完成後纔可以執行。如買票排隊

異步:上一段代碼沒的完成,下一段不必等到上一段代碼完成就可以執行。如手機發送短信。

 

 

8、sleep() 和 wait() 有什麼區別?

Sleep 是指休眠給定的時間,當這個時間達到之後,線程會再次醒來。

Wait 是等待狀態,多長時間不清楚,由另一個線程將其喚醒。

 

 

9、當一個線程進入一個對象的一個 synchronized 方法後,其它線程是否可進入此對象的其它方法?

如只其它方法是同步方法,不可以進入。如果不是可以進入。

 

10、輸入輸出流的理解:

在 java 使用流的機制進行數據的傳送,從文件到內存是輸入流,從內存到文件是輸出流,輸入流可以通過 read 讀取,輸出流以 write 或 print 寫入,對於流可以是分爲高層流和低層流,低層以一個字節或字符爲單位進行處理,高層流以一批數據爲單位進行處理。

FileInputStream(System.in)至 InputSteamReader 至 BufferReader

OutputSteam(System.out)至 printStream

FileReader 至 BufferedReader

FileWriter 至 PrintWriter 或 bufferWriter

分類:

字節(二進制)

FileInputStream(低層輸入流)

FileOutputStream(低層輸出流)

PrintStream(高層流) System.out.println()

字符(一個 char)

FileReader

FileWriter

 

 

11、請寫一個程序的讀寫,要求用兩種方式一種是低層流另一種是高層流。

import java.io.FileWriter;

import java.io.InputStream;

import java.io.BufferedWriter;

import java.io.InputStreamReader;

import java.io.BufferedReader;

import java.io.FileReader;

public class Untitled1 {

 public static void writeFileChar() throws Exception {

 FileWriter f = new FileWriter("c:\\aa.txt");

 InputStream is = System.in;

 int c = is.read();

 while (((char) c) != 'x') {

 f.write(c);

 c = is.read();

 }

 f.close();

 is.close();

 }

 public static void writeFileString() throws Exception {

 FileWriter f = new FileWriter("c:\\aa.txt");

 BufferedWriter bwr=new BufferedWriter(f);

 BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));

 String c = bf.readLine();

 while (!c.equals("stop")) {

 bwr.write(c+"\r\n");

 c = bf.readLine();

 }

 bwr.close();

 f.close();

 bf.close();

 }

 

 public static void readFileChar() throws Exception {

 FileReader f = new FileReader("c:\\aa.txt");

 int c = f.read();

 while (c!=-1) {

 System.out.print((char)c);

 c=f.read();

 }

 f.close();

 }

 public static void readFileString() throws Exception {

 BufferedReader bf = new BufferedReader(new FileReader("c:\\aa.txt"));

 String c = bf.readLine();

 while (c!=null)

 {

 System.out.println(c);

 c=bf.readLine();

 }

 bf.close();

 }

 public static void main(String[] args) throws Exception {

 readFileString();

 }

}

 

12、如何列出某個目錄下的所有文件

Import java.io.File;

File f=new File("C:\\");

 File[] f1=f.listFiles();

 for(int i=0;i<f1.length;i++)

 {

 if(f1[i].isDirectory())

 {

 System.out.println("dirctory is"+f1[i].getName());

 }

 else

 {

 System.out.println("file is"+f1[i].getName());

 }

 }

 }

1. 如何列出某個目錄下的所有子目錄

public static void main(String[] args) throws Exception

{

 getFile(new File("C:\\entityBean"),"\t");

}

public static void getFile(File f,String sem) throws Exception

{

 System.out.println(sem+f.getName());

 File fl[]=f.listFiles();

 if(fl.length>=1)

 {

 for(int i=0;i<fl.length;i++)

 {

 if(fl[i].isDirectory())

 {

 getFile(fl[i],sem+"\t");

 }

 }

 }

 }

2. 判斷一個文件或目錄是否存在

 File f=new File("C:\\entityBean");

 if(f.exists())

 {

 System.out.println("exist");

 }

 else

 {

 System.out.println("not exist");

 }

Socket

 

13、用 socket 通訊寫出客戶端和服務器端的通訊,要求客戶發送數據後能夠回顯相同的數據?

public class ServerSocket_1

{

 public static void main(String[] args)

 throws Exception

 {

 ServerSocket ss = new ServerSocket(4001);

 Socket s = ss.accept();

 BufferedReader br = new BufferedReader(new InputStreamReader(s.

 getInputStream()));

 PrintStream ps=new PrintStream(s.getOutputStream());

 String temp = br.readLine();

 while (true)

 {

 System.out.println("客戶端:"+temp);

 ps.println(temp);

 if (temp.equals("stop"))

 {

 break;

 }

 temp = br.readLine();

 }

 br.close();

 ps.close();

 ss.close();

 }

}

public class ClientSocket

{

 public static void main(String[] args) throws Exception

 {

 Socket s = new Socket("localhost", 4001);

 PrintStream ps = new PrintStream(s.getOutputStream());

 BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

 BufferedReader br_server = new BufferedReader(new InputStreamReader(s.

 getInputStream()));

 String temp = br.readLine();

 while (true)

 {

 ps.println(temp);

 temp = br_server.readLine();

 System.out.println("服務器的信息:" + temp);

 if (temp.equals("stop"))

 {

 break;

 }

 temp = br.readLine();

 }

 s.close();

 br.close();

 br_server.close();

 }

}

 

14、介紹 JAVA 中的 Collection FrameWork(包括如何寫自己的數據結構)?

答:Collection FrameWork 如下:

Collection

├List

│├LinkedList

│├ArrayList

│└Vector

│ └Stack

└Set

Map

├Hashtable

├HashMap

└WeakHashMap

Collection 是最基本的集合接口,一個 Collection 代表一組 Object,即 Collection 的元素

(Elements)

Map 提供 key 到 value 的映射

 

15、請說出你所知道的線程同步的方法

HashTable 中的 put,get,remove

Vector 的相關方法。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章