久久精品国产一区二区电影,久久精品国产亚洲av瑜伽,精品无人区一码卡二卡三,久草热8精品视频在线观看 ,久久99精品久久久久麻豆

錘子簡(jiǎn)歷品牌推廣師
百分之99的公司常問(wèn)到的JAVA面經(jīng)
作者:君仔小編 2022/03/25 11:10:04
閱讀 140
JAVA基礎(chǔ)面經(jīng)

請(qǐng)你說(shuō)說(shuō)Java和PHP的區(qū)別?

PHP暫時(shí)還不支持像Java那樣JIT運(yùn)行時(shí)編譯熱點(diǎn)代碼,但是PHP具有opcache機(jī)制,能夠把腳本對(duì)應(yīng)的opcode緩存在內(nèi)存,PHP7中還支持配置opcache.file_cache導(dǎo)出opcode到文件.第三方的Facebook HHVM也支持JIT.另外PHP官方基于LLVM圍繞opcache機(jī)制構(gòu)建的Zend JIT分支也正在開(kāi)發(fā)測(cè)試中.在php-src/Zend/bench.php測(cè)試顯示,PHP JIT分支速度是PHP 5.4的10倍. PHP的庫(kù)函數(shù)用C實(shí)現(xiàn),而Java核心運(yùn)行時(shí)類(lèi)庫(kù)(jdk/jre/lib/rt.jar,大于60MB)用Java編寫(xiě)(jdk/src.zip), 所以Java應(yīng)用運(yùn)行的時(shí)候,用戶(hù)編寫(xiě)的代碼以及引用的類(lèi)庫(kù)和框架都要在JVM上解釋執(zhí)行. Java的HotSpot機(jī)制,直到有方法被執(zhí)行10000次才會(huì)觸發(fā)JIT編譯, 在此之前運(yùn)行在解釋模式下,以避免出現(xiàn)JIT編譯花費(fèi)的時(shí)間比方法解釋執(zhí)行消耗的時(shí)間還要多的情況.

PHP內(nèi)置模板引擎,自身就是模板語(yǔ)言.而Java Web需要使用JSP容器如Tomcat或第三方模板引擎.

PHP也可以運(yùn)行在多線程模式下,比如Apache的event MPM和Facebook的HHVM都是多線程架構(gòu).不管是多進(jìn)程還是多線程的PHP Web運(yùn)行模式,都不需要PHP開(kāi)發(fā)者關(guān)心和控制,也就是說(shuō)PHP開(kāi)發(fā)者不需要寫(xiě)代碼參與進(jìn)程和線程的管理,這些都由PHP-FPM/HHVM/Apache實(shí)現(xiàn).PHP-FPM進(jìn)程管理和并發(fā)實(shí)現(xiàn)并不需要PHP開(kāi)發(fā)者關(guān)心,而Java多線程編程需要Java開(kāi)發(fā)者編碼參與.PHP一個(gè)worker進(jìn)程崩潰,master進(jìn)程會(huì)自動(dòng)新建一個(gè)新的worker進(jìn)程,并不會(huì)導(dǎo)致PHP服務(wù)崩潰.而Java多線程編程稍有不慎(比如沒(méi)有捕獲異常)就會(huì)導(dǎo)致JVM崩潰退出.對(duì)于PHP-FPM和Apache MOD_PHP來(lái)說(shuō),服務(wù)進(jìn)程常駐內(nèi)存,但一次請(qǐng)求釋放一次資源,這種內(nèi)存釋放非常徹底. PHP基于引用計(jì)數(shù)的GC甚至都還沒(méi)發(fā)揮作用程序就已經(jīng)結(jié)束了。

請(qǐng)你談?wù)凧ava中是如何支持正則表達(dá)式操作的?

Java中的String類(lèi)提供了支持正則表達(dá)式操作的方法,包括:matches()、replaceAll()、replaceFirst()、split()。此外,Java中可以用Pattern類(lèi)表示正則表達(dá)式對(duì)象,它提供了豐富的API進(jìn)行各種正則表達(dá)式操作,如:

