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>