1.面向?qū)ο蟮奶卣?br>
答案:繼承迷帜、多態(tài)梧乘、抽象绊序、封裝
繼承:子類可以繼承父類茴迁,但是只能繼承一個
多態(tài):重寫(子類重寫父類的方法),重載(同一個類中方法參數(shù)類型或者個數(shù)不一樣)
抽象:把事務(wù)抽象出來灌闺,數(shù)據(jù)抽象(類的屬性)艰争,方法抽象(類的方法)
封裝:類,可以把屬性桂对、方法封裝起來甩卓,允許可信的其他類調(diào)用;
2.final, finally, finalize 的區(qū)別
final可以修飾類(表示該類是最終類蕉斜,不可被繼承)逾柿、方法(表示該方法是最終方法缀棍,不可被重寫,但是可以重載)鹿寻、變量(表示該變量是最終變量睦柴,不可修改)
finally用在try catch后面诽凌,最終要執(zhí)行毡熏。即使try中return返回。
finalize可以為任何一個類添加侣诵,主動回收內(nèi)存痢法,在垃圾回收前調(diào)用。finalize原理杜顺。
3.int 和 Integer 有什么區(qū)別
int屬于基本類型财搁,而Integer屬于包裝類型。java在編譯Integer i5 = 127的時候,被翻譯成-> Integer i5 = Integer.valueOf(127)
Integer i5 = 127;
Integer i6 = 127;
i5 == i6 return true;
如果
Integer i5 = 128躬络;
Integer i6 = 128尖奔;
i5 == i6 return flase
4.重載和重寫的區(qū)別:
重載是同一個類中,方法名相同穷当,形參個數(shù)和類型不同的描述提茁。
重寫(覆蓋)是子類重寫父類的方法(形參和返回值必須相同,子類必須重寫父類的abstract方法馁菜,不能重寫父類的final方法)
5.抽象類和接口有什么區(qū)別
抽象類是用abstract修飾的類茴扁,一定有抽象方法,可以有非抽象方法汪疮;抽象方法必須被子類實現(xiàn)峭火;抽象類被子類繼承
接口是接口,所有方法都是抽象方法智嚷,被類實現(xiàn)卖丸。
6.說說反射的用途及實現(xiàn)
反射機制是指在JVM運行時,對于任何一個對象盏道,都能動態(tài)知道它的類稍浆、屬性和方法。應(yīng)用:ide使用時摇天,按點自動加載出方法粹湃,屬性;還有各種框架比如spring泉坐,
先在xml中配置好为鳄,等到需要使用時在加載。
三種實現(xiàn)方式:
對象的getClass()方法腕让;
forname()方法孤钦,Class.forName("全限定類名")
Person.class 從類中獲取歧斟。
7.說說自定義注解的場景及實現(xiàn)
各種框架Spring、springMVC等偏形,驗證屬性完整性等
實現(xiàn):@interface xxx {}静袖,通過反射檢測是否使用注解,getAnnottion
8.HTTP 請求的 GET 與 POST 方式的區(qū)別
http格式:請求行俊扭、請求頭队橙、空行、消息體
狀態(tài)行萨惑、響應(yīng)頭捐康、空行、消息體
GET產(chǎn)生一個數(shù)據(jù)包庸蔼;POST產(chǎn)生兩個數(shù)據(jù)包解总,對于POST,瀏覽器先發(fā)送header姐仅,服務(wù)器響應(yīng)100 continue花枫,瀏覽器再發(fā)送data,服務(wù)器響應(yīng)200 ok(返回數(shù)據(jù))掏膏。
9.session 與 cookie 區(qū)別
session是一種上下文機制劳翰,作用于服務(wù)端,可以存在數(shù)據(jù)庫壤追、集群或者文件中磕道。用戶首次發(fā)起請求,服務(wù)端會產(chǎn)生一個SessionID行冰,用來保存用戶的登錄信息溺蕉。
同時,cookie作用于客戶端悼做,用來跟蹤用戶的狀態(tài)疯特,分為瀏覽器cookie和文件cookie。用戶再次請求時肛走,服務(wù)端會檢查cookie是否帶有sessionid漓雅。
cookie 存在本地文件中,可能不安全朽色。而session是存在服務(wù)端的邻吞。
10.說說session的分布式處理
問題起因:現(xiàn)在的web-server都是分布式部署,nginx代理葫男。如果第一個請求抱冷,分發(fā)到1號web-server上;客戶端再次請求就不應(yīng)定分發(fā)到1號服務(wù)器上梢褐,session保存就沒有用旺遮。
解決方案:
1.session同步復(fù)制赵讯。(所有的web-server都賦值一份相同的,保存到各個服務(wù)器上耿眉。優(yōu)點是簡單边翼。缺點顯而易見,所有的web服務(wù)器都需要復(fù)制鸣剪,占用帶寬组底;而且數(shù)據(jù)量受內(nèi)存限制)
2.客戶端存儲法∥骺客戶端cookie
3.反向代理hash一致性斤寇。(ip一致性桶癣,nginx將ip一致的請求發(fā)送到一個服務(wù)器上拥褂;七層:根據(jù)應(yīng)用id來分發(fā)。)
4.后端存儲牙寞。數(shù)據(jù)庫或者緩存饺鹃。 web-server重啟或者擴容都不會有session丟失,沒有安全隱患间雀。缺點:需要增加一次網(wǎng)絡(luò)調(diào)用悔详。
11.HashMap的工作原理
通過hash的方法,通過put和get存儲和獲取對象惹挟。存儲對象時茄螃,我們將K/V傳給put方法時,它調(diào)用hashCode計算hash從而得到bucket位置连锯,進一步存儲归苍,
HashMap會根據(jù)當(dāng)前bucket的占用情況自動調(diào)整容量(超過Load Facotr則resize為原來的2倍)。獲取對象時运怖,我們將K傳給get拼弃,它調(diào)用hashCode計算hash從而得到bucket位置,
并進一步調(diào)用equals()方法確定鍵值對摇展。如果發(fā)生碰撞的時候吻氧,Hashmap通過鏈表將產(chǎn)生碰撞沖突的元素組織起來,在Java 8中咏连,
如果一個bucket中碰撞沖突的元素超過某個限制(默認是8)盯孙,則使用紅黑樹來替換鏈表,從而提高速度祟滴。
12.hashmap和hashtable的區(qū)別:(兩者都是無序的)
hashmap非線程安全振惰,允許value為null
hashtable是線程安全,不允許null
單線程hashmap快踱启。Synchronize
13.ConcurrentHashMap:
線程安全报账,hashtable升級研底。
1.7版本,最小粒度是segment數(shù)組和hashentry,put透罢、get要進行兩次hashcode()計算榜晦。
1.8版本,最小粒度是hashentry
14.JDBC 流程
第一步羽圃;加載Driver類乾胶,注冊數(shù)據(jù)庫驅(qū)動
第二部:通過DriverManager,使用url朽寞,用戶名和密碼建立連接识窿;
第三步:通過connection,使用sql語句打開Statement對象
傳入?yún)?shù)脑融,之所以這樣是為了防止sql注入
preparedStatement.setInt(1,18)
第四步:執(zhí)行語句喻频,將結(jié)果返回resultset
第五步:關(guān)閉連接
15.MVC 設(shè)計思想
Model View Controller
16.equals 與 == 的區(qū)別
基本數(shù)據(jù)類型使用== 比較的是他們的值;引用數(shù)據(jù)類型==比較的是他們的堆內(nèi)存地址肘迎,因此比較引用數(shù)據(jù)類型的值需要用equals
17.runnable和callable有什么區(qū)別甥温?
callable是1.5版本新增的,最大的區(qū)別是實現(xiàn)callable接口的線程能返回執(zhí)行結(jié)果妓布;而實現(xiàn)runnable接口的線程無法返回執(zhí)行結(jié)果姻蚓。call()方法能夠允許拋出異常,而run()只能內(nèi)部處理異常匣沼。
集合:
1.List 和 Set 區(qū)別:
list允許重復(fù)元素狰挡,set不允許重復(fù)元素
2.List 和 Map 區(qū)別
list存放單個元素,map存放key-value鍵值對释涛。hashmap加叁、treemap,treemap有序。
3.Arraylist 與 LinkedList 區(qū)別
Arraylist 與 LinkedList 區(qū)別:
Arraylist基于動態(tài)數(shù)組枢贿,LinkedList基于鏈表殉农。
一般來說,ArrayList的查找速度比LinkedList快局荚,但是增加超凳、刪除元素LinkedList快。
Arraylist和Vector區(qū)別:
Arraylist和Vector都是基于數(shù)組的List耀态,但是Vector是線程安全的轮傍,資源開銷大。
兩者的區(qū)別還有:如果數(shù)組的大小不夠首装,需要擴展的大小不一樣创夜。Arraylist是50%+1,Vector是擴展一倍仙逻。
HashMap 和 Hashtable 的區(qū)別:
兩者都是基于哈希表來實現(xiàn)鍵值映射的工具類驰吓。
hashtable是線程安全的涧尿。hashmap支持value為null,hashtable不行檬贰。
hashmap擴容是2倍姑廉,hashtable
HashSet 和 HashMap 區(qū)別:
HashSet實現(xiàn)的set接口,HashMap實現(xiàn)map接口翁涤。一個存儲對象桥言,一個存儲鍵值對。
Set通過add添加元素葵礼,map使用put添加元素号阿。
4.HashMap 和 Hashtable 的區(qū)別
Hashtbale是線程安全,而HashMap是非線程安全鸳粉。HashMap支持null值扔涧,HashTable不支持。兩個擴容方式不一樣:Hashmap是直接括兩倍赁严,hashtable是2n+1
5.HashSet 和 HashMap 區(qū)別
HashMap存的是鍵值對扰柠,hashtable存的是對象,實現(xiàn)了set接口疼约,是collection子集
6.HashMap 和 ConcurrentHashMap 的區(qū)別
ConcurrentHashMap是線程安全的,Hashmap非線程安全
7.HashMap的實現(xiàn)原理:
簡單地說蝙泼,HashMap 在底層將 key-value 當(dāng)成一個整體進行處理程剥,這個整體就是一個 Entry 對象。HashMap 底層采用一個 Entry[] 數(shù)組來保存所有的 key-value 對汤踏,當(dāng)需要存儲一個 Entry 對象時织鲸,會根據(jù)hash算法來決定其在數(shù)組中的存儲位置,在根據(jù)equals方法決定其在該數(shù)組位置上的鏈表中的存儲位置溪胶;當(dāng)需要取出一個Entry時搂擦,
也會根據(jù)hash算法找到其在數(shù)組中的存儲位置,再根據(jù)equals方法從該位置上的鏈表中取出該Entry哗脖。
線程:
1.創(chuàng)建線程的方式及實現(xiàn)
實現(xiàn)Runnable接口(callable接口)瀑踢,或者繼承Thread。
1.什么是線程才避?
線程是操作系統(tǒng)能夠進行運算調(diào)度的最小單位橱夭,它被包含在進程中,是進程中的實際運作單位桑逝。程序員可以通過它進行多處理器(并發(fā))編程棘劣,也可以使用
多線程對運算密集型任務(wù)提速,
2.線程和進程有什么區(qū)別楞遏?
線程是進程的子集茬暇,一個進程可以有多個線程首昔,每條線程并行執(zhí)行不同的任務(wù)。不同的進程使用不同的內(nèi)存空間糙俗,而所有的線程共享一片相同的內(nèi)存空間沙廉。
每個線程都有單獨的棧內(nèi)存在存儲本地數(shù)據(jù)。
3.如何java中實現(xiàn)線程臼节?
三種方式撬陵,分別是實現(xiàn)Runnable接口、Callable接口网缝,或者集成Thread.
4.用Runnable還是Thread巨税?
因為java不支持多繼承,但是支持調(diào)用多個接口粉臊,因此建議使用Runnable接口草添。
5.Java中Runnable和Callable有什么不同?
Runnable沒有返回值扼仲,不能拋出異常远寸;Callable有返回值且能拋出異常。Callable是JDK1.5增加的屠凶。
6.Java中CyclicBarrier和CountDownLatch有什么不同驰后?
兩個都可以實現(xiàn)一組線程等待其他線程。但是CountDownLatch不能重新使用矗愧。
7.java的內(nèi)存模型是什么灶芝?
java內(nèi)存模型規(guī)定和指引Java程序在不同的內(nèi)存架構(gòu)、CPU和操作系統(tǒng)間有確定性的行為唉韭。它在多線程的情況下尤其重要夜涕。Java內(nèi)存模型對一個線程所做的
變動能被其他線程可見提供了保證,他們之間是先行發(fā)生關(guān)系属愤,這個關(guān)系定義了一些規(guī)則讓程序員在并發(fā)編程時思路更清晰女器。比如:先行發(fā)生關(guān)系確保了:
*線程內(nèi)的代碼能夠按先后順序執(zhí)行,這被稱為程序次序規(guī)則住诸。
*對于同一個鎖驾胆,一個解鎖操作一定要發(fā)生在時間上后發(fā)生的另一個鎖定操作之前,也叫做管程鎖定規(guī)則只壳;
*前一個對volatile的寫操作在后一個volatile的讀操作之前俏拱。
*一個線程內(nèi)的任何操作必須在這個線程的start()調(diào)用之后,也要作線程啟動規(guī)則吼句。
*一個線程內(nèi)的任何操作都會在線程終止之前锅必,線程終止規(guī)則。
*一個對象的中介操作必須在這個對象構(gòu)造完成之后,也叫對象終結(jié)規(guī)則搞隐。
*可傳遞性驹愚;
8.Java中的volatile變量是什么?
是一個特殊的修飾符劣纲,只有成員變量才能使用它逢捺。在java并發(fā)程序缺少同步類的情況下,多線程對成員變量的操作對其他線程是透明的癞季。volatile變量可以保證
下一個讀取操作會在前一個寫操作之后發(fā)生劫瞳。
*保證了不同線程對這個變量進行操作時的可見性,即一個線程修改了某個變量的值绷柒,這新值對其他線程來說是立即可見的志于。
*進制進行指令重排序。
9.什么是線程安全废睦?Vector是一個線程安全類嗎伺绽?
線程安全:如果一個代碼會在多個線程中運行的,其結(jié)果與單個線程運行結(jié)果一致嗜湃,且其他的變量的值也和預(yù)期的是一樣的奈应,就是線程安全。Vector是線程安全的集合购披。
10.Java中什么是競態(tài)條件杖挣? 舉個例子說明。
競態(tài)條件會導(dǎo)致程序在并發(fā)情況下出現(xiàn)一些bugs今瀑。舉例:兩個線程對一個文件進行操作程梦,如果文件a不存在,就創(chuàng)建一個新的橘荠;一個先判斷不存在,創(chuàng)建郎逃;另一個也會這么多哥童,就出現(xiàn)的文件的重復(fù)創(chuàng)建,覆蓋褒翰。
11.Java中如何停止一個線程贮懈?
jdk1.0本來有stop、suspend等方法优训,但是由于潛在的死鎖威脅因此被棄用朵你。當(dāng)線程執(zhí)行完線程會自動結(jié)束,可以用volatile布爾值來中斷線程揣非。
12.一個線程運行時發(fā)生異常會怎樣抡医?
如果該異常被捕獲或拋出,則線程繼續(xù)運行;如果沒有沒有被捕獲忌傻,線程將會停止大脉。Tread.UncaughtExceptionHandler是用于處理未捕獲一場造成
線程突然中斷情況的一個內(nèi)嵌接口。當(dāng)一個未捕獲異常將造成線程中斷的時候水孩,JVM會使用Thread.getUncaughtExceptionHandle()來查詢線程的UncaughtExceptionHandler镰矿,
并將線程和異常作為參數(shù)傳遞給handler的uncaughtException()方法進行處理。
13.如何在兩個線程間共享數(shù)據(jù)俘种?
共享數(shù)據(jù)場景有兩種:
*賣火車票秤标。
解決方案:創(chuàng)建一個Runnable,這個Runnable里有共享數(shù)據(jù)宙刘。如果每個線程執(zhí)行的代碼相同,那么可以使用同一個runnable對象,這個runnable有那個共享數(shù)據(jù),例如,賣票系統(tǒng)就是這么做的.
*銀行存錢問題苍姜。
解決方案:如果每個線程執(zhí)行的代碼不同,那么要使用不同的runnable對象,有如下兩種方式可以實現(xiàn)runnable對象間的數(shù)據(jù)共享
實現(xiàn)兩個runnable對象,將共享數(shù)據(jù)分別傳遞給兩個不同線程.
將這些Runnable對象作為一個內(nèi)部類,將共享數(shù)據(jù)作為成員變量.
http://www.cnblogs.com/dolphin0520/p/3958019.html
MySQL 索引使用的注意事項
◆索引不會包含有NULL值的列
只要列中包含有NULL值都將不會被包含在索引中,復(fù)合索引中只要有一列含有NULL值荐类,那么這一列對于此復(fù)合索引就是無效的怖现。所以我們在數(shù)據(jù)庫設(shè)計時不要讓字段的默認值為NULL。
◆使用短索引
對串列進行索引玉罐,如果可能應(yīng)該指定一個前綴長度屈嗤。例如,如果有一個CHAR(255)的列吊输,如果在前10個或20個字符內(nèi)饶号,多數(shù)值是惟一的,那么就不要對整個列進行索引季蚂。短索引不僅可以提高查詢速度而且可以節(jié)省磁盤空間和I/O操作茫船。
◆索引列排序
MySQL查詢只使用一個索引,因此如果where子句中已經(jīng)使用了索引的話扭屁,那么order by中的列是不會使用索引的算谈。因此數(shù)據(jù)庫默認排序可以符合要求的情況下不要使用排序操作;盡量不要包含多個列的排序料滥,如果需要最好給這些列創(chuàng)建復(fù)合索引然眼。
◆like語句操作
一般情況下不鼓勵使用like操作,如果非使用不可葵腹,如何使用也是一個問題高每。like “%aaa%” 不會使用索引而like “aaa%”可以使用索引。
◆不要在列上進行運算
select * from users where YEAR(adddate)<2007; 將在每個行上進行運算践宴,這將導(dǎo)致索引失效而進行全表掃描鲸匿,因此我們可以改成
select * from users where adddate<‘2007-01-01’;
◆不使用NOT IN和<>操作