import java.util.regex.Matcher;

import java.util.regex.Pattern;

class RegExpTest{

public static void main(String [] args){

String str = "成都市(成華區(qū))(武侯區(qū))(高新區(qū))";

Pattern p = Pattern.compile(".*?(?=()");

Matcher m = p.matcher(str);

if(m.find()){

System.out.println(m.group());

}

}

}

請(qǐng)你簡(jiǎn)單描述一下正則表達(dá)式及其用途。

在編寫(xiě)處理字符串的程序時(shí),經(jīng)常會(huì)有查找符合某些復(fù)雜規(guī)則的字符串的需要。正則表達(dá)式就是用于描述這些規(guī)則的工具。換句話說(shuō),正則表達(dá)式就是記錄文本規(guī)則的代碼。計(jì)算機(jī)處理的信息更多的時(shí)候不是數(shù)值而是字符串,正則表達(dá)式就是在進(jìn)行字符串匹配和處理的時(shí)候最為強(qiáng)大的工具,絕大多數(shù)語(yǔ)言都提供了對(duì)正則表達(dá)式的支持。

請(qǐng)你比較一下Java和JavaSciprt?

JavaScript 與Java是兩個(gè)公司開(kāi)發(fā)的不同的兩個(gè)產(chǎn)品。Java 是原Sun Microsystems公司推出的面向?qū)ο蟮某绦蛟O(shè)計(jì)語(yǔ)言,特別適合于互聯(lián)網(wǎng)應(yīng)用程序開(kāi)發(fā);而JavaScript是Netscape公司的產(chǎn)品,為了擴(kuò)展Netscape瀏覽器的功能而開(kāi)發(fā)的一種可以嵌入Web頁(yè)面中運(yùn)行的基于對(duì)象和事件驅(qū)動(dòng)的解釋性語(yǔ)言。JavaScript的前身是LiveScript;而Java的前身是Oak語(yǔ)言。 下面對(duì)兩種語(yǔ)言間的異同作如下比較: - 基于對(duì)象和面向?qū)ο螅篔ava是一種真正的面向?qū)ο蟮恼Z(yǔ)言,即使是開(kāi)發(fā)簡(jiǎn)單的程序,必須設(shè)計(jì)對(duì)象;JavaScript是種腳本語(yǔ)言,它可以用來(lái)制作與網(wǎng)絡(luò)無(wú)關(guān)的,與用戶(hù)交互作用的復(fù)雜軟件。它是一種基于對(duì)象(Object-Based)和事件驅(qū)動(dòng)(Event-Driven)的編程語(yǔ)言,因而它本身提供了非常豐富的內(nèi)部對(duì)象供設(shè)計(jì)人員使用。 - 解釋和編譯:Java的源代碼在執(zhí)行之前,必須經(jīng)過(guò)編譯。JavaScript是一種解釋性編程語(yǔ)言,其源代碼不需經(jīng)過(guò)編譯,由瀏覽器解釋執(zhí)行。(目前的瀏覽器幾乎都使用了JIT(即時(shí)編譯)技術(shù)來(lái)提升JavaScript的運(yùn)行效率) - 強(qiáng)類(lèi)型變量和類(lèi)型弱變量:Java采用強(qiáng)類(lèi)型變量檢查,即所有變量在編譯之前必須作聲明;JavaScript中變量是弱類(lèi)型的,甚至在使用變量前可以不作聲明,JavaScript的解釋器在運(yùn)行時(shí)檢查推斷其數(shù)據(jù)類(lèi)型。 - 代碼格式不一樣。

請(qǐng)你說(shuō)明一下,在Java中如何跳出當(dāng)前的多重嵌套循環(huán)?

