java面試總結(jié)之基礎(chǔ)

0尖阔、java語法

0.1 ==與equals的區(qū)別

對于字符串來說equals比較的是值,==比較的是地址
例如String str1 = "123";
String str2 = new String("123");
則str1.equals(str2)為true榨咐;而str1==str2為false
int a=1;int b=1;則a==b為true

0.2 iterator與listiterator的區(qū)別介却?

  • 相同點(diǎn)
    都是迭代器,當(dāng)需要對集合中元素進(jìn)行遍歷不需要干涉其遍歷過程時块茁,這兩種迭代器都可以使用齿坷。

  • 不同點(diǎn)
    1.使用范圍不同,Iterator可以應(yīng)用于所有的集合,Set胃夏、List和Map和這些集合的子類型轴或。而ListIterator只能用于List及其子類型昌跌。

    2.ListIterator有add方法仰禀,可以向List中添加對象,而Iterator不能蚕愤。

    3.ListIterator和Iterator都有hasNext()和next()方法答恶,可以實(shí)現(xiàn)順序向后遍歷,但是ListIterator有hasPrevious()和previous()方法萍诱,可以實(shí)現(xiàn)逆向(順序向前)遍歷悬嗓。Iterator不可以。

    4.ListIterator可以定位當(dāng)前索引的位置裕坊,nextIndex()和previousIndex()可以實(shí)現(xiàn)包竹。Iterator沒有此功能。

    5.都可實(shí)現(xiàn)刪除操作籍凝,但是ListIterator可以實(shí)現(xiàn)對象的修改周瞎,set()方法可以實(shí)現(xiàn)。Iterator不能修改饵蒂。

一声诸、集合相關(guān)

1.1、HashMap相關(guān)

  • HashMap實(shí)現(xiàn)原理
    HashMap實(shí)際上是數(shù)組和鏈表的結(jié)合體退盯,底層就是一個數(shù)組結(jié)構(gòu)彼乌,數(shù)組中的每一項(xiàng)又是一個鏈表。
    HashMap的主干是一個Entry數(shù)組渊迁。Entry是HashMap的基本組成單元慰照,每一個Entry包含一個key-value鍵值對。
    當(dāng)我們往HashMap中put元素的時候琉朽,先根據(jù)key的hashCode重新計(jì)算hash值焚挠,根據(jù)hash值得到這個元素在數(shù)組中的位置(即下標(biāo)), 如果數(shù)組該位置上已經(jīng)存放有其他元素了漓骚,那么在這個位置上的元素將以鏈表的形式存放蝌衔,新加入的放在鏈頭,最先加入的放在鏈尾蝌蹂。如果數(shù)組該位置上沒有元素噩斟,就直接將該元素放到此數(shù)組中的該位置上。
    在HashMap中要找到某個元素孤个,需要根據(jù)key的hash值來求得對應(yīng)數(shù)組中的位置剃允。

簡單地說,HashMap 在底層將 key-value 當(dāng)成一個整體進(jìn)行處理,這個整體就是一個 Entry 對象斥废。HashMap 底層采用一個 Entry[] 數(shù)組來保存所有的 key-value 對椒楣,當(dāng)需要存儲一個 Entry 對象時,會根據(jù)hash算法來決定其在數(shù)組中的存儲位置牡肉,再根據(jù)equals方法決定其在該數(shù)組位置上的鏈表中的存儲位置捧灰;當(dāng)需要取出一個Entry時,
也會根據(jù)hash算法找到其在數(shù)組中的存儲位置统锤,再根據(jù)equals方法從該位置上的鏈表中取出該Entry毛俏。

  • HashTable和ConcurrentHashMap
    它們都可以用于多線程的環(huán)境,但是當(dāng)Hashtable的大小增加到一定的時候饲窿,性能會急劇下降煌寇,因?yàn)榈鷷r需要被鎖定很長的時間。因?yàn)镃oncurrentHashMap引入了分割(segmentation)逾雄,不論它變得多么大阀溶,僅僅需要鎖定map的某個部分,而其它的線程不需要等到迭代完成才能訪問map鸦泳。簡而言之银锻,在迭代的過程中,ConcurrentHashMap僅僅鎖定map的某個部分辽故,而Hashtable則會鎖定整個map徒仓。

  • HashMap和Hashtable有什么區(qū)別?
    HashMap允許鍵和值是null誊垢,而Hashtable不允許鍵或者值是null掉弛。
    Hashtable是同步的,而HashMap不是喂走。因此殃饿,HashMap更適合于單線程環(huán)境,而Hashtable適合于多線程環(huán)境芋肠。
    HashMap提供了可供應(yīng)用迭代的鍵的集合乎芳,因此,HashMap是快速失敗的帖池。另一方面奈惑,Hashtable提供了對鍵的列舉(Enumeration)。
    一般認(rèn)為Hashtable是一個遺留的類睡汹。

  • 遍歷HashMap的幾種方式肴甸?
    https://blog.csdn.net/tolcf/article/details/38471493

