java面試題目

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

  • ConcurrentHashMap底層採用分段的數組+鏈表實現,線程安全

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類中的方法

clone方法:保護方法,實現對象的淺複製,只有實現了Cloneable接口才能夠調用該方法,不然拋出CloneNotSupportedException異常

getClass方法:final方法,得到運行時類型。

toString方法:該方法用得比較多,通常子類都有覆蓋。

finalize方法:該方法用於釋放資源。由於沒法肯定該方法何時被調用,不多使用

equals方法:該方法是很是重要的一個方法。通常equals和==是不同的,可是在Object中二者是同樣的。子類通常都要重寫這個方法

hashCode方法:

該方法用於哈希查找,重寫了equals方法通常都要重寫hashCode方法。這個方法在一些具備哈希功能的Collection中用到。

通常必須知足obj1.equals(obj2)==true。能夠推出obj1.hash-Code()==obj2.hashCode(),可是hashCode相等不必定就知足equals。不過爲了提升效率,應該儘可能使上面兩個條件接近等價。

wait方法:

wait方法就是使當前線程等待該對象的鎖,當前線程必須是該對象的擁有者,也就是具備該對象的鎖。wait()方法一直等待,直到得到鎖或者被中斷。wait(longtimeout)設定一個超時間隔,若是在規定時間內沒有得到鎖就返回。

調用該方法後當前線程進入睡眠狀態,直到如下事件發生。

(1)其餘線程調用了該對象的notify方法。

(2)其餘線程調用了該對象的notifyAll方法。

(3)其餘線程調用了interrupt中斷該線程。

(4)時間間隔到了。

此時該線程就能夠被調度了,若是是被中斷的話就拋出一個InterruptedException異常。

notify方法:該方法喚醒在該對象上等待的某個線程。

notifyAll方法:該方法喚醒在該對象上等待的全部線程。

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序列化的方式

Java中實現序列化的兩種方式 Serializable 接口和 Externalizable接口

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註解在什麼狀況下會失效,爲何。

1,通常在service里加@Transactional註解,不建議在接口上添加,加了此註解後此類會歸入spring事務管理中,每一個業務方法執行時,都會開啓一個事務,不過都是按照相同的管理機制。
2,@Transactional註解只能應用到public修飾符上,其它修飾符不起做用,但不報錯。
3,默認狀況下此註解會對unchecked異常進行回滾,對checked異常不回滾。
那什麼是unchecked,什麼是checked呢?

通俗的說,編譯器能檢測到的是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的新特性,流的概念及優點,爲何有這種優點

***lambada表達式*******

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  (怎樣安全的度過試用期)

相關文章
相關標籤/搜索