spring框架面試題目:https://blog.csdn.net/m0_37852553/article/details/78678278(這是必須要看的)javascript
https://blog.csdn.net/WYpersist/article/details/80274561html
1.mysql怎樣調優:java
禁止使用select * ; 禁止使用in ,not in,or,having,使用exists 和not exists代替mysql
避免使用 union ,使用union all來代替jquery
避免使用兩端模糊查詢 like '%###%'面試
儘可能少用鏈接查詢 join 儘可能使用join代替子查詢、ajax
儘可能提早篩選條件(篩選條件的時候要,先篩選大條件,再篩選小條件 例子:篩選小於30歲的男生,(注意先篩性別,在篩選年齡) )算法
儘可能使用索引來提升查詢效率 儘可能避免在where條件中進行運算 儘可能批量的操做數據(好比說插入100條數據,建議一次性插完,而不是插入100次)spring
儘可能避免使用is null is not null <> !=之類的sql
少用排序(若是項目中沒有讓使用排序,那就儘可能少使用排序)
2.HashMap的源碼,實現原理,JDK8中對HashMap作了怎樣的優化。
數組+鏈表 這是1.8版本以前的。 數組+鏈表+紅黑樹 這是1.8版本以後的。
3.HaspMap擴容是怎樣擴容的,爲何都是2的N次冪的大小
4.HashMap,HashTable,ConcurrentHashMap的區別。
HashTable底層數組+鏈表實現,不管key仍是value都不能爲null,線程安全,實現線程安全的方式是在修改數據時鎖住整個HashTable,效率低,初始size爲11
HashMap底層數組+鏈表實現,可以存儲null鍵和null值,線程不安全,初始size爲16
5.極高併發下HashTable和ConcurrentHashMap哪一個性能更好,爲何,如何實現的
HashTable使用一把鎖處理併發問題,當有多個線程訪問時,須要多個線程競爭一把鎖,致使阻塞
ConcurrentHashMap則使用分段,至關於把一個HashMap分紅多個,而後每一個部分分配一把鎖,這樣就能夠支持多線程訪問
6.HashMap在高併發下若是沒有處理線程安全會有怎樣的安全隱患,具體表現是什麼
多線程put時可能會致使get無限循環,具體表現爲CPU使用率100%;
緣由:在向HashMap put元素時,會檢查HashMap的容量是否足夠,若是不足,則會新建一個比原來容量大兩倍的Hash表,而後把數組從老的Hash表中遷移到新的Hash表中,遷移的過程就是一個rehash()的過程,多個線程同時操做就有可能會造成循環鏈表,因此在使用get()時,就會出現Infinite Loop的狀況
7.java中四種修飾符的限制範圍。
8.Object類中的方法
該方法用於哈希查找,重寫了equals方法通常都要重寫hashCode方法。這個方法在一些具備哈希功能的Collection中用到。
通常必須知足obj1.equals(obj2)==true。能夠推出obj1.hash-Code()==obj2.hashCode(),可是hashCode相等不必定就知足equals。不過爲了提升效率,應該儘可能使上面兩個條件接近等價。
wait方法就是使當前線程等待該對象的鎖,當前線程必須是該對象的擁有者,也就是具備該對象的鎖。wait()方法一直等待,直到得到鎖或者被中斷。wait(longtimeout)設定一個超時間隔,若是在規定時間內沒有得到鎖就返回。
調用該方法後當前線程進入睡眠狀態,直到如下事件發生。
(1)其餘線程調用了該對象的notify方法。
(2)其餘線程調用了該對象的notifyAll方法。
(3)其餘線程調用了interrupt中斷該線程。
(4)時間間隔到了。
此時該線程就能夠被調度了,若是是被中斷的話就拋出一個InterruptedException異常。
9.接口和抽象類的區別,注意JDK8的接口能夠有實現。
Java 8新特性–接口默認方法
默認方法是在接口中的方法簽名前加上 default 關鍵字的實現方法。
10.動態代理的兩種方式,以及區別。
import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; public class Intermediary implements InvocationHandler{ private Object post; Intermediary(Object post){ this.post = post; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Object invoke = method.invoke(post, args); System.out.println("中介:該房源已發佈!"); return invoke; } }
import java.lang.reflect.Proxy; public class Test { public static void main(String[] args) { Rent rent = new Landlord(); Intermediary intermediary = new Intermediary(rent); Rent rentProxy = (Rent) Proxy.newProxyInstance(rent.getClass().getClassLoader(), rent.getClass().getInterfaces(), intermediary); rentProxy.rent(); } }
2.CGLIB動態代理:
public class Landlord { public void rent(){ System.out.println("房東要出租房子了!"); } }
import java.lang.reflect.Method; import net.sf.cglib.proxy.MethodInterceptor; import net.sf.cglib.proxy.MethodProxy; public class Intermediary implements MethodInterceptor { @Override public Object intercept(Object object, Method method, Object[] args,MethodProxy methodProxy) throws Throwable { Object intercept = methodProxy.invokeSuper(object, args); System.out.println("中介:該房源已發佈!"); return intercept; } }
import net.sf.cglib.proxy.Enhancer; public class Test { public static void main(String[] args) { Intermediary intermediary = new Intermediary(); Enhancer enhancer = new Enhancer(); enhancer.setSuperclass(Landlord.class); enhancer.setCallback(intermediary); Landlord rentProxy = (Landlord) enhancer.create(); rentProxy.rent(); } }
11.java序列化的方式
Serializable:一個對象想要被序列化,那麼它的類就要實現 此接口,這個對象的全部屬性(包括private屬性、包括其引用的對象)均可以被序列化和反序列化來保存、傳遞。
Externalizable:他是Serializable接口的子類,有時咱們不但願序列化那麼多,可使用這個接口,這個接口的writeExternal()和readExternal()方法能夠指定序列化哪些屬性;
12.傳值和傳引用的區別,Java是怎麼樣的,有沒有傳值引用。
一、傳值:傳值就是指將一個值傳遞到方法的內部。例如int a = 5,那麼也就是給int型變量a賦值,值爲5.若是一個方法,將這個變量傳進方法的內部,則進行的就是傳值。在java中,有8種基本數據類型,它們分別爲:int、long、float、double、char、boolean、short、byte.這8種基本的數據類型做爲參數進行傳遞是,都是進行的傳值。·除此以外,還有一種特殊的狀況,String。自己String是一個引用類型,不少人認爲在向方法中傳遞String類型參數時,是進行傳引用。其實在這裏,String能夠看作爲一個包裝類,由於String其自己就是經過字符數組實現的,那麼它在實現參數傳遞的時候,也就是以char型數據的方式進行的,也就是進行傳值。
二、傳引用:java中的引用能夠初步的理解爲地址。也是在new了一個對象後,該對象是存在JVM的Heap區,也就是堆。那麼必然有一個地址要指向這個對象的在JVM中的位置,那麼,指向這個對象的這個地址就能夠簡單的理解爲「引用」。
13.一個ArrayList在循環過程當中刪除,會不會出問題,爲何。
14.@transactional註解在什麼狀況下會失效,爲何。
通俗的說,編譯器能檢測到的是checked,檢測不到的就是unchecked。
派生於Error或者RuntimeException(好比空指針,1/0)的異常稱爲unchecked異常。
繼承自Exception得異常統稱爲checked異常,如IOException、TimeoutException等。
四、只讀事務:
@Transactional(propagation=Propagation.NOT_SUPPORTED,readOnly=true)
只讀標誌只在事務啓動時應用,不然即便配置也會被忽略。
啓動事務會增長線程開銷,數據庫因共享讀取而鎖定(具體跟數據庫類型和事務隔離級別有關)。一般狀況下,僅是讀取數據時,沒必要設置只讀事務而增長額外的系統開銷。
15.線程池的參數有哪些,在線程池建立一個線程的過程。
16.volitile關鍵字的做用,原理。
17.能夠考Spring中使用了哪些設計模式
單例模式
對象的建立都是單例模式
工廠模式
beanfactory建立對象用的是工廠模式
模版方法
jdbcTemplate
代理模式
spring的AOP
還有不少,可是暫時不懂,能說出來的就是這些
18.dubbo的組件有哪些,各有什麼做用。
Provider:提供者
Consumer:消費者
registry:註冊中心(至關於中介)
monitor:監控中心(dubbo本身的監控項目,直接解壓在tomcat下就能啓動了,能夠查看消費者,生產者)-----------
https://blog.csdn.net/qq_24853627/article/details/79380707
container:服務容器
服務容器負責啓動,加載,運行服務提供者。
服務提供者在啓動時,向註冊中心註冊本身提供的服務。
服務消費者在啓動時,向註冊中心訂閱本身所需的服務。
註冊中心返回服務提供者地址列表給消費者,若是有變動,註冊中心將基於長鏈接推送變動數據給消費者。
服務消費者,從提供者地址列表中,基於軟負載均衡算法,選一臺提供者進行調用,若是調用失敗,再選另外一臺調用。
服務消費者和提供者,在內存中累計調用次數和調用時間,定時每分鐘發送一次統計數據到監控中心。
19.zookeeper的負載均衡算法有哪些。
通常來講負載均衡設備都會默認支持多種負載均衡分發策略,例如:
Ø 輪詢(RoundRobin)將請求順序循環地發到每一個服務器。當其中某個服務器發生故障,AX就把其從順序循環隊列中拿出,不參加下一次的輪詢,直到其恢復正常。
Ø 比率(Ratio):給每一個服務器分配一個加權值爲比例,根椐這個比例,把用戶的請求分配到每一個服務器。當其中某個服務器發生故障,AX就把其從服務器隊列中拿出,不參加下一次的用戶請求的分配,直到其恢復正常。
Ø 優先權(Priority):給全部服務器分組,給每一個組定義優先權,將用戶的請求分配給優先級最高的服務器組(在同一組內,採用預先設定的輪詢或比率算法,分配用戶的請求);當最高優先級中全部服務器或者指定數量的服務器出現故障,AX將把請求送給次優先級的服務器組。這種方式,實際爲用戶提供一種熱備份的方式。
Ø 最少鏈接數(LeastConnection):AX會記錄當前每臺服務器或者服務端口上的鏈接數,新的鏈接將傳遞給鏈接數最少的服務器。當其中某個服務器發生故障,AX就把其從服務器隊列中拿出,不參加下一次的用戶請求的分配,直到其恢復正常。
Ø 最快響應時間(Fast Reponse time):新的鏈接傳遞給那些響應最快的服務器。當其中某個服務器發生故障,AX就把其從服務器隊列中拿出,不參加下一次的用戶請求的分配,直到其恢復正常。
以上爲通用的負載均衡算法,還有一些算法根據不一樣的需求也可能會用到,例如:
Ø 哈希算法( hash): 將客戶端的源地址,端口進行哈希運算,根據運算的結果轉發給一臺服務器進行處理,當其中某個服務器發生故障,就把其從服務器隊列中拿出,不參加下一次的用戶請求的分配,直到其恢復正常。
Ø 基於策略的負載均衡:針對不一樣的數據流設置導向規則,用戶可自行編輯流量分配策略,利用這些策略對經過的數據流實施導向控制。
Ø 基於數據包的內容分發:例如判斷HTTP的URL,若是URL中帶有.jpg的擴展名,就把數據包轉發到指定的服務器。
20.dubbo是如何利用接口進行通訊的
Dubbo的整個遠程通訊層由exchange,transport, serialize
exchange,信息交換層,封裝請求響應模式,同步轉異步,以Request, Response爲中心,擴展接口爲Exchanger, ExchangeChannel, HeaderExchangeHandler,ExchangeClient, ExchangeServer
transport,網絡傳輸層,抽象mina和netty爲統一接口,以Message爲中心,擴展接口爲Channel, Transporter, Client, Server,Codec
serialize,數據序列化層,可複用的一些工具,擴展接口爲Serialization, ObjectInput, ObjectOutput,ThreadPool
21.JDK8的新特性,流的概念及優點,爲何有這種優點
package com.bjsxt.dp.jdk; import java.text.Collator; import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.Comparator; import java.util.List; import java.util.stream.Collector; //這是在jdk8以前對集合進行排序 public class Jdk8Before { public static void main(String[] args) { List<String> asList = Arrays.asList("d","c","a","f","g","k"); /* Collections.sort(asList,new Comparator<String>() { @Override public int compare(String o1, String o2) { // TODO Auto-generated method stub return Collator.getInstance().compare(o1, o2); } });*/ //使用lambda表達式對集合進行遍歷 Collections.sort(asList,(String o1,String o2)->{ return Collator.getInstance().compare(o1, o2); }); System.out.println(asList); } } 最後的運行結果:[a, c, d, f, g, k]
22.json的解析
json的格式:
{} 對象 {「key」:"value","k1":"v1"}
[] 數組 [{},{}]
json示例:描述一個學生
{"name":"張三",「age」:18,"gender":1}
寫json和獲取json:注意json就是一種javascript類型的語言
上面是存儲一個對象,下面是存儲兩個對象
描述班級的信息:
其中雙引號是能夠省略的,可是不建議省略
var json={「classname」:"三年一班",「students」:[{"name":"lilei","age":18,"sex":true},{"name":"hanmeimei","age":17,"sex":true}]}
alert(json.students[1].name);
從上面的案例中能夠看出:json就是一個對象。可以直接點出來他的屬性,最後拿到他的值。
json的解析:
服務器給瀏覽器使用ajax返回數據xml的,html的,json的
使用jquery的方式遍歷數組的方式:使用的是each(function(){})
json數據格式的優勢:輕量級交互語言 結構簡單 易於解析
同窗面試題目:
編寫java方法,經過反射的機制,調用String 類型的toUpperCase方法將小寫字符串轉換成大寫的字符串。
中科軟今天的電話面試題目:
有一個數組,其中可能保存這相同的數字,請你編程實現統計其中的每一個數字一共出現了多少次? (這個必定要記住!!!)
一般咱們看到的考試頁面,其中會設計到幾個數據庫,請說出你的設計?
這是網上的答案:
https://jingyan.baidu.com/article/afd8f4de86ddef34e286e9a2.html (怎樣安全的度過試用期)