2、ArrayList與LinkedList

ArrayList和LinkedList都實(shí)現(xiàn)了List接口
ArrayList是基于索引的數(shù)據(jù)接口囚巴,它的底層是數(shù)組原在。
相對于ArrayList友扰,LinkedList的插入,添加庶柿,刪除操作速度更快村怪,因?yàn)楫?dāng)元素被添加到集合任意位置的時候,不需要像數(shù)組那樣重新計(jì)算大小或者是更新索引浮庐。
LinkedList比ArrayList更占內(nèi)存甚负,因?yàn)長inkedList為每一個節(jié)點(diǎn)存儲了兩個引用,一個指向前一個元素兔辅,一個指向下一個元素腊敲。
ArrayList查詢快击喂,LinkedList增刪快维苔。

3、Java集合類框架的基本接口

Collection:代表一組對象懂昂,每一個對象都是它的子元素介时。
Set:無序,不重復(fù)
List:有序凌彬,可重復(fù)
Map:可以把鍵(key)映射到值(value)的對象沸柔,鍵不能重復(fù)。

4铲敛、HashSet和TreeSet有什么區(qū)別褐澎?

HashSet是由一個hash表來實(shí)現(xiàn)的,因此伐蒋,它的元素是無序的工三。add(),remove()先鱼,contains()方法的時間復(fù)雜度是O(1)俭正。
TreeSet是由一個樹形的結(jié)構(gòu)來實(shí)現(xiàn)的,它里面的元素是有序的焙畔。因此掸读,add(),remove()宏多,contains()方法的時間復(fù)雜度是O(logn)儿惫。

二、面向?qū)ο笙嚓P(guān)

1伸但、接口和抽象類

  • 接口與抽象類的區(qū)別
    抽象類和接口都不能直接實(shí)例化
    接口可繼承接口肾请,并可多繼承接口,但類只能單繼承
    接口方法砌烁,訪問權(quán)限必須是公共的 public

  • 什么時候使用抽象類和接口

    • 如果你擁有一些方法并且想讓它們中的一些有默認(rèn)實(shí)現(xiàn)筐喳,那么使用抽象類
    • 如果你想實(shí)現(xiàn)多重繼承催式,那么你必須使用接口。由于Java不支持多繼承避归,子類不能夠繼承多個類荣月,但可以 實(shí)現(xiàn)多個接口。因此你就可以使用接口來解決它
    • 如果基本功能在不斷改變梳毙,那么就需要使用抽象類哺窄。如果不斷改變基本功能并且使用接口,那么就需要改變所有實(shí)現(xiàn)了該接口的類
  • Java8中的默認(rèn)方法和靜態(tài)方法

    Oracle已經(jīng)開始嘗試向接口中引入默認(rèn)方法和靜態(tài)方法账锹,以此來減少抽象類和接口之間的差異∶纫担現(xiàn)在,我們可以為接口提供默認(rèn)實(shí)現(xiàn)的方法了并且不用強(qiáng)制子類來實(shí)現(xiàn)它奸柬。

  • 接口與抽象類中能不能有靜態(tài)方法
    抽象類中可以有靜態(tài)的普通方法生年,但不能有靜態(tài)的抽象方法。
    接口中的方法也只能是 public abstract修飾的廓奕,不能加上static抱婉,即接口中不能有靜態(tài)的抽象方法。

三桌粉、設(shè)計(jì)模式相關(guān)

3.1蒸绩、動態(tài)代理的兩種方式,以及區(qū)別铃肯。
一般而言患亿,動態(tài)代理分為兩種,一種是JDK反射機(jī)制提供的代理押逼,另一種是CGLIB代理步藕。
JDK代理,必須提供接口宴胧,而CGLIB則不需要提供接口
3.2漱抓、單例的特點(diǎn):

  • 單例類只能有一個實(shí)例;
  • 單例類必須自己創(chuàng)建自己的唯一實(shí)例恕齐;
  • 單例類必須給所有其他對象提供這一實(shí)例乞娄。
