




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
Java初中級程序員面試題寶典
Java基礎部分
&與&&區別?
&和&&都是邏輯運算符,都是判斷兩邊同時真則為真,否則為假;
但是&&當第一個條件不成之后,后面的條件都不執行了,而&則
還是繼續執行,直到整個條件語句執行完為止。
使用final關鍵字修飾一個變量時,是引用不能變,還是引用的對
象不能變?
使用final關鍵字修飾一個變量時,是指引用變量不能變,引用變
量所指向的對象中的內容還是可以改變的。
靜態變量和實例變量的區別?
在語法定義上的區別:
靜態變量前要加static關鍵字,而實例變量前則不加。
在程序運行時的區別:實例變量屬于某個對象的屬性,必須創建了
實例對象,其中的實例變量才會被分配空間,才能使用這個實例變
量。
靜態變量不屬于某個實例對象,而是屬于類,所以也稱為類變量,
只要程序加載了類的字節碼,不用創建任何實例對象,靜態變量就
會被分配空間,靜態變量就可以被使用了。
總之,實例變量必須創建對象后才可以通過這個對象來使用,靜態
變量則可以直接使用類名來引用。
靜態變量使用時,通過類名.名稱,實例變量必須要初始化后才能使用。
實例變量是實例化后才會分配空間,而靜態變量當類加載時會分配空
間。
是否可以從一個static方法內部發出對非static方法的調用?
不可以。因為非static方法是要與對象關聯在一起的,必須創建
一個對象后,才可以在該對象上進行方法調用,而static方法調
用時不需要創建對象,可以直接調用。也就是說,當一個static
方法被調用時,可能還沒有創建任何實例對象,如果從一個static
方法中發出對非static方法的調用,那個非static方法是關聯
到哪個對象上的呢?這個邏輯無法成立,所以,一個static方法
內部發出對非static方法的調用。
非static方法可以訪問static方法.
static方法不能訪問非static方法
“=="和equals方法究竟有什么區別?
==如果判斷值類型的話,判斷內容是否相同。如果判斷引用類型
則是判斷內存地址是否相同
Equals判斷值內容是否相等
Integer與int的區別
Integer是引用類型,默認值是null。而int是是值類型默認值是
0
請說出作用域public,private,protected,以及不寫時的
區別
這四個作用域的可見范圍如下表所示。
些明:如果在修飾的元素上面沒有寫任何訪問修飾符,則表
示friendlyo
作用域當前類同一包(package)子孫類其他包
(package)
publicNd4d
protectedN74x
friendlyNdxx
private4xxx
重載與重寫區別?
重載是同一個類中,方法名稱相同,但是參數或個數不同。與返回
值沒有關系。
重寫是在多個類中,產生繼承關系。父類與子類的方法方法必須相
同。
接口與抽象類的區別?
區別:定義接口的關鍵字是:interface而定義抽象類的關鍵字是:
abstracto
接口中成員不能有私有,抽象類可以。
接口中定義的成員,是finlpublicstatic類型,抽象類沒有。
接口中的不能有普通方法,抽象類中可以。
相同:
兩個都不new
但是接口與抽象類是面向對象必備知識,設計模式、重構代碼有必
然作用
final,finally,finalize的區別。
final用于聲明屬性,方法和類,分別表示屬性不可變,方法不可
覆蓋,類不可繼承。
內部類要訪問局部變量,局部變量必須定義成final類型,例如,
一段代碼……
finally是異常處理語句結構的一部分,表示總是執行。
finalize是Object類的一個方法,在垃圾收集器執行的時候
會調用被回收對象的此方法,可
以覆蓋此方法提供垃圾收集時的其他資源回收,例如關閉文件
等。JVM不保證此方法總被
調用
String、StringBuffer與StringBuilder的區別
String字符串常量
StringBuffer字符串變量(線程安全)
StringBuilder字符串變量(非線程安全)
所有的類都繼承于object類,你用過的object類的直接子類有哪
些,object類常用的方法
有哪些
1.clone方法
保護方法,實現對象的淺復制,只有實現了Cloneable接口才可以
調用該方法,否則拋出CloneNotSupportedException異常。
2.getClass方法
final方法,獲得運行時類型。
3.toString方法
該方法用得比較多,一般子類都有覆蓋。
4.finalize方法
該方法用于釋放資源。因為無法確定該方法什么時候被調用,很少
使用。
5.equals方法
該方法是非常重要的一個方法。一般equals和==是不一樣的,但是
在Object中兩者是一樣的。子類一般都要重寫這個方法。
6.數組有沒有length。這個方法?String有沒有length。這個方
法?
答:數組沒有length。這個方法,有length的屬性。String有有
length。這個方法。
7.hashCode方法
該方法用于哈希查找,重寫了equals方法一般都要重寫hashCode
方法。這個方法在一些具有哈希功能的Collection中用到。
一般必須滿足objl.equals(obj2)==true。可以推出objl.hash-
Code()==obj2.hashCode(),但是hashCode相等不一定就滿足
equalSo不過為了提高效率,應該盡量使上面兩個條件接近等價。
7.wait方法
wait方法就是使當前線程等待該對象的鎖,當前線程必須是該對象
的擁有者,也就是具有該對象的鎖。wait。方法一直等待,直到獲
得鎖或者被中斷。wait(longtimeout)設定一個超時間隔,如果在
規定時間內沒有獲得鎖就返回。
調用該方法后當前線程進入睡眠狀態,直到以下事件發生。
(1)其他線程調用了該對象的notify方法。
(2)其他線程調用了該對象的notifyAll方法。
(3)其他線程調用了interrupt中斷該線程。
(4)時間間隔到了。
此時該線程就可以被調度了,如果是被中斷的話就拋出一個
InterruptedException異常。
8.notify方法
該方法喚醒在該對象上等待的某個線程。
9.notifyAll方法
該方法喚醒在該對象上等待的所有線程
反射的優缺點?
反射:就是正在運行動態讀取這個類的完整信息。
優點:java的反射機制就是增加程序的靈活性、
缺點:缺點:(1)性能問題:使用反射基本上是一種解釋操作,
用于字段和方法接入時要遠慢于直接代碼。因此反射機制主要應用
在對靈活性和擴展性要求很高的系統框架上,普通程序不建議使用o
(2)使用反射會模糊程序內內部邏輯:程序員希望在源代碼中看到
程序的邏輯,反射等繞過了源代碼的技術,因而會帶來維護問題。
反射代碼比相應的直接代碼更復雜。
那些地方用到了反射?
例如:jdbc、Java常用框架、jdk的動態代理、android的加載布局
文件
java中有幾種類型的流?JDK為每種類型的流提供了一些抽象
類以供繼承,為每種類型的流提供了一些抽象類以供繼承,
請說出他們分別是哪些類?
字節流,字符流。字節流繼承于InputstreamOutputstream,
字符流繼承于
InputStreamReaderOutputStreamWritero在java.io包中還有
許多其他的流,主要是為了提
高性能和使用方便。
多線程部分
什么是多線程?
在一個應用程序中,同時,有多個不同的執行路徑。
說一下多線程的好處?
提供程序效率。
線程和進程有什么區別?
線程是進程的一條執行路徑,而進程是線程的集合。
什么是線程同步、異步?
線程同步表示,當前線程執行完后下一個線程接著執行。
線程異步表示,在一個應用程序中,同時,有多個不同的執行路
徑。例如javawebajaxandroidhandler
線程之間如何同步
線程之間同步使用synchronized、wait與notify
什么是線程不安全?如何解決?(重點)
就是在多個線程共享同一個數據會受到其他線程的干擾。如何解
決:使用線程同步技術,用上鎖(synchronized)。讓一個線程執行
完了,在讓另一個線程執行。
如何創建一個線程?有幾種方法?
繼承thread類,重寫run方法、實現Runnalbe接口,重新
run方法,啟動一個線程用start();
是使用Runnalbe接口好?還是繼承Thread類好?
是實現Runnalbe接口好,因為實現的接口還可以繼續繼承。如
果繼承了Thread類不能在繼承。
sleep。和wait。有什么區別?
a、sleep是讓當前線程指定休眠時間,然后繼續工作不釋
放鎖
b、讓當前線程wait則是等待,直到有線程通知notify()
喚醒他才會重新工作。釋放鎖
集合相關面試題
java中集合類的關系圖
Iterator1:Collect]on匕:Map
:ProducesIjProducest
AAA
|HashMa^j
Listiterator:■<<List:SetTreeMap
Reduces
Ar
LinkedHashMap
ArrayListLinkedjstIHashSetITreeSet
UnkedHashSet
iComparable<7Comparator;
說一下數據結構中的什么是數組?什么是鏈表?
所謂數組,是相同數據類型的元素按一定順序排列的集合
數組:存儲區間是連續的,占用內存嚴重,故空間復雜的很大。但
數組的二分查找時間復雜度小,為0(1);數組的特點是;尋址容
易,插入和刪除困難;
所謂鏈表,鏈表是一種物理存儲單元上非連續、非順序的存儲結構,
數據元素的邏輯順序是通過鏈表中的指針鏈接次序實現的。鏈表由
一系列結點(鏈表中每一個元素稱為結點)組成,結點可以在運行
時動態生成。每個結點包括兩個部分:一個是存儲數據元素的數據
域,另一個是存儲下一個結點地址的指針域。相比于線性表順序結
構,操作復雜。由于不必須按順序存儲,鏈表在插入的時候可以達
到0(1)的復雜度,比另一種線性表順序表快得多,但是查找一個節
點或者訪問特定編號的節點則需要o(n)的時間,而線性表和順序表
相應的時間復雜度分別是0(logn)和0(1)。
鏈表:鏈表存儲區間離散,占用內存比較寬松,故空間復雜度很小,
但時間復雜度很大,達0(N)。鏈表的特點是:尋址困難,插入和
刪除容易。
說一下什么是哈希表
那么我們能不能綜合兩者的特性,做出一種尋址容易,插入刪除也
容易的數據結構?答案是肯定的,這就是我們要提起的哈希表。哈
希表((Hashtable)既滿足了數據的查找方便,同時不占用太多
的內容空間,使用也十分方便。
哈希表有多種不同的實現方法,我接下來解釋的是最常用的一
種方法一一拉鏈法,我們可以理解為“鏈表的數組”,如圖:
0
T1
T
T
T
~5
y
T
T
5
ioa26
i791
12~V2L—*28
13T
14
15
說一下ArrayList底層實現方式?
①ArrayList通過數組實現,一旦我們實例化ArrayList無參數構
造函數默認為數組初始化長度為10
②add方法底層實現如果增加的元素個數超過了10個,那么
ArrayList底層會新生成一個數組,長度為原數組的1.5倍+L然
后將原數組的內容復制到新數組當中,并且后續增加的內容都會放
到新數組當中。當新數組無法容納增加的元素時,重復該過程。是
一旦數組超出長度,就開始擴容數組。擴容數組調用的方法
Arrays.copyOf(objArr,objArr.length+1);
說一下LinkedList底層實現方式?
LinkedList底層的數據結構是基于雙向循環鏈表的,且頭結點中不
存放數據,如下:
Head節點,不包含數據
datadata
既然是雙向鏈表,那么必定存在一種數據結構一一我們可以稱之為
節點,節點實例保存業務數據,前一個節點的位置信息和后一個節
點位置信息,如下圖所示:
[節點N
節點N-1前節點信息業務數據后節點信息節點N+1
說一下HashMap底層實現方式?
HashMap是由數組+鏈表組成
put方法底層實現:
通過key的hash值%£11宜丫[].length得到該存儲的下標位置,如果
多個key的hash值%£成燈口.length值相同話就就會存儲到該鏈表
的后面。
ArrayList和Vector的區別
這兩個類都實現了List接口(List接口繼承了
Collection接口),他們都是有序集合,即存儲在這兩個集合中的元
素的位置都是有順序的,相當于一種動態的數組,我們以后可以按位
置索引號取出某個元素,并且其中的數據是允許重復的,
ArrayList與Vector的區別,這主要包括兩個方面:.
⑴同步性:
Vector是線程安全的,也就是說是它的方法之間是線程同步的,
而ArrayList是線程序不安全的,它的方法之間是線程不同步的。
如果只有一個線程會訪問到集合,那最好是使用ArrayList,因為它
不考慮線程安全,效率會高些;如果有多個線程會訪問到集合,那最好
是使用Vector,因為不需要我們自己再去考慮和編寫線程安全的代
碼。
(2)數據增長:
ArrayList與Vector都有一個初始的容量大小,當存儲進它們
里面的元素的個數超過了容量時,就需要增
加ArrayList與Vector的存儲空間,每次要增加存儲空間時,
不是只增加一個存儲單元,而是增加多個存儲單元,每次增加的存儲
單元的個數在內存空間利用與程序效率之間要取得一定的平衡。
Vector默認增長為原來兩倍,而ArrayList的增長策略在文檔
中沒有明確規定(從源代碼看到的是增長為原來的1.5倍)。
ArrayList與Vector都可以設置初始的空間大小,Vector還
可以設置增長的空間大小,而ArrayList沒有提供設置增長空間
的方法。
HashMap和Hashtable的區別
總結:
克允許有HashMap是HashMap
方法不是
呈有效率containsvalueJaval.2引是
Synchronize
hashmap>'null高一和進的MapHashtable
的要提供外
E的鍵點、containsKeyinterface的輕量級
同步
R和值方法的一個實現實現
我不允、
Hashtable
告許有效率方法是是Hashtable
有contains方比
hashtable_三null稍Synchronize繼承于
法方法HashMap
:的鍵低、的Dictionary
要舊
亡和值類
List和Set、Map區別?
Java中的集合包括三大類,它們是Set、List和Map,它們都處于
java.util包中,Set、List和Map都是接口,它們有各自的實現類。
Set的實現類主要有HashSet和TreeSet,List的實現類主要有
ArrayList,Map的實現類主要有HashMap和TreeMap。
Set中的對象不按特定方式排序,并且沒有重復對象。但它的
有些實現類能對集合中的對象按特定方式排序,例如TreeSet類,
它可以按照默認排序,也可以通過實現
java.util.Comparator〈Type>接口來自定義排序方式。
List中的對象按照索引位置排序,可以有重復對象,允許按照
對象在集合中的索引位置檢索對象,如通過list,get(i)方式來獲
得List集合中的元素。
Map中的每一個元素包含一個鍵對象和值對象,它們成對出現。
鍵對象不能重復,值對象可以重復。
List、Map、Set三個接口,存取元素時,各有什么特點?
list:存儲:有序的可重復的
訪問:可以for循環,foreach循環,iterator迭代器迭代。
set:存儲:無序的不重復的
訪問:可以foreach循環,iterator迭代器迭代
map:存儲:存儲的是一對一對的映射“key=value",key值是
無序,不重復的。value值可重復
訪問:可以map中key值轉為為set存儲,然后迭代這個set,用
map.get(key)獲取value
也可以轉換為entry對象用迭代器迭代
說出ArrayList,Vector,LinkedList的存儲性能和特性
ArrayList和Vector都是使用數組方式存儲數據,此數組元素數
大于實際存儲的數據以便增加和插入元素,它們都允許直接按序號
索引元素,但是插入元素要涉及數組元素移動等內存操作,所以索
引數據快而插入數據慢,Vector由于使用了synchronized方法
(線程安全),通常性能上較ArrayList差,而LinkedList使用雙
向鏈表實現存儲,按序號索引數據需要進行前向或后向遍歷,但是
插入數據時只需要記錄本項的前后項即可,所以插入速度較快。
去掉一個Vector集合中重復的元素
通過Vector,contains()方法判斷是否包含該元素,如果沒有包
含就添加到新的集合當中,適用于數據較小的情況下。
Collection和Collections的區別。
Collection是集合類的上級接口,繼承于它的接口主要有Set和
ListoCollections是針對集合類的一個幫助類,它提供了一系列
靜態方法實現了對各種集合的排序,搜索和線程安全等操作。
Set里的元素是不能重復的,那么用什么方法來區分重復與否呢?是
用==還是equals()?它們有何區別?
set里的元素是不能重復的,用iterator。方法來區分重復與否。
equals方法(是String類從它的超類Object中繼承的)被用來檢
測兩個對象是否相等,即兩個對象的內容是否相等。
==用于比較引用和比較基本數據類型時具有不同的功能:
比較基本數據類型,如果兩個值相同,則結果為true
而在比較引用時,如果引用指向內存中的同一對象,結果為true
HashMap面試題
HashMap的工作原理是近年來常見的Java面試題。幾乎每個Java
程序員都知道HashMap,都知道哪里要用HashMap,知道Hashtable
和HashMap之間的區別,那么為何這道面試題如此特殊呢?是因為
這道題考察的深度很深。這題經常出現在高級或中高級面試中。投
資銀行更喜歡問這個問題,甚至會要求你實現HashMap來考察你的
編程能力。ConcurrentHashMap和其它同步集合的引入讓這道題變
得更加復雜。讓我們開始探索的旅程吧!
先來些簡單的問題
“你用過HashMap嗎?”“什么是HashMap?你為什么用到它?”
幾乎每個人都會回答,,是的”,然后回答HashMap的一些特性,譬
如HashMap可以接受null鍵值和值,而Hashtable則不能;
HashMap是非synchronized;HashMap很快;以及HashMap儲存的是
鍵值對等等。這顯示出你已經用過HashMap,而且對它相當的熟悉。
但是面試官來個急轉直下,從此刻開始問出一些刁鉆的問題,關于
HashMap的更多基礎的細節。面試官可能會問出下面的問題:
“你知道HashMap的工作原理嗎?”“你知道HashMap的get()方
法的工作原理嗎?”
你也許會回答“我沒有詳查標準的JavaAPI,你可以看看Java源
代碼或者OpenJDK。”“我可以用Google找到答案。”
但一些面試者可能可以給出答案,“HashMap是基于hashing的原
理,我們使用put(key,value)存儲對象到HashMap中,使用
get(key)從HashMap中獲取對象。當我們給put()方法傳遞鍵和值
時,我們先對鍵調用hashCode()方法,返回的hashCode用于找到
bucket位置來儲存Entry對象。”這里關鍵點在于指出,HashMap
是在bucket中儲存鍵對象和值對象,作為Map.Entry。這一點有助
于理解獲取對象的邏輯。如果你沒有意識到這一點,或者錯誤的認
為僅僅只在bucket中存儲值的話,你將不會回答如何從HashMap中
獲取對象的邏輯。這個答案相當的正確,也顯示出面試者確實知道
hashing以及HashMap的工作原理。但是這僅僅是故事的開始,當
面試官加入一些Java程序員每天要碰到的實際場景的時候,錯誤的
答案頻現。下個問題可能是關于HashMap中的碰撞探測(collision
detection)以及碰撞的解決方法:
“當兩個對象的hashcode相同會發生什么?”從這里開始,真正
的困惑開始了,一些面試者會回答因為hashcode相同,所以兩個對
象是相等的,HashMap將會拋出異常,或者不會存儲它們。然后面
試官可能會提醒他們有equals()和hashCode()兩個方法,并告訴他
們兩個對象就算hashcode相同,但是它們可能并不相等。一些面試
者可能就此放棄,而另外一些還能繼續挺進,他們回答“因為
hashcode相同,所以它們的bucket位置相同,'碰撞'會發生。
因為HashMap使用鏈表存儲對象,這個Entry(包含有鍵值對的
Map.Entry對象)會存儲在鏈表中。”這個答案非常的合理,雖然有
很多種處理碰撞的方法,這種方法是最簡單的,也正是HashMap的
處理方法。但故事還沒有完結,面試官會繼續問:
“如果兩個鍵的hashcode相同,你如何獲取值對象?”面試者會
回答:當我們調用get()方法,HashMap會使用鍵對象的hashcode
找到bucket位置,然后獲取值對象。面試官提醒他如果有兩個值對
象儲存在同一個bucket,他給出答案:將會遍歷鏈表直到找到值對
象。面試官會問因為你并沒有值對象去比較,你是如何確定確定找
到值對象的?除非面試者直到HashMap在鏈表中存儲的是鍵值對,
否則他們不可能回答出這一題。
其中一些記得這個重要知識點的面試者會說,找到bucket位置之后,
會調用keys,equals()方法去找到鏈表中正確的節點,最終找到要
找的值對象。完美的答案!
許多情況下,面試者會在這個環節中出錯,因為他們混淆了
hashCode()和equals。方法。因為在此之前hashCode()屢屢出現,
而equals。方法僅僅在獲取值對象的時候才出現。一些優秀的開發
者會指出使用不可變的、聲明作final的對象,并且采用合適的
equals。和hashCode()方法的話,將會減少碰撞的發生,提高效率。
不可變性使得能夠緩存不同鍵的hashcode,這將提高整個獲取對象
的速度,使用String,Interger這樣的wrapper類作為鍵是非常好
的選擇。
如果你認為到這里已經完結了,那么聽到下面這個問題的時候,你
會大吃一驚。“如果HashMap的大小超過了負載因子(loadfactor)
定義的容量,怎么辦?”除非你真正知道HashMap的工作原理,否
則你將回答不出這道題。默認的負載因子大小為0.75,也就是說,
當一個map填滿了75%的bucket時候,和其它集合類(如ArrayList
等)一樣,將會創建原來HashMap大小的兩倍的bucket數組,來重
新調整map的大小,并將原來的對象放入新的bucket數組中。這個
過程叫作rehashing,因為它調用hash方法找到新的bucket位置。
如果你能夠回答這道問題,下面的問題來了:“你了解重新調整
HashMap大小存在什么問題嗎?"你可能回答不上來,這時面試官
會提醒你當多線程的情況下,可能產生條件競爭(racecondition)o
當重新調整HashMap大小的時候,確實存在條件競爭,因為如果兩
個線程都發現HashMap需要重新調整大小了,它們會同時試著調整
大小。在調整大小的過程中,存儲在鏈表中的元素的次序會反過來,
因為移動到新的bucket位置的時候,HashMap并不會將元素放在鏈
表的尾部,而是放在頭部,這是為了避免尾部遍歷(tail
traversing)o如果條件競爭發生了,那么就死循環了。這個時候,
你可以質問面試官,為什么這么奇怪,要在多線程的環境下使用
HashMap呢?:)
熱心的讀者貢獻了更多的關于HashMap的問題:
為什么String,Interger這樣的wrapper類適合作為
鍵?String,Interger這樣的wrapper類作為HashMap的鍵是再
適合不過了,而且String最為常用。因為String是不可變的,也
是final的,而且已經重寫了equals。和hashCode()方法了。其他
的wrapper類也有這個特點。不可變性是必要的,因為為了要計算
hashCode(),就要防止鍵值改變,如果鍵值在放入時和獲取時返回
不同的hashcode的話,那么就不能從HashMap中找到你想要的對象。
不可變性還有其他的優點如線程安全。如果你可以僅僅通過將某個
field聲明成final就能保證hashCode是不變的,那么請這么做吧。
因為獲取對象的時候要用到equals()和hashCode()方法,那么鍵對
象正確的重寫這兩個方法是非常重要的。如果兩個不相等的對象返
回不同的hashcode的話,那么碰撞的幾率就會小些,這樣就能提高
HashMap的性能。
我們可以使用自定義的對象作為鍵嗎?這是前一個問題的延伸。
當然你可能使用任何對象作為鍵,只要它遵守了equals。和
hashCode()方法的定義規則,并且當對象插入到Map中之后將不會
再改變了。如果這個自定義對象時不可變的,那么它已經滿足了作
為鍵的條件,因為當它創建之后就已經不能改變了。
我們可以使用CocurrentHashMap來代替Hashtable嗎?這是另外一
個很熱門的面試題,因為ConcurrentHashMap越來越多人用了。我
們知道Hashtable是synchronized的,但是ConcurrentHashMap
同步性能更好,因為它僅僅根據同步級別對map的一部分進行上鎖。
ConcurrentHashMap當然可以代替HashTable,但是HashTable提
供更強的線程安全性。看看這篇博客查看Hashtable和
ConcurrentHashMap的區別。
我個人很喜歡這個問題,因為這個問題的深度和廣度,也不直接的
涉及到不同的概念。讓我們再來看看這些問題設計哪些知識點:
hashing的概念
HashMap中解決碰撞的方法
equals()和hashCode()的應用,以及它們在HashMap中的重要性
不可變對象的好處
HashMap多線程的條件競爭
重新調整HashMap的大小
總結
HashMap的工作原理
HashMap基于hashing原理,我們通過put()和get()方法儲存和獲
取對象。當我們將鍵值對傳遞給put()方法時,它調用鍵對象的
hashCode()方法來計算hashcode,讓后找到bucket位置來儲存值
對象。當獲取對象時,通過鍵對象的equals。方法找到正確的鍵值
對,然后返回值對象。HashMap使用鏈表來解決碰撞問題,當發生
碰撞了,對象將會儲存在鏈表的下一個節點中。HashMap在每個鏈
表節點中儲存鍵值對對象。
當兩個不同的鍵對象的hashcode相同時會發生什么?它們會儲存
在同一個bucket位置的鏈表中。鍵對象的equals()方法用來找到
鍵值對。
因為HashMap的好處非常多,我曾經在電子商務的應用中使用
HashMap作為緩存。因為金融領域非常多的運用Java,也出于性能
的考慮,我們會經常用到HashMap和ConcurrentHashMap。你可以
查看更多的關于HashMap的文章:
請講下Java里面的容器
分兩大類,Map和Collection0而Collection又有子接口
List(數據存儲順序和插入順序是一樣的)、Set(里面的元素具有唯
一性)
Map是存儲鍵值對的,里面的健不可以重復,但值可以重復
a.對于List主要有ArrayList和LinkedList兩種實現。實現的
數據結構不同,所以主要的區別也都是和數據結構相關的。
ArrayList基于數組,隨機訪問快,而對于中間元素的插入刪除效
率比較低,而且需要考慮擴容問題。LinkedList,則基于鏈表,
和ArrayList提到的正相反,隨機訪問慢,但對于中間元素的插入
和刪除更有效率。
Set也是一種Collection,和List比起來主要體現在元素唯一性。
請說下Iterator的作用
迭代器可以實現Collection接口的方法,可以一個一個地獲取集
合中的元素
在遍歷集合時可判斷是否有下一個元素
說下ArrayList和LinkedList的區別和聯系,并說明什么情況下用
它們
區別:ArrayList用于對象的隨機訪問速度快,沒有順序
LinkedList實現機制是鏈表式的,和順序有關,速度比ArrayList慢
聯系:ArrayList和LinkedList都是List接口的實現類
當要快速獲取一個值時,用ArrayList,用于順序插入操作時,用
LinkedList.
說下List,Set,Map三種集合各有什么特征
List集合中的元素可以重復,
Set集合中的元素不可以重復
Map集合用鍵-值映射存放對象,Map容器中的鍵對象不能重復,值對
象可以重復
HashSet和TreeSet有什么區別,什么時候用它們
區別:HashSet中的元素不能重復,沒有順序
TreeSet中的元素不能重復,但有順序
當集合中的元素需要排序時,用TreeSet
一般情況下用HashSet,因為不需要排序,速度比TreeSet快
什么是泛型,怎么使用的,有什么好處?
答案
定義一個集合時,可以知道里面定義的是什么類型
使用:在集合類型后面加<數據類型>
使用泛型后,從集合中取得元素后就不用再用強轉
什么是foreach循環,它可以循環那些數據類型
答案
也可以叫增強型循環,通過對象拿到集合里的值,因為擴展性比
較強,建議多使用
可以用來循環集合和數組
比較下集合和數組的優缺點
集合是多個對象的容器,可以將不同數據類型的多個對象組織在一
起
數組類型是有相同數據類型的數據集合,數組是很多語言都支持的底
層數據結構,性能上是最高的
HashMap與LinkedHashMap,和TreeMap的區別。
共同點:HashMap,LinkedHashMap,TreeMap都屬于Map的實現類.
不同點:1.HashMap里面存入的鍵值對在取出的時候是隨機的,
2.TreeMap取出來的是排序后的鍵值對。但如果您要按自然順序或
自定義順序遍歷鍵,那么TreeMap會更好。
3.LinkedHashMap是HashMap的一個子類,如果需要輸出的順序和
輸入的相同,那么用LinkedHashMap可以實現.
在List里面怎么去掉重復的數?
通過把List里面的數據放入HashSet可以去除重復
HashMap和ArrayList是不是都是線程不安全的?
ArrayList是線程不安全的;HashMap是線程不安全的;還有我們常
見的一些JAVA集合都是線程不安全,這樣做是為了提高性能
在JDK5以后提供了線程安全的并發包java.util.concurrent并發
包,譬如里面的類
CopyOnWriteArrayList,CopyOnWriteArraySet,ConcurrentHashMap
等
ArrayList集合加入1萬條數據,應該怎么提高效率
因為ArrayList的底層是數組實現,并且數組的默認值是10,如果
插入10000條要不斷的擴容,耗費時間,所以我們調用ArrayList的
指定容量的構造器方法ArrayList(intsize)就可以實現不擴容,
就提高了性能
網路通訊部分
客戶茸附名器
HTTP幅務器
TCP
IP
以太網協議
Xml與JSON區別
數據交換格式
區別:
xml是重量級、json是輕量級
xml比較占帶寬、json占帶寬小,易于壓縮
json在webservice用的比較少、xml用的較多
相同:
兩者都用在項目交互下例如移動app接口用的就是json、在
web項目中與其他項目對接用xml較多。
json常用解析方法gson、jsonobject>jackson等xmldomsax
pull解析
TCP與UDP區別?
udp:a、是面向無連接,將數據及源的封裝成數據包中,不需要
建立建立連接
b、每個數據報的大小在限制64k內
c、因無連接,是不可靠協議
d、不需要建立連接,速度快
tcp:a、建議連接,形成傳輸數據的通道.
b、在連接中進行大數據量傳輸,以字節流方式
c通過三次握手完成連接,是可靠協議
d必須建立連接m效率會稍低
聊天、網絡視頻會議、桌面共享用的就是udp
說說三次握手?
1)第一次握手:建立連接時,客戶端A發送SYN包(SYN=j)到
服務器B,并進入SYN_SEND狀態,等待服務器B確認。
(2)第二次握手:服窩器B收到SYN包,必須確認客戶A的SYN
(ACK=j+l),同時自己也發送一個SYN包(SYN=k),即SYN+ACK
包,此時服務器B進入SYN_RECV狀態。
(3)第三次握手:客戶端X收到服務器B的SYN+ACK包,向服務
器B發送確認包ACK(ACK=k+l),此包發送完畢,客戶端A和服務
器B進入ESTABLISHED狀態,完成三次握手。
完成三次握手,客戶端與服務器開始傳送數據。
什么是Webserivce?
Webservice就是提供不同的平臺相互通訊,基于Soap協議。
Webservice就是一個應用程序,它向外界暴露出一個能夠通過
Web進行調用的API。
SOAP是一種簡單基于xml的輕量協議,用戶web上交換結構化信息
和類型信息。
soap請求是HTTPPOST的一個專用版本,遵循一種特殊的xml消息
格式Content-type設置為:text/xml任何數據都可以xml化。
WebService實現原理是?
HTTP協議+XML
說一下什么是Http協議?
對器客戶端和服務器端之間數據傳輸的格式規范,格式簡稱為“超
文本傳輸協議”。
什么是Http協議無狀態協議?怎么解決Http協議無狀態協議?
(曾經去某創業公司問到)
1、無狀態協議對于事務處理沒有記憶能力。缺少狀態意味著如果后
續處理需要前面的信息
2、無狀態協議解決辦法:通過1、Cookie2、通過Session會話
保存。
說一下Http協議中302狀態(阿里經常問)
http協議中,返回狀態碼302表示重定向。
這種情況下,服務器返回的頭部信息中會包含一個Location字段,
內容是重定向到的url
Http協議有什么組成?
請求報文包含三部分:
a、請求行:包含請求方法、URI、HTTP版本信息
b、請求首部字段
c、請求內容實體
響應報文包含三部分:
a、狀態行:包含HTTP版本、狀態碼、狀態碼的原因短語
b、響應首部字段
c、響應內容實體
Http協議中有那些請求方式?
GET:用于請求訪問已經被URI(統一資源標識符)識別的資源,
可以通過URL傳參給服務器
POST:用于傳輸信息給服務器,主要功能與GET方法類似,但一般
推薦使用POST方式。
PUT:傳輸文件,報文主體中包含文件內容,保存到對應URI位置。
HEAD:獲得報文首部,與GET方法類似,只是不返回報文主體,一
般用于驗證URI是否有效。
DELETE:刪除文件,與PUT方法相反,刪除對應URI位置的文件。
OPTIONS:查詢相應URI支持的HTTP方法。
Http協議中Httpl.0與1.1區別?
在httpl.O中,當建立連接后,客戶端發送一個請求,服務器端返
回一個信息后就關閉連接,當瀏覽器下次請求的時候又要建立連接,
顯然這種不斷建立連接的方式,會造成很多問題。
5.在httpl.1中,引入了持續連接的概念,通過這種連接,瀏覽器
可以建立一個連接之后,發送請求并得到返回信息,然后繼續發送
請求再次等到返回信息,也就是說客戶端可以連續發送多個請求,
而不用等待每一個響應的到來。
Http協議實現原理機制?
2.1,整個流程步驟
①域名解析②發起TCP的三次握手3發起HTTPi青求
⑨力慌器解析HTML代碼,。瀏覽器對頁面的
'④服務器晌應HTTP請求「并請求HTML代碼中的資源
歌呈現給用戶
(如$、CSS、圖片等)
2.2、域名解析過程
憎索姆作系坎|
憎零用室器自身向本也配置的落選DNS服打;
的DN5韁存一自我的DNS縊f*發起域名解析請求
;NO1NO
YES
IYES
線所結束解析結束鱷物崎束
股是不會進行到一下的步費的
7NONOzu
查找NetBIOSI查詢WINS那包器1迸行廣搐座住;_=讀取LMHOST5文件
nameCache~
______,」I1
廣丁JYESjYESjYES
解析結束|解舊告束|皖折結束|.、結束|
2.3、三次握手過程
2.4、發起HTTP請求
2.5、響應HTTP請求并得到HTML代碼
2.6、瀏覽器解析HTML代碼
2.7、瀏覽器對頁面進行渲染呈現給用戶
get與post請求區別?(初級程序員必備問題)
區別一:
get重點在從服務器上獲取資源,post重點在向服務器發送數
據;
區別二:
get傳輸數據是通過URL請求,以field(字段)=value的
形式,置于URL后,并用〃?〃連接,多個請求數據間用〃&〃連接,如
http://127.0.0.1/Test/login.action?name=admin&password=adm
in,這個過程用戶是可見的;
post傳輸數據通過Http的post機制,將字段與對應值封存在請
求實體中發送給服務器,這個過程對用戶是不可見的;
區別三:
Get傳輸的數據量小,因為受URL長度限制,但效率較高;
Post可以傳輸大量數據,所以上傳文件時只能用Post方式;
區別四:
get是不安全的,因為URL是可見的,可能會泄露私密信息,
如密碼等;
post較get安全性較高;
區別五:
get方式只能支持ASCII字符,向服務器傳的中文字符可能
會亂碼。
post支持標準字符集,可以正確傳遞中文字符。
9、Http請求報文與響應報文格式?
請求報文包含三部分:
a、請求行:包含請求方法、URI、HTTP版本信息
b、請求首部字段
c、請求內容實體
響應報文包含三部分:
a、狀態行:包含HTTP版本、狀態碼、狀態碼的原因短語
b、響應首部字段
c、響應內容實體
10、常見Http協議狀態?
200:請求被正常處理
204:請求被受理但沒有資源可以返回
206:客戶端只是請求資源的一部分,服務器只對請求的部分資源
執行GET方法,相應報文中通過Content-Range指定范圍的資源。
301:永久性重定向
302:臨時重定向
303:與302狀態碼有相似功能,只是它希望客戶端在請求一個
URI的時候,能通過GET方法重定向到另一個URI上
304:發送附帶條件的請求時,條件不滿足時返回,與重定向無關
307:臨時重定向,與302類似,只是強制要求使用POST方法
400:請求報文語法有誤,服務器無法識別
401:請求需要認證
403:請求的對應資源禁止被訪問
404:服務器無法找到對應資源
500:服務器內部錯誤
503:服務器正忙
Http協議首部字段?
a、通用首部字段(請求報文與響應報文都會使用的首部字段)
Date:創建報文時間
Connection:連接的管理
Cache-Control:緩存的控制
Transfer-Encoding:報文主體的傳輸編碼方式
b、請求首部字段(請求報文會使用的首部字段)
Host:請求資源所在服務器
Accept:可處理的媒體類型
Accept-Charset:可接收的字符集
Accept-Encoding:可接受的內容編碼
Accept-Language:可接受的自然語言
c、響應首部字段(響應報文會使用的首部字段)
Accept-Ranges:可接受的字節范圍
Location:令客戶端重新定向到的URI
Server:HTTP服務器的安裝信息
d、實體首部字段(請求報文與響應報文的的實體部分使用的首部
字段)
Allow:資源可支持的HTTP方法
Content-Type:實體主類的類型
Content-Encoding:實體主體適用的編碼方式
Content-Language:實體主體的自然語言
Content-Length:實體主體的的字節數
Content-Range:實體主體的位置范圍,一般用于發出部分請求時
使用
Http與Https優缺點?
a、通信使用明文不加密,內容可能被竊聽,也就是被抓包分析。
b、不驗證通信方身份,可能遭到偽裝
c、無法驗證報文完整性,可能被篡改
HTTPS就是HTTP加上加密處理(一般是SSL安全通信線路)+認證
+完整性保護
Http優化
利用負載均衡優化和加速HTTP應用
利用HTTPCache來優化網站
Http協議有那些特征?
1、支持客戶/服務器模式;2、簡單快速;3、靈活;4、無連接;
5、無狀態;
如果你還對Http協議不熟悉的話,請參考Http協議
http://www.itmayiedu.com/front/articleinfo/49.html文章
JavaWeb基礎部分
講下Servlet的執行流程。doGet和doPost的區別
Servlet的執行流程也就是servlet的生命周期,當服務器啟動
的時候生命周期開始,然后通過init()《啟動順序根據web.xml里
的startup-on-load來確定加載順序》方法初始化servlet,再根
據不同請求調用doGet或doPost方法,最后再通過destroy。方法
進行銷毀。
doGet和doPost都是接受用戶請求的方法,doGet處理get請求,
doPost處理post請求,doGet用于地址欄提交,doPost用于表單
提交,在頁面提交數據時,get的數據大小有限制4k,post沒有限
制,get請求提交的數據會在地址欄顯示,post不顯示,所以post
比get安全.
當service有一個實例變量,doGet和doPost去調用這個變量,會
出現什么問題,你是如何解決的。
會出現線程不安全問題。無論是doGet還是doPost去調用,服務
器端處理的過程都是一樣的,那么我們可以把處理過程單獨寫在另
外一個方法handle里,讓兩個方法都去調用handle,根據不同請
求去調用不同的方法。
如何處理servlet的線程不安全問題
線程安全就是多線程操作同一個對象不會有問題,線程同步一般
來保護線程安全,所以可以在Servlet的線程里面加上同步方法或
同步塊。(Synchronized)可以保證在同一時間只有一個線程訪問,
(使用同步塊會導致性能變差,最好不去使用實例變量)
Jsp的重定向和轉發的流程有什么區別
重定向是客戶端行為,轉發是服務器端行為
重定向時服務器產生兩次請求,轉發產生一次請求,重定向時可
以轉發到項目以外的任何網址,轉發只能在當前項目里轉發
重定向會導致request對象信息丟失。轉發則不會
轉發的url不會變,request.getRequestDispatch()。forward()
重定向的url會改變,response.getRedirect();
Jsp和servlet的區別
jsp的可讀性強,容易維護,并且jsp在最后會編譯成servlet
servlet容易調試
Jsp的九大內置對象,三大指令,七大動作的具體功能
JSP九大內置對象:
pageContext:只對當前jsp頁面有效,里面封裝了基本的request
和session的對象
Request:對當前請求進行封裝
Session:瀏覽器會話對象,瀏覽器范圍內有效
Application:應用程序對象,對整個web工程都有效
Out:頁面打印對象,在jsp頁面打印字符串
Response:返回服務器端信息給用戶
Config:單個servlet的配置對象,相當于servletConfig對象
Page:當前頁面對象,也就是this
Exception:錯誤頁面的exception對象,如果指定的是錯誤頁面,
這個就是異常對象
三大指令;
Page:指令是針對當前頁面的指令
Include:用于指定如何包含另一個頁面
Taglib:用于定義和指定自定義標簽
七大動作:
Forward,執行頁面跳轉,將請求的處理轉發到另一個頁面
Param:用于傳遞參數
Include:用于動態引入一個jsp頁面
Plugin:用于下載javaBean或applet到客戶端執行
useBean:使用javaBean
setProperty:修改javaBean實例的屬性值
getProperty:獲取javaBean實例的屬性值
獲取頁面的元素和值有幾種方式,分別說一下
request.getParameter()返回客戶端的請求參數與值
request.getParameterNames()返回所有可用屬性名的枚舉
request.getParameterValues()返回包含參數的所有值的數組
servlet和JavaScript的區別,他們分別是什么作用
一個是服務端,一個是客戶端
Servlet是獨立于平臺和協議的服務器端的java應用程序,可以動態
生成web頁面,并采用響應--請求的模式提供web服務
JavaScript是一種解釋性語言,用于向html頁面提供交互行為,通
常被直接嵌入在html頁面中
servlet是java語言編寫的web應用
js是基于html上的一種解釋語言
會話跟蹤有哪些,他們的區別是什么
Cookie,session和application,
Cookie是http對象,客戶端與服務端都可以操縱
cookie是在客戶端保持狀態,session是在服務器端保持狀態,由于
cookie是保存在客戶端本地的,所以數據很容易被竊取,當訪問量
很多時,使用session則會降低服務器的性能,application的作用域
是整個工程里只有一個,可以在不同瀏覽器之間共享數據,所有人
都可以共享,因此application也是不安全的
說說jsp的隱藏對象有哪些
Request,out,response,pageContext,session,application,config,p
age,exception,也即jsp的九大內置對象
request,response,session和application是怎么用的
Request是客戶端向服務端發送請求
Response是服務端對客戶端請求做出響應
Session在servlet中不能直接使用,需要通過getSession()創建,如
果沒有設定它的生命周期,或者通過invildate。方法銷毀,關閉瀏
覽器session就會消失
Application不能直接創建,存在于服務器的內存中,由服務器創建
和銷毀
jsp頁面跳轉
Jsp頁面跳轉有兩種方式,forward和redirect(轉發和重定向)
Forward只能在當前項目里跳轉,只產生一次請求,request保存的
變量不會丟失,url地址不會改變
Redirect可跳轉到項目以外的任何頁面,產生兩次請求,request保
存的變量會全部丟失,url地址會發生改變,變化為第二個請求的地
址
話跟蹤
如果創建servlet實例不用構造方法,怎么創建一個servlet實例
Web容器會自動為servlet寫一個無參的構造器,它使用
dass.forName("").newInstance()反射來創建servlet實例的
Servlet是安全的嗎?當service有一^t'實例變量,doGet和
doPost去調用這個變量,會出現什么問題,你是如何解決的
是線程不安全的,因為servlet是單例模式,當多個客戶端共同訪問
的時候線程不安全。
盡量用局部變量,同步塊,如果當前字段是不會改變的,用final修
飾
Java框架部分
說說Spring?
Spring的核心是控制反轉、依賴注入,Aop(面向切面)相當于把每
個bean與bean之間的關系交給第三方容器進行管理.
說SpringIOC>SpringAOP?
SpringIOC,其實就是依賴注入、控制反轉。相當于把每個bean與
bean之間的關系交給第三方容器管理。而這個容器就是spring
SpringAOP面向切面的編程,或A0P,是一種編程技術,允許程序
模塊化橫向切割關注點,或橫切典型的責任劃分,如日志和事務管
理。SpringAop就是用Javva的動態代理
Spring的底層實現機制是什么?
使用Demo4j(解析XML)+Java反射機制
Demo4j其實就是解析XML。使用反射機制實例化bean。
SpringAOP用到了什么代理?
JDK動態代理:
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 口才八級考題號測試題及答案
- 電商供應鏈協同管理-洞察及研究
- 云南省臨滄地區中學2024-2025學年高二下學期期中考試數學試卷(含詳解)
- 基因編輯敲除技術的安全性評估-洞察闡釋
- 電子式金屬、非金屬試驗機項目投資風險評估報告
- 飛機智能制造與數字化-洞察闡釋
- 多模態數據智能融合與深度語義理解-洞察闡釋
- 全科住院醫師規范化培訓新模式的探索
- 海洋酸化生態響應-洞察闡釋
- 湖南師范大學樹達學院《道路軟件應用》2023-2024學年第二學期期末試卷
- 初三中考數學最后一課-主題班會【課件】
- 2025照明系統工程合同樣本
- 高內涵細胞分析系統應用
- 2025益陽市赫山區中小學教師招聘考試試題及答案
- 2025年原發性高血壓知識試題
- 中國當代小說選讀學習通超星期末考試答案章節答案2024年
- 某冶金機械廠供配電系統設計
- 收費站年度工作計劃
- xx縣精神病醫院建設項目可行性研究報告
- 《在中亞細亞草原上》賞析 課件
- 班組會議運作技巧ppt課件
評論
0/150
提交評論