java entropy_java面试
1. java語言的特點
Java是一種簡單的,面向?qū)ο蟮?#xff0c;分布式的,解釋型的,健壯安全的,結(jié)構(gòu)中立的,可移植的,性能優(yōu)異、多線程的靜態(tài)語言。
2. hashmap和treemap、hashset和treeset、hashmap和hashset
2.1?hashmap和treemap
HashMap通過hashcode對其內(nèi)容進行快速查找,而 TreeMap中所有的元素都保持著某種固定的順序,如果你需要得到一個有序的結(jié)果你就應(yīng)該使用TreeMap(HashMap中元素的排列順序是不固定的)。
HashMap:基于哈希表實現(xiàn)。使用HashMap要求添加的鍵類明確定義了hashCode()和equals()[可以重寫hashCode()和equals()].
TreeMap:基于紅黑樹實現(xiàn)。TreeMap沒有調(diào)優(yōu)選項,因為該樹總處于平衡狀態(tài)。
HashMap:適用于在Map中插入、刪除和定位元素。
Treemap:適用于按自然順序或自定義順序遍歷鍵(key)。
2.2?hashset和treeset
1. HashSet是通過HashMap實現(xiàn)的,TreeSet是通過TreeMap實現(xiàn)的,只不過Set用的只是Map的key
2. Map的key和Set都有一個共同的特性就是集合的唯一性.TreeMap更是多了一個排序的功能.
3. hashCode和equal()是HashMap用的, 因為無需排序所以只需要關(guān)注定位和唯一性即可.
a. hashCode是用來計算hash值的,hash值是用來確定hash表索引的.
b. hash表中的一個索引處存放的是一張鏈表, 所以還要通過equal方法循環(huán)比較鏈上的每一個對象
才可以真正定位到鍵值對應(yīng)的Entry.
c. put時,如果hash表中沒定位到,就在鏈表前加一個Entry,如果定位到了,則更換Entry中的value,并返回舊value
4. 由于TreeMap需要排序,所以需要一個Comparator為鍵值進行大小比較.當(dāng)然也是用Comparator定位的.
a. Comparator可以在創(chuàng)建TreeMap時指定
b. 如果創(chuàng)建時沒有確定,那么就會使用key.compareTo()方法,這就要求key必須實現(xiàn)Comparable接口.
c. TreeMap是使用Tree數(shù)據(jù)結(jié)構(gòu)實現(xiàn)的,所以使用compare接口就可以完成定位了.
2.3 hashmap和hashset
1 HashSet底層采用的是HashMap進行實現(xiàn)的,但是沒有key-value,只有HashMap的key set的視圖,HashSet不容許重復(fù)的對象
2 HashMap可以將空值作為一個表的條目的key或者value,HashMap中由于鍵不能重復(fù),因此只有一條記錄的Key可以是空值,而value可以有多個為空,但HashTable不允許null值(鍵與值均不行)
3 Hashtable是基于Dictionary類的,而HashMap是基于Map接口的一個實現(xiàn)
4 Hashtable里默認的方法是同步的,而HashMap則是非同步的,因此Hashtable是多線程安全的
3. int和Integer的區(qū)別
int 是基本數(shù)據(jù)類型
Integer是其包裝類,注意是一個類。
為什么要提供包裝類呢???
一是為了在各種類型間轉(zhuǎn)化,通過各種方法的調(diào)用。否則 你無法直接通過變量轉(zhuǎn)化。
比如,現(xiàn)在int要轉(zhuǎn)為String
int a=0;
String result=Integer.toString(a);
在java中包裝類,比較多的用途是用在于各種數(shù)據(jù)類型的轉(zhuǎn)化中。
4. 單例模式
java中單例模式是一種常見的設(shè)計模式,單例模式的寫法有好幾種,這里主要介紹三種:懶漢式單例、餓漢式單例、登記式單例。單例模式有以下特點:1、單例類只能有一個實例。2、單例類必須自己創(chuàng)建自己的唯一實例。3、單例類必須給所有其他對象提供這一實例。單例模式確保某個類只有一個實例,而且自行實例化并向整個系統(tǒng)提供這個實例。在計算機系統(tǒng)中,線程池、緩存、日志對象、對話框、打印機、顯卡的驅(qū)動程序?qū)ο蟪1辉O(shè)計成單例。這些應(yīng)用都或多或少具有資源管理器的功能。每臺計算機可以有若干個打印機,但只能有一個Printer Spooler,以避免兩個打印作業(yè)同時輸出到打印機中。每臺計算機可以有若干通信端口,系統(tǒng)應(yīng)當(dāng)集中管理這些通信端口,以避免一個通信端口同時被兩個請求同時調(diào)用??傊?#xff0c;選擇單例模式就是為了避免不一致狀態(tài),避免政出多頭。
//懶漢式單例類.在第一次調(diào)用的時候?qū)嵗约?/p>
public classSingleton {privateSingleton() {}private static Singleton single=null;//靜態(tài)工廠方法
public staticSingleton getInstance() {if (single == null) {
single= newSingleton();
}returnsingle;
}
}
5. Collection和Collections
1、java.util.Collection 是一個集合接口。它提供了對集合對象進行基本操作的通用接口方法。Collection接口在Java 類庫中有很多具體的實現(xiàn)。Collection接口的意義是為各種具體的集合提供了最大化的統(tǒng)一操作方式。
Collection
├List
│├LinkedList
│├ArrayList
│└Vector
│ └Stack
└Set
2、java.util.Collections 是一個包裝類。它包含有各種有關(guān)集合操作的靜態(tài)多態(tài)方法。此類不能實例化,就像一個工具類,服務(wù)于Java的Collection框架。
6. 支持排序的集合
Collection
List
Set
HashSet
TreeSet 是(用二叉樹排序)
Map使用key-value來映射和存儲數(shù)據(jù),Key必須惟一,
其中List和Set繼承自Collection接口。
Set不允許元素重復(fù)。HashSet和TreeSet是兩個主要的實現(xiàn)類。
List有序且允許元素重復(fù)。ArrayList、LinkedList和Vector是三個主要的實現(xiàn)類。
Map也屬于集合系統(tǒng),但和Collection接口不同。Map是key對value的映射集合,其中key列就是一個集合。key不能重復(fù),但是value可以重復(fù)。HashMap、TreeMap和Hashtable是三個主要的實現(xiàn)類。
SortedSet和SortedMap接口對元素按指定規(guī)則排序,SortedMap是對key列進行排序。
7. java泛型
8. final、finally、finalized
final—修飾符(關(guān)鍵字)如果一個類被聲明為final,意味著它不能再派生出新的子類,不能作為父類被繼承。因此一個類不能既被聲明為 abstract的,又被聲明為final的。
將變量或方法聲明為final,可以保證它們在使用中不被改變。被聲明為final的變量必須在聲明時給定初值,而在以后的引用中只能讀取,不可修改。
被聲明為final的方法也同樣只能使用,不能重載。
finally—再異常處理時提供 finally 塊來執(zhí)行任何清除操作。如果拋出一個異常,那么相匹配的 catch 子句就會執(zhí)行,然后控制就會進入 finally 塊(如果有的話)。
finalize—方法名。finalize是Object類的一個方法,在垃圾收集器執(zhí)行的時候會調(diào)用被回收對象的此方法,供垃圾收集時的其他資源回收,例如關(guān)閉文件等。它是在 Object 類中定義的,因此所有的類都繼承了它。子類覆蓋 finalize() 方法以整理系統(tǒng)資源或者執(zhí)行其他清理工作。finalize() 方法是在垃圾收集器刪除對象之前對這個對象調(diào)用的。
9. native
Java不是完美的,Java的不足除了體現(xiàn)在運行速度上要比傳統(tǒng)的C++慢許多之外,Java無法直接訪問到操作系統(tǒng)底層(如系統(tǒng)硬件等),為此Java使用native方法來擴展Java程序的功能。
可以將native方法比作Java程序同C程序的接口,其實現(xiàn)步驟:
1、在Java中聲明native()方法,然后編譯。
2、用javah產(chǎn)生一個.h文件。
3、寫一個.cpp文件實現(xiàn)native導(dǎo)出方法,其中需要包含第二步產(chǎn)生的.h文件(注意其中又包含了JDK帶的jni.h文件)。
4、將第三步的.cpp文件編譯成動態(tài)鏈接庫文件。
5、在Java中用System.loadLibrary()方法加載第四步產(chǎn)生的動態(tài)鏈接庫文件,這個native()方法就可以在Java中被訪問了。
JAVA的native方法適用的情況:
1、為了使用底層的主機平臺的某個特性,而這個特性不能通過JAVA API訪問。
2、為了訪問一個老的系統(tǒng)或者使用一個已有的庫,而這個系統(tǒng)或這個庫不是用JAVA編寫的。
3、為了加快程序的性能,而將一段時間敏感的代碼作為本地方法實現(xiàn)。
10. 多線程
JAVA多線程實現(xiàn)方式主要有三種:繼承Thread類、實現(xiàn)Runnable接口、使用ExecutorService、Callable、Future實現(xiàn)有返回結(jié)果的多線程。其中前兩種方式線程執(zhí)行完后都沒有返回值,只有最后一種是帶返回值的。
繼承Thread類
實現(xiàn)Runnable接口
應(yīng)用程序可以使用Executor框架來創(chuàng)建線程池
實現(xiàn)Runnable接口這種方式更受歡迎,因為這不需要繼承Thread類。在應(yīng)用設(shè)計中已經(jīng)繼承了別的對象的情況下,這需要多繼承(而Java不支持多繼承),只能實現(xiàn)接口。同時,線程池也是非常高效的,很容易實現(xiàn)和使用。
11. java中實現(xiàn)同步(線程安全的方法)
在Java語言中,每一個對象有一把鎖。線程可以使用synchronized關(guān)鍵字來獲取對象上的鎖。synchronized關(guān)鍵字可應(yīng)用在方法級別(粗粒度鎖)或者是代碼塊級別(細粒度鎖)。
(1)同步方法
即有synchronized關(guān)鍵字修飾的方法。
由于java的每個對象都有一個內(nèi)置鎖,當(dāng)用此關(guān)鍵字修飾方法時,
內(nèi)置鎖會保護整個方法。在調(diào)用該方法前,需要獲得內(nèi)置鎖,否則就處于阻塞狀態(tài)。
代碼如:
public synchronized void save(){}
注: synchronized關(guān)鍵字也可以修飾靜態(tài)方法,此時如果調(diào)用該靜態(tài)方法,將會鎖住整個類
(2)同步代碼塊
即有synchronized關(guān)鍵字修飾的語句塊。
被該關(guān)鍵字修飾的語句塊會自動被加上內(nèi)置鎖,從而實現(xiàn)同步
代碼如:
synchronized(object){
}
注:同步是一種高開銷的操作,因此應(yīng)該盡量減少同步的內(nèi)容。
通常沒有必要同步整個方法,使用synchronized代碼塊同步關(guān)鍵代碼即可。
(3)使用特殊域變量(volatile)實現(xiàn)線程同步
a.volatile關(guān)鍵字為域變量的訪問提供了一種免鎖機制,
b.使用volatile修飾域相當(dāng)于告訴虛擬機該域可能會被其他線程更新,
c.因此每次使用該域就要重新計算,而不是使用寄存器中的值
d.volatile不會提供任何原子操作,它也不能用來修飾final類型的變量
(4)使用局部變量實現(xiàn)線程同步
如果使用ThreadLocal管理變量,則每一個使用該變量的線程都獲得該變量的副本,
副本之間相互獨立,這樣每一個線程都可以隨意修改自己的變量副本,而不會對其他線程產(chǎn)生影響。
ThreadLocal 類的常用方法
ThreadLocal() : 創(chuàng)建一個線程本地變量
get() : 返回此線程局部變量的當(dāng)前線程副本中的值
initialValue() : 返回此線程局部變量的當(dāng)前線程的"初始值"
set(T value) : 將此線程局部變量的當(dāng)前線程副本中的值設(shè)置為value
12.java中實現(xiàn)PV操作
總結(jié)
以上是生活随笔為你收集整理的java entropy_java面试的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 流年暗换,是什么偷走了我们的爱情
- 下一篇: 方寸微 T620 存储安全芯片 安全存储