1、餓漢式單例:在類初始化時显歧,已經(jīng)自行實(shí)例,
在類創(chuàng)建的同時仪或,就已經(jīng)創(chuàng)建好一個靜態(tài)的對象供系統(tǒng)使用,以后不再改變。
public class Singleton { 
 private Singleton(){    
  } 
  private static final Singleton sin = new Singleton();    
  public static Singleton init(){ 
    return sin; 
  } 
} 
2、懶漢式單例
在第一次調(diào)用的時候?qū)嵗约?public class Singleton { 
  private Singleton(){    
    } 
   private static  Singleton sin = null;    
  public static synchronized Singleton init(){ 
     if(sin==null){
       sin=new Singleton();
     }
    return sin; 
  } 
} 

四嘁扼、java語法相關(guān)

1、傳值和傳引用的區(qū)別

“傳值”傳遞的是一個值到旦,而“傳引用”傳遞的是指向一個另一塊內(nèi)存空間的地址旨巷;
“傳值”實(shí)際是將一個值的拷貝傳遞至方法內(nèi)部,這個值的原始數(shù)據(jù)是不會改變的添忘,無論你內(nèi)部進(jìn)行的是何種操作采呐,都不會改變這個源數(shù)據(jù)的值;而“傳引用”傳遞進(jìn)去的則是指向一個對象的地址搁骑,那么在方法內(nèi)部進(jìn)行實(shí)際操作的時候斧吐,就很可能會改變該對象的屬性值(當(dāng)然具體是否改變,還需要結(jié)合具體的業(yè)務(wù))仲器。

五煤率、JVM相關(guān)

1、Java 內(nèi)存模型

JVM內(nèi)存結(jié)構(gòu)分為:方法區(qū)(method)乏冀,棧內(nèi)存(stack)蝶糯,堆內(nèi)存(heap),本地方法棧(java中的jni調(diào)用)煤辨。

  • 方法區(qū)——存放了要加載的類信息裳涛、靜態(tài)變量木张、final類型的常量众辨、屬性和方法信息。JVM用持久代(Permanet Generation)來存放方法區(qū)舷礼,可通過-XX:PermSize和-XX:MaxPermSize來指定最小值和最大值鹃彻。
  • 棧內(nèi)存——在函數(shù)中定義的一些基本類型的變量數(shù)據(jù)和對象的引用變量都在函數(shù)的棧內(nèi)存中分配。
  • 堆內(nèi)存——堆內(nèi)存用來存放由new創(chuàng)建的對象和數(shù)組妻献。 在堆中分配的內(nèi)存蛛株,由Java虛擬機(jī)的自動垃圾回收器來管理。

2育拨、類加載過程

類從被加載到虛擬機(jī)內(nèi)存中開始谨履,到卸載出內(nèi)存為止,它的生命周期包括了:加載(Loading)熬丧、驗(yàn)證(Verification)笋粟、準(zhǔn)備(Preparation)、解析(Resolution)析蝴、初始化(Initialization)害捕、使用(Using)、卸載(Unloading)七個階段闷畸,其中驗(yàn)證尝盼、準(zhǔn)備、解析三個部分統(tǒng)稱鏈接佑菩。
加載:通過一個類的名字獲取此類的二進(jìn)制字節(jié)流盾沫,生成一個Class對象
驗(yàn)證:驗(yàn)證語法錯誤
準(zhǔn)備:為靜態(tài)類變量分配內(nèi)存并設(shè)置初始值裁赠。
解析:將常量池內(nèi)的符號引用替換為直接引用。
初始化:執(zhí)行類中的java程序代碼赴精,執(zhí)行java類的構(gòu)造方法组贺。

3.垃圾回收解決三個問題:

哪些內(nèi)存需要回收?
什么時候回收祖娘?
如何回收失尖?
垃圾回收關(guān)注的是堆內(nèi)存(heap);
常見的垃圾收集算法:標(biāo)記-清除算法渐苏、復(fù)制算法掀潮、標(biāo)記-整理算法、分代收集算法

六琼富、java多線程

1仪吧、synchronized修飾方法和synchronized修飾代碼塊