在最外層循環(huán)前加一個(gè)標(biāo)記如A,然后用break A;可以跳出多重循環(huán)。(Java中支持帶標(biāo)簽的break和continue語(yǔ)句,作用有點(diǎn)類(lèi)似于C和C++中的goto語(yǔ)句,但是就像要避免使用goto一樣,應(yīng)該避免使用帶標(biāo)簽的break和continue,因?yàn)樗粫?huì)讓你的程序變得更優(yōu)雅,很多時(shí)候甚至有相反的作用,所以這種語(yǔ)法其實(shí)不知道更好),根本不能進(jìn)行字符串的equals比較,否則會(huì)產(chǎn)生NullPointerException異常。

請(qǐng)你講講&和&&的區(qū)別?

&運(yùn)算符有兩種用法:(1)按位與;(2)邏輯與。&&運(yùn)算符是短路與運(yùn)算。邏輯與跟短路與的差別是非常巨大的,雖然二者都要求運(yùn)算符左右兩端的布爾值都是true整個(gè)表達(dá)式的值才是true。&&之所以稱(chēng)為短路運(yùn)算是因?yàn)?,如?&左邊的表達(dá)式的值是false,右邊的表達(dá)式會(huì)被直接短路掉,不會(huì)進(jìn)行運(yùn)算。很多時(shí)候我們可能都需要用&&而不是&,例如在驗(yàn)證用戶(hù)登錄時(shí)判定用戶(hù)名不是null而且不是空字符串,應(yīng)當(dāng)寫(xiě)為:username != null &&!username.equals(""),二者的順序不能交換,更不能用&運(yùn)算符,因?yàn)榈谝粋€(gè)條件如果不成立,根本不能進(jìn)行字符串的equals比較,否則會(huì)產(chǎn)生NullPointerException異常。

int和Integer有什么區(qū)別?

Java是一個(gè)近乎純潔的面向?qū)ο缶幊陶Z(yǔ)言,但是為了編程的方便還是引入了基本數(shù)據(jù)類(lèi)型,但是為了能夠?qū)⑦@些基本數(shù)據(jù)類(lèi)型當(dāng)成對(duì)象操作,Java為每一個(gè)基本數(shù)據(jù)類(lèi)型都引入了對(duì)應(yīng)的包裝類(lèi)型(wrapper class),int的包裝類(lèi)就是Integer,從Java 5開(kāi)始引入了自動(dòng)裝箱/拆箱機(jī)制,使得二者可以相互轉(zhuǎn)換。 Java 為每個(gè)原始類(lèi)型提供了包裝類(lèi)型: - 原始類(lèi)型: boolean,char,byte,short,int,long,float,double - 包裝類(lèi)型:Boolean,Character,Byte,Short,Integer,Long,F(xiàn)loat,Double

如:

public class AutiUnboxingTest{

public static void main(){

Integer a = new Integer(3);

Integer b = 3; //將3自動(dòng)裝箱成Integer類(lèi)型

int c = 3;

System.out.println(a == b); //false 連個(gè)引用沒(méi)有引用同一個(gè)對(duì)象

System.out.println(a == c); //true a自動(dòng)拆箱成int類(lèi)型再和c比較

}

}

我們?cè)趙eb應(yīng)用開(kāi)發(fā)過(guò)程中經(jīng)常遇到輸出某種編碼的字符,如iso8859-1等,請(qǐng)你講講如何輸出一個(gè)某種編碼的字符串?

Public String translate (String str) {

String tempStr = “”;

try {

tempStr = new String(str.getBytes(“ISO-8859-1″), “GBK”);

tempStr = tempStr.trim();

} catch (Exception e) {

System.err.println(e.getMessage());

}

return tempStr;

}

請(qǐng)你說(shuō)明String 和StringBuffer的區(qū)別

JAVA 平臺(tái)提供了兩個(gè)類(lèi):String和StringBuffer,它們可以?xún)?chǔ)存和操作字符串,即包含多個(gè)字符的字符數(shù)據(jù)。這個(gè)String類(lèi)提供了數(shù)值不可改變的字符串。而這個(gè)StringBuffer類(lèi)提供的字符串進(jìn)行修改。當(dāng)你知道字符數(shù)據(jù)要改變的時(shí)候你就可以使用StringBuffer。典型地,你可以使用StringBuffers來(lái)動(dòng)態(tài)構(gòu)造字符數(shù)據(jù)。

