日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

map的生命周期 java,【JAVA面试的艺术】JAVA基础知识阶段三

發布時間:2024/9/27 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 map的生命周期 java,【JAVA面试的艺术】JAVA基础知识阶段三 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

說一下線程的生命周期?

線程是一個動態執行的過程,它也有一個從產生到死亡的過程,有五種狀態。

新建(new Thread)

當創建Thread類的一個實例(對象)時,此線程進入新建狀態(未被啟動)。例如:Thread t1=new Thread();

就緒(runnable)

線程已經被啟動,正在等待被分配給CPU時間片,也就是說此時線程正在就緒隊列中排隊等候得到CPU資源。例如:t1.start();

運行(running)

線程獲得CPU資源正在執行任務(run()方法),此時除非此線程自動放棄CPU資源或者有優先級更高的線程進入,線程將一直運行到結束。

死亡(dead)

當線程執行完畢或被其它線程殺死,線程就進入死亡狀態,這時線程不可能再進入就緒狀態等待執行。

自然終止:正常運行run()方法后終止

異常終止:調用stop()方法讓一個線程終止運行

阻塞(blocked)

阻塞狀態是指線程因為某種原因放棄了 cpu 使用權,也即讓出了 cpu timeslice,暫時停止運行。直到線程進入可運行(runnable)狀態,才有機會再次獲得 cpu timeslice 轉到運行(running)狀態。阻塞的情況分三種:

等待阻塞 ( o.wait-> 等待對列:運行(running)的線程執行 o.wait()方法,JVM 會把該線程放入等待隊列(waitting queue)中。

同步阻塞 (lock-> 鎖池 ):運行(running)的線程在獲取對象的同步鎖時,若該同步鎖被別的線程占用,則 JVM 會把該線程放入鎖池(lock pool)中。

其他阻塞 (sleep/join):運行(running)的線程執行 Thread.sleep(long ms)或 t.join()方法,或者發出了 I/O 請求時,JVM 會把該線程置為阻塞狀態。當 sleep()狀態超時、join()等待線程終止或者超時、或者 I/O處理完畢時,線程重新轉入可運行(runnable)狀態。

sleep()和wait()有什么區別嗎?

sleep()方法是線程類(Thread)的靜態方法,讓調用線程進入睡眠狀態,讓出執行機會給其他線程,等到休眠時間結束后,線程進入就緒狀態和其他線程一起競爭cpu的執行時間

因為sleep() 是static靜態的方法,他不能改變對象的鎖,當一個synchronized塊中調用了sleep() 方法,線程雖然進入休眠,但是對象的機鎖沒有被釋放,其他線程依然無法訪問這個對象。

wait()是Object類的方法,當一個線程執行到wait方法時,它就進入到一個和該對象相關的等待池,同時釋放對象的鎖,使得其他線程能夠訪問,可以通過notify,notifyAll方法來喚醒等待的線程。

簡述基于TCP和UDP的Socket編程主要步驟

Java分別為TCP和UDP 兩種通信協議提供了相應的Socket編程類,這些類存放在java.net包中。與TCP對應的是服務器的ServerSocket和客戶端的Socket,與UDP對應的是DatagramSocket。

基于TCP創建的套接字可以叫做流套接字,服務器端相當于一個監聽器,用來監聽端口。 服務器與客服端之間的通訊都是輸入輸出流來實現的。基于UDP的套接字就是數據報套接字,? 兩個都要先構造好相應的數據包。

基于TCP協議的Socket編程的主要步驟

服務器端(server)

構建一個ServerSocket實例,指定本地的端口。這個socket就是用來監聽指定端口的連接請求的。

重復如下幾個步驟:

調用socket的accept()方法來獲得下面客戶端的連接請求。通過accept()方法返回的socket實例,建立了一個和客戶端的新連接

通過這個返回的socket實例獲取InputStream和OutputStream,可以通過這兩個stream來分別讀和寫數據

結束的時候調用socket實例的close()方法關閉socket連接

客戶端(client)

構建Socket實例,通過指定的遠程服務器地址和端口來建立連接

通過Socket實例包含的InputStream和OutputStream來進行數據的讀寫

操作結束后調用socket實例的close方法,關閉

基于UDP協議的Socket編程的主要步驟

服務器端(server)

構造DatagramSocket實例,指定本地端口。

通過DatagramSocket實例的receive方法接收DatagramPacket.DatagramPacket中間就包含了通信的內容

通過DatagramSocket的send和receive方法來收和發DatagramPacket

客戶端(client)

構造DatagramSocket實例

通過DatagramSocket實例的send和receive方法發送DatagramPacket報文

結束后,調用DatagramSocket的close方法關閉

反射機制的優缺點

靜態編譯:在編譯時確定類型,綁定對象,即通過。

動態編譯:運行時確定類型,綁定對象。動態編譯最大限度發揮了java的靈活性,體現了多態的應用,有以降低類之間的藕合性。

優點:可以實現動態創建對象和編譯,體現出很大的靈活性,特別是在J2EE的開發中,它的靈活性就表現的十分明顯。

缺點:對性能有影響。使用反射基本上是一種解釋操作,我們可以告訴JVM,我們希望做什么并且它滿足我們的要求。這類操作總是慢于只直接執行相同的操作。

HashMap和Hashtable的區別和聯系

實現原理相同,功能相同,底層都是哈希表結構,查詢速度快,在很多情況下可以互用

兩者的主要區別如下

Hashtable是早期JDK提供的接口,HashMap是新版JDK提供的接口

Hashtable繼承Dictionary類,HashMap實現Map接口

Hashtable線程安全,HashMap線程非安全

Hashtable不允許null值,HashMap允許null值

Hashtable、HashMap都使用了 Iterator。而由于歷史原因,Hashtable還使用了Enumeration的方式 。

初始容量大小和每次擴充容量大小的不同

Hashtable默認的初始大小為11,之后每次擴充,容量變為原來的2n+1。HashMap默認的初始化大小為16。之后每次擴充,容量變為原來的2倍。

哈希值的使用不同,HashTable直接使用對象的hashCode。而HashMap重新計算hash值。

hashCode是jdk根據對象的地址或者字符串或者數字算出來的int類型的數值。

Hashtable計算hash值,直接用key的hashCode(),而HashMap重新計算了key的hash值,Hashtable在求hash值對應的位置索引時,用取模運算,而HashMap在求位置索引時,則用與運算,且這里一般先用hash&0x7FFFFFFF后,再對length取模,&0x7FFFFFFF的目的是為了將負的hash值轉化為正值,因為hash值有可能為負數,而&0x7FFFFFFF后,只有符號外改變,而后面的位都不變。

字符流字節流聯系區別;什么時候使用字節流和字符流?

字符流和字節流是流的一種劃分,按處理照流的數據單位進行的劃分。兩類都分為輸入和輸出操作。

在字節流中輸出數據主要是使用OutputStream完成,輸入使的是InputStream,在字符流中輸出主要是使用Writer類完成,輸入流主要使用Reader類完成。這四個都是抽象類。

字符流處理的單元為2個字節的Unicode字符,分別操作字符、字符數組或字符串,而字節流處理單元為1個字節,操作字節和字節數組。字節流是最基本的,所有的InputStrem和OutputStream的子類都是,主要用在處理二進制數據,它是按字節來處理的 但實際中很多的數據是文本,又提出了字符流的概念,它是按虛擬機的編碼來處理,也就是要進行字符集的轉化 這兩個之間通過 InputStreamReader,OutputStreamWriter來關聯,實際上是通過byte[]和String來關聯的。

青蛙跳臺階青蛙可以一次跳1級/2級臺階請問跳上第n級臺階有多少種方法?

遞歸:

if(target == 1){

? return 1;

? }

? if(target == 2){

? return 2;

? }

? //第一次有兩種選擇,然后根據不同的選擇,然后開始不同的下一步,但是下一步還是一樣有兩種選擇

? return JumpFloor(target - 1) + JumpFloor(target - 2);

復制代碼

非遞歸:

int x=1, y=2, z;

? if(target == 1){

? return 1;

? }

? if(target == 2){

? return 2;

? }

? for(int i = 3; i <= target; i ++){

? z = y;

? y = x + y;

? x = z;

? }

? return y;

復制代碼

總結

以上是生活随笔為你收集整理的map的生命周期 java,【JAVA面试的艺术】JAVA基础知识阶段三的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。