修飾代碼塊效率比修飾方法要高,因?yàn)樾揎棿a塊的時候其它非synchronized修飾的代碼塊是異步的鞠眉。

2薯鼠、產(chǎn)生死鎖的四個必要條件

  • 互斥條件:一個資源每次只能被一個進(jìn)程使用。
  • 請求與保持條件:一個進(jìn)程因請求資源而阻塞時械蹋,對已獲得的資源保持不放出皇。
  • 不剝奪條件:進(jìn)程已獲得的資源,在末使用完之前哗戈,不能強(qiáng)行剝奪郊艘。
  • 循環(huán)等待條件:若干進(jìn)程之間形成一種頭尾相接的循環(huán)等待資源關(guān)系。

3唯咬、lock與synchronized

七纱注、spring相關(guān)

7.1事務(wù)

  • 事務(wù)的特性:ACID——原子性、一致性胆胰、隔離性和持久性
  • @transactional注解在什么情況下會失效狞贱,為什么。

service類標(biāo)簽(一般不建議在接口上)上添加@Transactional蜀涨,可以將整個類納入spring事務(wù)管理瞎嬉,在每個業(yè)務(wù)方法執(zhí)行時都會開啟一個事務(wù),不過這些事務(wù)采用相同的管理方式勉盅。
@Transactional 注解只能應(yīng)用到 public 可見度的方法上佑颇。 如果應(yīng)用在protected、private或者 package可見度的方法上草娜,也不會報錯挑胸,不過事務(wù)設(shè)置不會起作用。
默認(rèn)情況下宰闰,spring會對unchecked異常進(jìn)行事務(wù)回滾茬贵;如果是checked異常則不回滾簿透。

7.2scope的singleton與prototype的區(qū)別:

singleton:當(dāng)把一個bean定義設(shè)置為singleton作用域時,Spring IOC容器只會創(chuàng)建該bean定義的唯一實(shí)例解藻。
prototype:每一次請求(將其注入到另一個bean中老充,或者以程序的方式調(diào)用 容器的getBean()方法)都會產(chǎn)生一個新的bean實(shí)例,相當(dāng)與一個new的操作螟左。
詳情請參考:
https://blog.csdn.net/mastermind/article/details/1932787

7.3Autowired與Resource的區(qū)別

相同點(diǎn):兩者都可用于依賴注入啡浊,都可以用在字段和setter方法上。
不同點(diǎn):

  • @Autowired為Spring提供的注解,@Resource 是JDK1.6支持的注解胶背。
  • @Autowired注解按照類型(byType)裝配依賴對象巷嚣,默認(rèn)情況下它要求依賴對象必須存在,如果允許null值钳吟,可以設(shè)置它的required屬性為false廷粒。如果我們想使用按照名稱(byName)來裝配,可以結(jié)合@Qualifier注解一起使用红且。如下:
public class TestServiceImpl {
    @Autowired
    @Qualifier("userDao")
    private UserDao userDao; 
}
  • @Resource注解默認(rèn)按照ByName自動注入,通過name屬性進(jìn)行指定,當(dāng)找不到與名稱匹配的bean時才按照類型進(jìn)行裝配坝茎。
    7.3ApplicationContext通常的實(shí)現(xiàn)是什么?
    ApplicationContext cxt = new ClassPathXmlApplicationContext ("applicationContext.xml");

八暇番、數(shù)據(jù)庫相關(guān)

1嗤放、數(shù)據(jù)庫優(yōu)化

  • 設(shè)計(jì)合適的盡量短的字段,比如郵政編碼使用char(6)就夠了奔誓,varchar也是不必要的
  • 將字段設(shè)置為not null的斤吐,這樣執(zhí)行查詢時可以不必去比較null值
  • 使用join來代替子查詢
  • 使用索引
    在查詢語句當(dāng)中包含有MAX(),MIN()和ORDERBY這些命令的時候,使用索引性能提高更為明顯厨喂。
    索引應(yīng)建立在那些將用于JOIN,WHERE判斷和ORDERBY排序的字段上。盡量不要對數(shù)據(jù)庫中某個含有大量重復(fù)的值的字段建立索引庄呈。最好是在相同類型的字段間進(jìn)行比較的操作蜕煌。在建有索引的字段上盡量不要使用函數(shù)進(jìn)行操作。

2诬留、數(shù)據(jù)庫常見連接池