請(qǐng)你說(shuō)明一下int 和 Integer 有什么區(qū)別

Java 提供兩種不同的類(lèi)型:引用類(lèi)型和原始類(lèi)型(或內(nèi)置類(lèi)型)。Int是java的原始數(shù)據(jù)類(lèi)型,Integer是java為int提供的封裝類(lèi)。 Java為每個(gè)原始類(lèi)型提供了封裝類(lèi)。 原始類(lèi)型封裝類(lèi) booleanBoolean charCharacter byteByte shortShort intInteger longLong floatFloat doubleDouble 引用類(lèi)型和原始類(lèi)型的行為完全不同,并且它們具有不同的語(yǔ)義。引用類(lèi)型和原始類(lèi)型具有不同的特征和用法,它們包括:大小和速 度問(wèn)題,這種類(lèi)型以哪種類(lèi)型的數(shù)據(jù)結(jié)構(gòu)存儲(chǔ),當(dāng)引用類(lèi)型和原始類(lèi)型用作某個(gè)類(lèi)的實(shí)例數(shù)據(jù)時(shí)所指定的缺省值。對(duì)象引用實(shí)例變量 的缺省值為null,而原始類(lèi)型實(shí)例變量的缺省值與它們的類(lèi)型有關(guān)。

請(qǐng)說(shuō)明String是最基本的數(shù)據(jù)類(lèi)型嗎?

基本數(shù)據(jù)類(lèi)型包括byte、int、char、long、float、double、boolean和short。 java.lang.String類(lèi)是final類(lèi)型的,因此不可以繼承這個(gè)類(lèi)、不能修改這個(gè)類(lèi)。為了提高效率節(jié)省空間,我們應(yīng)該用StringBuffer類(lèi)。

請(qǐng)你談?wù)劥驩符號(hào)(big-O notation)并給出不同數(shù)據(jù)結(jié)構(gòu)的例子

大O符號(hào)描述了當(dāng)數(shù)據(jù)結(jié)構(gòu)里面的元素增加的時(shí)候,算法的規(guī)?;蛘呤切阅茉谧顗牡膱?chǎng)景下有多么好。 大O符號(hào)也可用來(lái)描述其他的行為,比如:內(nèi)存消耗。因?yàn)榧项?lèi)實(shí)際上是數(shù)據(jù)結(jié)構(gòu),我們一般使用大O符號(hào)基于時(shí)間,內(nèi)存和性能來(lái)選擇最好的實(shí)現(xiàn)。大O符號(hào)可以對(duì)大量數(shù)據(jù)的性能給出一個(gè)很好的說(shuō)明。

同時(shí),大O符號(hào)表示一個(gè)程序運(yùn)行時(shí)所需要的漸進(jìn)時(shí)間復(fù)雜度上界。

其函數(shù)表示是:

對(duì)于函數(shù)f(n),g(n),如果存在一個(gè)常數(shù)c,使得f(n)<=c*g(n),則f(n)=O(g(n));

大O描述當(dāng)數(shù)據(jù)結(jié)構(gòu)中的元素增加時(shí),算法的規(guī)模和性能在最壞情景下有多好。

大O還可以描述其它行為,比如內(nèi)存消耗。因?yàn)榧项?lèi)實(shí)際上是數(shù)據(jù)結(jié)構(gòu),因此我們一般使用大O符號(hào)基于時(shí)間,內(nèi)存,性能選擇最好的實(shí)現(xiàn)。大O符號(hào)可以對(duì)大量數(shù)據(jù)性能給予一個(gè)很好的說(shuō)明。

請(qǐng)你講講數(shù)組(Array)和列表(ArrayList)的區(qū)別?什么時(shí)候應(yīng)該使用Array而不是ArrayList?

