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 的相關方法。