常用的主流開源數(shù)據(jù)庫連接池有C3P0斜纪、DBCP、Tomcat Jdbc Pool文兑、BoneCP盒刚、Druid等,其中阿里的Druid最好用绿贞。

  • Druid的主要配置
    DRUID是阿里巴巴開源平臺上一個數(shù)據(jù)庫連接池實(shí)現(xiàn)因块,它結(jié)合了C3P0、DBCP籍铁、PROXOOL等DB池的優(yōu)點(diǎn)涡上,同時加入了日志監(jiān)控趾断,可以很好的監(jiān)控DB池連接和SQL的執(zhí)行情況,可以說是針對監(jiān)控而生的DB連接池(據(jù)說是目前最好的連接池,不知道速度有沒有BoneCP快)吩愧。
    和其它連接池一樣DRUID的DataSource類為:com.alibaba.druid.pool.DruidDataSource芋酌,基本配置參數(shù)如下:
    name:配置這個屬性的意義在于,如果存在多個數(shù)據(jù)源雁佳,監(jiān)控的時候可以通過名字來區(qū)分開來脐帝。 如果沒有配置,將會生成一個名字糖权,格式是:"DataSource-" + System.identityHashCode(this)腮恩。
    jdbcUrl:
    username:
    password:
    maxActive:最大連接池數(shù)量,默認(rèn)值為8温兼。

九秸滴、servlet與jsp

9.1

  • session.getMaxInactiveInterval():獲得session的最大存活時間,默認(rèn)是1800秒募判!
    可以在web.xml 配置文件中添加如下內(nèi)容(單位為分鐘荡含,只針對該項(xiàng)目起作用)
    <session-config>
    <session-timeout>60</session-timeout>
    </session-config>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市届垫,隨后出現(xiàn)的幾起案子释液,更是在濱河造成了極大的恐慌,老刑警劉巖装处,帶你破解...
    沈念sama閱讀 219,427評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件误债,死亡現(xiàn)場離奇詭異,居然都是意外死亡妄迁,警方通過查閱死者的電腦和手機(jī)寝蹈,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來登淘,“玉大人箫老,你說我怎么就攤上這事∏荩” “怎么了耍鬓?”我有些...
    開封第一講書人閱讀 165,747評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長流妻。 經(jīng)常有香客問我牲蜀,道長,這世上最難降的妖魔是什么绅这? 我笑而不...
    開封第一講書人閱讀 58,939評論 1 295
  • 正文 為了忘掉前任涣达,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘峭判。我一直安慰自己开缎,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,955評論 6 392
  • 文/花漫 我一把揭開白布林螃。 她就那樣靜靜地躺著奕删,像睡著了一般。 火紅的嫁衣襯著肌膚如雪疗认。 梳的紋絲不亂的頭發(fā)上完残,一...
    開封第一講書人閱讀 51,737評論 1 305
  • 那天,我揣著相機(jī)與錄音横漏,去河邊找鬼谨设。 笑死,一個胖子當(dāng)著我的面吹牛缎浇,可吹牛的內(nèi)容都是我干的扎拣。 我是一名探鬼主播,決...
    沈念sama閱讀 40,448評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼素跺,長吁一口氣:“原來是場噩夢啊……” “哼二蓝!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起指厌,我...
    開封第一講書人閱讀 39,352評論 0 276
  • 序言:老撾萬榮一對情侶失蹤刊愚,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后踩验,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體鸥诽,經(jīng)...
    沈念sama閱讀 45,834評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,992評論 3 338
  • 正文 我和宋清朗相戀三年箕憾,在試婚紗的時候發(fā)現(xiàn)自己被綠了牡借。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,133評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡厕九,死狀恐怖蓖捶,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情扁远,我是刑警寧澤,帶...
    沈念sama閱讀 35,815評論 5 346
  • 正文 年R本政府宣布刻像,位于F島的核電站畅买,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏细睡。R本人自食惡果不足惜谷羞,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,477評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧湃缎,春花似錦犀填、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至蹂季,卻和暖如春冕广,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背偿洁。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評論 1 272
  • 我被黑心中介騙來泰國打工撒汉, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人涕滋。 一個月前我還...
    沈念sama閱讀 48,398評論 3 373
  • 正文 我出身青樓睬辐,卻偏偏與公主長得像,于是被迫代替她去往敵國和親宾肺。 傳聞我的和親對象是個殘疾皇子溯饵,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,077評論 2 355

推薦閱讀更多精彩內(nèi)容