Array和ArrayList的不同點(diǎn): Array可以包含基本類(lèi)型和對(duì)象類(lèi)型,ArrayList只能包含對(duì)象類(lèi)型。 Array大小是固定的,ArrayList的大小是動(dòng)態(tài)變化的。 ArrayList提供了更多的方法和特性,比如:addAll(),removeAll(),iterator()等等。 對(duì)于基本類(lèi)型數(shù)據(jù),集合使用自動(dòng)裝箱來(lái)減少編碼工作量。但是,當(dāng)處理固定大小的基本數(shù)據(jù)類(lèi)型的時(shí)候,這種方式相對(duì)比較慢。

請(qǐng)你解釋什么是值傳遞和引用傳遞?

值傳遞是對(duì)基本型變量而言的,傳遞的是該變量的一個(gè)副本,改變副本不影響原變量. 引用傳遞一般是對(duì)于對(duì)象型變量而言的,傳遞的是該對(duì)象地址的一個(gè)副本, 并不是原對(duì)象本身 。 所以對(duì)引用對(duì)象進(jìn)行操作會(huì)同時(shí)改變?cè)瓕?duì)象. 一般認(rèn)為,java內(nèi)的傳遞都是值傳遞.

請(qǐng)你講講Java支持的數(shù)據(jù)類(lèi)型有哪些?什么是自動(dòng)拆裝箱?

Java語(yǔ)言支持的8種基本數(shù)據(jù)類(lèi)型是: byte short int long float double boolean char 自動(dòng)裝箱是Java編譯器在基本數(shù)據(jù)類(lèi)型和對(duì)應(yīng)的對(duì)象包裝類(lèi)型之間做的一個(gè)轉(zhuǎn)化。比如:把int轉(zhuǎn)化成Integer,double轉(zhuǎn)化成Double,等等。反之就是自動(dòng)拆箱。

請(qǐng)你解釋為什么會(huì)出現(xiàn)4.0-3.6=0.40000001這種現(xiàn)象?

原因簡(jiǎn)單來(lái)說(shuō)是這樣:2進(jìn)制的小數(shù)無(wú)法精確的表達(dá)10進(jìn)制小數(shù),計(jì)算機(jī)在計(jì)算10進(jìn)制小數(shù)的過(guò)程中要先轉(zhuǎn)換為2進(jìn)制進(jìn)行計(jì)算,這個(gè)過(guò)程中出現(xiàn)了誤差。

請(qǐng)你講講一個(gè)十進(jìn)制的數(shù)在內(nèi)存中是怎么存的?

補(bǔ)碼的形式。

請(qǐng)你說(shuō)說(shuō)Lamda表達(dá)式的優(yōu)缺點(diǎn)。

優(yōu)點(diǎn):1. 簡(jiǎn)潔。2. 非常容易并行計(jì)算。3. 可能代表未來(lái)的編程趨勢(shì)。

缺點(diǎn):1. 若不用并行計(jì)算,很多時(shí)候計(jì)算速度沒(méi)有比傳統(tǒng)的 for 循環(huán)快。(并行計(jì)算有時(shí)需要預(yù)熱才顯示出效率優(yōu)勢(shì))2. 不容易調(diào)試。3. 若其他程序員沒(méi)有學(xué)過(guò) lambda 表達(dá)式,代碼不容易讓其他語(yǔ)言的程序員看懂。

你知道java8的新特性嗎,請(qǐng)簡(jiǎn)單介紹一下

Lambda 表達(dá)式 ? Lambda允許把函數(shù)作為一個(gè)方法的參數(shù)(函數(shù)作為參數(shù)傳遞進(jìn)方法中。

方法引用? 方法引用提供了非常有用的語(yǔ)法,可以直接引用已有Java類(lèi)或?qū)ο螅▽?shí)例)的方法或構(gòu)造器。與lambda聯(lián)合使用,方法引用可以使語(yǔ)言的構(gòu)造更緊湊簡(jiǎn)潔,減少冗余代碼。

默認(rèn)方法? 默認(rèn)方法就是一個(gè)在接口里面有了一個(gè)實(shí)現(xiàn)的方法。

新工具? 新的編譯工具,如:Nashorn引擎 jjs、 類(lèi)依賴(lài)分析器jdeps。

Stream API ?新添加的Stream API(java.util.stream) 把真正的函數(shù)式編程風(fēng)格引入到Java中。

Date Time API ? 加強(qiáng)對(duì)日期與時(shí)間的處理。

Optional 類(lèi) ? Optional 類(lèi)已經(jīng)成為 Java 8 類(lèi)庫(kù)的一部分,用來(lái)解決空指針異常。

Nashorn, JavaScript 引擎 ? Java 8提供了一個(gè)新的Nashorn javascript引擎,它允許我們?cè)贘VM上運(yùn)行特定的javascript應(yīng)用。

請(qǐng)你說(shuō)明符號(hào)“==”比較的是什么?

“==”對(duì)比兩個(gè)對(duì)象基于內(nèi)存引用,如果兩個(gè)對(duì)象的引用完全相同(指向同一個(gè)對(duì)象)時(shí),“==”操作將返回true,否則返回false。“==”如果兩邊是基本類(lèi)型,就是比較數(shù)值是否相等。

請(qǐng)你解釋Object若不重寫(xiě)hashCode()的話,hashCode()如何計(jì)算出來(lái)的?

Object 的 hashcode 方法是本地方法,也就是用 c 語(yǔ)言或 c++ 實(shí)現(xiàn)的,該方法直接返回對(duì)象的 內(nèi)存地址。

請(qǐng)你解釋為什么重寫(xiě)equals還要重寫(xiě)hashcode?

HashMap中,如果要比較key是否相等,要同時(shí)使用這兩個(gè)函數(shù)!因?yàn)樽远x的類(lèi)的hashcode()方法繼承于Object類(lèi),其hashcode碼為默認(rèn)的內(nèi)存地址,這樣即便有相同含義的兩個(gè)對(duì)象,比較也是不相等的。HashMap中的比較key是這樣的,先求出key的hashcode(),比較其值是否相等,若相等再比較equals(),若相等則認(rèn)為他們是相等的。若equals()不相等則認(rèn)為他們不相等。如果只重寫(xiě)hashcode()不重寫(xiě)equals()方法,當(dāng)比較equals()時(shí)只是看他們是否為同一對(duì)象(即進(jìn)行內(nèi)存地址的比較),所以必定要兩個(gè)方法一起重寫(xiě)。HashMap用來(lái)判斷key是否相等的方法,其實(shí)是調(diào)用了HashSet判斷加入元素 是否相等。重載hashCode()是為了對(duì)同一個(gè)key,能得到相同的Hash Code,這樣HashMap就可以定位到我們指定的key上。重載equals()是為了向HashMap表明當(dāng)前對(duì)象和key上所保存的對(duì)象是相等的,這樣我們才真正地獲得了這個(gè)key所對(duì)應(yīng)的這個(gè)鍵值對(duì)。

請(qǐng)你介紹一下map的分類(lèi)和常見(jiàn)的情況

java為數(shù)據(jù)結(jié)構(gòu)中的映射定義了一個(gè)接口java.util.Map;它有四個(gè)實(shí)現(xiàn)類(lèi),分別是HashMap Hashtable LinkedHashMap 和TreeMap.

Map主要用于存儲(chǔ)健值對(duì),根據(jù)鍵得到值,因此不允許鍵重復(fù)(重復(fù)了覆蓋了),但允許值重復(fù)。

Hashmap 是一個(gè)最常用的Map,它根據(jù)鍵的HashCode值存儲(chǔ)數(shù)據(jù),根據(jù)鍵可以直接獲取它的值,具有很快的訪問(wèn)速度,遍歷時(shí),取得數(shù)據(jù)的順序是完全隨機(jī)的。 HashMap最多只允許一條記錄的鍵為Null;允許多條記錄的值為 Null;HashMap不支持線程的同步,即任一時(shí)刻可以有多個(gè)線程同時(shí)寫(xiě)HashMap;可能會(huì)導(dǎo)致數(shù)據(jù)的不一致。如果需要同步,可以用 Collections的synchronizedMap方法使HashMap具有同步的能力,或者使用ConcurrentHashMap。

Hashtable與 HashMap類(lèi)似,它繼承自Dictionary類(lèi),不同的是:它不允許記錄的鍵或者值為空;它支持線程的同步,即任一時(shí)刻只有一個(gè)線程能寫(xiě)Hashtable,因此也導(dǎo)致了 Hashtable在寫(xiě)入時(shí)會(huì)比較慢。

LinkedHashMap 是HashMap的一個(gè)子類(lèi),保存了記錄的插入順序,在用Iterator遍歷LinkedHashMap時(shí),先得到的記錄肯定是先插入的.也可以在構(gòu)造時(shí)用帶參數(shù),按照應(yīng)用次數(shù)排序。在遍歷的時(shí)候會(huì)比HashMap慢,不過(guò)有種情況例外,當(dāng)HashMap容量很大,實(shí)際數(shù)據(jù)較少時(shí),遍歷起來(lái)可能會(huì)比 LinkedHashMap慢,因?yàn)長(zhǎng)inkedHashMap的遍歷速度只和實(shí)際數(shù)據(jù)有關(guān),和容量無(wú)關(guān),而HashMap的遍歷速度和他的容量有關(guān)。

TreeMap實(shí)現(xiàn)SortMap接口,能夠把它保存的記錄根據(jù)鍵排序,默認(rèn)是按鍵值的升序排序,也可以指定排序的比較器,當(dāng)用Iterator 遍歷TreeMap時(shí),得到的記錄是排過(guò)序的。

一般情況下,我們用的最多的是HashMap,在Map 中插入、刪除和定位元素,HashMap 是最好的選擇。但如果您要按自然順序或自定義順序遍歷鍵,那么TreeMap會(huì)更好。如果需要輸出的順序和輸入的相同,那么用LinkedHashMap 可以實(shí)現(xiàn),它還可以按讀取順序來(lái)排列.

HashMap是一個(gè)最常用的Map,它根據(jù)鍵的hashCode值存儲(chǔ)數(shù)據(jù),根據(jù)鍵可以直接獲取它的值,具有很快的訪問(wèn)速度。HashMap最多只允許一條記錄的鍵為NULL,允許多條記錄的值為NULL。

HashMap不支持線程同步,即任一時(shí)刻可以有多個(gè)線程同時(shí)寫(xiě)HashMap,可能會(huì)導(dǎo)致數(shù)據(jù)的不一致性。如果需要同步,可以用Collections的synchronizedMap方法使HashMap具有同步的能力。

Hashtable與HashMap類(lèi)似,不同的是:它不允許記錄的鍵或者值為空;它支持線程的同步,即任一時(shí)刻只有一個(gè)線程能寫(xiě)Hashtable,因此也導(dǎo)致了Hashtable在寫(xiě)入時(shí)會(huì)比較慢。

LinkedHashMap保存了記錄的插入順序,在用Iterator遍歷LinkedHashMap時(shí),先得到的記錄肯定是先插入的。

在遍歷的時(shí)候會(huì)比HashMap慢TreeMap能夠把它保存的記錄根據(jù)鍵排序,默認(rèn)是按升序排序,也可以指定排序的比較器。當(dāng)用Iterator遍歷TreeMap時(shí),得到的記錄是排過(guò)序的。

內(nèi)容來(lái)源說(shuō)明:本文章來(lái)自網(wǎng)絡(luò)收集,如侵犯了你的權(quán)益,請(qǐng)聯(lián)系QQ:2772182309進(jìn)行刪除。
智能在線簡(jiǎn)歷編輯器
錘子簡(jiǎn)歷在線簡(jiǎn)歷制作,一鍵導(dǎo)出,快速生成 專(zhuān)屬你的優(yōu)秀求職簡(jiǎn)歷,敲定高薪 Offer~
立即創(chuàng)建簡(jiǎn)歷

【使用錘子簡(jiǎn)歷小程序制作簡(jiǎn)歷】

范文模板 更多>