java面試題總結

中信銀行

1.Integer範圍問題

Integer a=100,b=100,c=200,d=200;
System.out.println(a == b);//true
System.out.println(c == d);//false

   Integer在-128~127之間會有緩存,在數字之間的地址值是一樣的,超過的會new出一個新的對象。

 

2.List如何求並集

List<String> list1 = new ArrayList<>();
List<String> list2 = new ArrayList<>();

//並集
list2.removeAll(list1);
list1.addAll(list2);

//交集 
list1.retainAll(list2);

//差集 
list1.removeAll(list2);

 考點List集合類collections的一些方法

 

3.三個線程同時執行,順序輸出ABC

public class TestThread1 {
    public static void main(String[] args) {
        
        // 線程A
        final Thread a = new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("A");
            }
        });

        // 線程B
        final Thread b = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    // 執行b線程之前,加入a線程,讓a線程執行
                    a.join();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("B");

            }
        });

        // 線程C
        final Thread c = new Thread(new Runnable() {

            @Override
            public void run() {
                try {
                    // 執行c線程之前,加入b線程,讓b線程執行
                    b.join();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("C");

            }
        });

        // 線程D
        Thread d = new Thread(new Runnable() {

            @Override
            public void run() {
                try {
                    // 執行d線程之前,加入c線程,讓c線程執行
                    c.join();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("D");
            }
        });

        // 啓動四個線程
        a.start();
        b.start();
        c.start();
        d.start();
    }
}

檢測線程狀態的變化 join

 

4.private long val;    屬性val的get set方法高併發下會不會有問題?如何處理。

public class Data {


    private int data;

    private ReadWriteLock lock = new ReentrantReadWriteLock();

    public void  set(int data){

        lock.writeLock().lock(); //取到寫鎖

        try {

            System.out.println(Thread.currentThread().getName()+"準備寫入數據!");

            try {

                Thread.sleep(0);

            }catch (InterruptedException e) {

                e.printStackTrace(); //打印異常信息

            }

            this.data = data;

            System.out.println(Thread.currentThread().getName()+"寫入"+this.data);

        }finally {

            lock.writeLock().unlock();  //釋放寫鎖!

        }

    }

    public  void  get(){

        lock.readLock().lock();  // 取到讀鎖!

       try {

           System.out.println(Thread.currentThread().getName()+"準備讀取數據");

           try {

               Thread.sleep(20);

           } catch (InterruptedException e) {

               e.printStackTrace(); //打印異常

           }

           System.out.println(Thread.currentThread().getName()+"讀取數據!");

       }finally {

           lock.readLock().unlock();  //釋放讀鎖!

       }

    }

}

 

 

5.Collection和Collections區別

java.util.Collection 是一個集合接口(集合類的一個頂級接口)。其直接繼承接口有List與Set。

List特點:元素有放入順序,元素可重複 ,Set特點:元素無放入順序,元素不可重複,重複元素會覆蓋掉,(注意:元素雖然無放入順序,但是元素在set中的位置是有該元素的HashCode決定的,其位置其實是固定的,加入Set 的Object必須定義equals()方法 ,另外list支持for循環,也就是通過下標來遍歷,也可以用迭代器,但是set只能用迭代,因爲他無序,無法用下標來取得想要的值。

Set:檢索元素效率低下,刪除和插入效率高,插入和刪除不會引起元素位置改變。 
List:和數組類似,List可以動態增長,查找元素效率高,插入刪除元素效率低,因爲會引起其他元素位置改變。 

LinkedList、ArrayList、HashSet是非線程安全的,Vector是線程安全的;

 

Collections則是集合類的一個工具類/幫助類,其中提供了一系列靜態方法,用於對集合中元素進行排序、搜索以及線程安全等各種操作。

  1. 排序(Sort) 根據元素的自然順序 對指定列表按升序進行排序。列表中的所有元素都必須實現 Comparable 接口。此列表內的所有元素都必須是使用指定比較器可相互比較的
  2. 混排(Shuffling)
    混排算法所做的正好與 sort 相反: 它打亂在一個 List 中可能有的任何排列的蹤跡。也就是說,基於隨機源的輸入重排該 List, 這樣的排列具有相同的可能性(假設隨機源是公正的)。這個算法在實現一個碰運氣的遊戲中是非常有用的。例如,它可被用來混排代表一副牌的 Card 對象的一個 List 。另外,在生成測試案例時,它也是十分有用的。Collections.Shuffling(list)
  3. 反轉(Reverse)
    使用Reverse方法可以根據元素的自然順序 對指定列表按降序進行排序。
    Collections.reverse(list)
  4. 替換所以的元素(Fill)
    使用指定元素替換指定列表中的所有元素。Collections.fill(li,"aaa");

……..

6.Springmvc spring boot區別,簡化了哪些地方

Spring MVC是基於 Servlet 的一個 MVC 框架 主要解決 WEB 開發的問題,因爲 Spring 的配置非常複雜,各種XML、 JavaConfig處理起來比較繁瑣。於是爲了簡化開發者的使用,從而創造性地推出了Spring boot,約定優於配置,簡化了spring的配置流程。

Spring 最初利用“工廠模式”(DI)和“代理模式”(AOP)解耦應用組件。大家覺得挺好用,於是按照這種模式搞了一個 MVC框架(一些用Spring 解耦的組件),用開發 web 應用( SpringMVC )。然後有發現每次開發都寫很多樣板代碼,爲了簡化工作流程,於是開發出了一些“懶人整合包”(starter),這套就是 Spring Boot。

7.Springboot核心註解?

7.1.@SpringBootApplication

用於Spring主類上最最最核心的註解,自動化配置文件,表示這是一個SpringBoot項目,用於開啓SpringBoot的各項能力。

相當於@SpringBootConfiguration、@EnableAutoConfiguration、@ComponentScan三個註解的組合。

7.2.@EnableAutoConfiguration

允許SpringBoot自動配置註解,開啓這個註解之後,SpringBoot就能根據當前類路徑下的包或者類來配置Spring Bean。

例如:

當前路徑下有MyBatis這個Jar包,MyBatisAutoConfiguration 註解就能根據相關參數來配置Mybatis的各個Spring Bean。

7.3.@Configuration

Spring 3.0添加的一個註解,用來代替applicationContext.xml配置文件,所有這個配置文件裏面能做到的事情都可以通過這個註解所在的類來進行註冊。

7.4.@SpringBootConfiguration

@Configuration註解的變體,只是用來修飾Spring Boot的配置而已。

7.5.@ComponentScan

Spring 3.1添加的一個註解,用來代替配置文件中的component-scan配置,開啓組件掃描,自動掃描包路徑下的@Component註解進行註冊bean實例放到context(容器)中。

8.Redis如何查出1000w key  order:orderId

常規的查找key,使用的是KEYS pattern 查找所有符合給定模式pattern的key
但使用keys命令在海量數據下是有問題的

    keys指令一次性返回所有匹配的key
    鍵的數量過大會造成服務的卡頓, 需要等很久纔會返回結果.

從海量key裏查詢出某一固定前綴的key 主要用到了SCAN 命令 ,該命令的格式如下:
SCAN cursor [MATCH pattern] [COUNT count]
cursor 爲遊標, 即從哪裏開始查找, 第一次查找時,傳入0.
MATCH pattern 爲查找的條件
count 爲返回的個數, 雖然這裏可以填寫返回的個數, 但是真實返回的數量是不可控的, 只能是大概率的返回符合count的參數.

SCAN 命令是一個基於遊標的迭代器(cursor based iterator): SCAN 命令每次被調用之後, 都會向用戶返回一個新的遊標, 用戶在下次迭代時需要使用這個新遊標作爲 SCAN 命令的遊標參數, 以此來延續之前的迭代過程。

當 SCAN 命令的遊標參數被設置爲 0 時, 服務器將開始一次新的迭代, 而當服務器向用戶返回值爲 0 的遊標時, 表示迭代已結束。一次返回的數量不可控, 只能是大概率的符合count參數
演示代碼如下, 查詢以order:orderId開頭的key:

127.0.0.1:6379> scan 0 match order:orderId* count 10
1) "917504"
2) 1) "order:orderId:068846"
   2) "order:orderId:174741"
   3) "order:orderId:36682"
   4) "order:orderId:003555"
   5) "order:orderId:035818"
   6) "order:orderId:102763"

 

9.一個表省市區的查詢語句,類似:同一張表省市縣sql查詢

 

SELECT 
   cy.NAME AS provice,
   cy.CODE AS proviceCode,
   ci.NAME AS city,
   ci.CODE AS cityCode,
   ct.country AS country,
   ct.cou2Code AS countryCode 
 FROM
   t_unionpay_areacode cy 
   LEFT JOIN t_unionpay_areacode ci 
     ON ci.parent_code = cy.CODE 
     AND ci.LEVEL = 2 
   LEFT JOIN 
     (SELECT 
       cou1.NAME AS city,
       cou1.CODE AS cou1Code,
       cou2.NAME AS country,
       cou2.CODE AS cou2Code 
     FROM
       t_unionpay_areacode cou1 
       LEFT JOIN t_unionpay_areacode cou2 
         ON cou2.parent_code = cou1.CODE 
         AND cou2.LEVEL = 3 
     WHERE cou1.LEVEL = 2) ct 
     ON ci.NAME = ct.city

10.數據庫有上億條數據的兩個表,有關聯字段如何查出表1的2000-2199兩百條與表2的關聯數據??至今不明

 

11.volatile的作用是什麼

保持內存可見性:所有線程都能看到共享內存的最新狀態。

public class TestInteger {
    private int value;
    public int get(){
        return value;
    }
    public void set(int value){
        this.value = value;
    }
}

TestInteger不是線程安全的,因爲getset方法都是在沒有同步的情況下進行的。如果線程1調用了set方法,那麼正在調用的get的線程2可能會看到更新後的value值,也可能看不到

解決方法很簡單,將value聲明爲volatile變量

private volatile int value;

volatile的特殊規則就是:

  • read、load、use動作必須連續出現
  • assign、store、write動作必須連續出現

所以,使用volatile變量能夠保證:

  • 每次讀取前必須先從主內存刷新最新的值。
  • 每次寫入後必須立即同步回主內存當中。

也就是說,volatile關鍵字修飾的變量看到的隨時是自己的最新值。線程1中對變量v的最新修改,對線程2是可見的。

12.Tomcat的結構是什麼,數據量大瞭如何優化

 

13.Jdk線程類型

 

Hashmap  hashTable區別   currentHashMap如何保證同步,數據不重複

集合

Hashset可以存空值嗎

Spring bean 是單例的嗎?  默認單例  可以修改

隊列queen和棧stack

Aop場景?slf4j  事務 Transactional

Feign是什麼?如何使用?

Redis部署單機  集羣  哨兵模式的區別

性能優化  如 查垃圾收集情況得命令

項目管理理論  敏捷開發等

 

Mysql 主鍵和唯一索引的區別?

主鍵是一種約束,唯一索引是一種索引,兩者在本質上是不同的。

主鍵創建後一定包含一個唯一性索引,唯一性索引並不一定就是主鍵。

唯一性索引列允許空值,而主鍵列不允許爲空值。

主鍵列在創建時,已經默認爲非空值 + 唯一索引了。

主鍵可以被其他表引用爲外鍵,而唯一索引不能。

一個表最多隻能創建一個主鍵,但可以創建多個唯一索引。

主鍵和唯一索引都可以有多列。

主鍵更適合那些不容易更改的唯一標識,如自動遞增列、身份證號等。

在 RBO 模式下,主鍵的執行計劃優先級要高於唯一索引。 兩者可以提高查詢的速度。

 

索引的類型?

普通索引、唯一索引、全文索引

 


1.字符串截取用什麼方法

2.查找一個字符串中字符的位置用什麼方法

3.想要獲取一個字符串中的一個單詞 (這個單詞有可能不在字符串中)

4.詳細描述下list

5.什麼是事務,怎麼利用事務

6.簡述下重載與重寫的區別,兩者父類與子類的返回值要求相同嗎?

7.現場給我出了一個數據庫題目,一個表,是描述奧運會中每個國家每個項目所獲得的獎牌數,求每個國家所獲得獎牌總數

8.簡述下三大框架

9.描述你所做過的項目,談談其中所包含的技術

 貓跡商城:使用了springmvc框架,mybatis作爲數據持久化的中間件,mysql做數據庫,redis作爲分佈式緩存。

 一物一碼營銷系統:使用springboot框架,微服務思想,多模塊開發,mybatis-plus工具,mysql數據庫,redis做緩存。部分功能採用多線程開發,提高生產效率

 招商證券案例管理系統:非開源微服務架構,

中信銀行-動卡空間-積分遊戲:採用springboot框架,mybatis作爲中間件,mysql數據庫,redis緩存,接入eureka服務註冊中心,kafka分佈式消息訂閱與發佈系統,開發時保證業務代碼的行覆蓋率不低於85%,並編寫單元測試。

10.怎麼更改oracle字符集

11.數據庫怎麼優化查詢

12.數據結構有哪些算法

13.什麼是存儲過程,簡述下存儲過程與函數的區別

14.什麼是遊標

面向對象是什麼 有什麼用途 封裝的用途

數據庫事務的四大特性是什麼  以及什麼是隔離性

事務的四大特性(ACID)

 

如果一個數據庫聲稱支持事務的操作,那麼該數據庫必須要具備以下四個特性:

1、原子性(Atomicity)

原子性是指事務包含的所有操作要麼全部成功,要麼全部失敗回滾,因此事務的操作如果成功就必須要完全應用到數據庫,如果操作失敗則不能對數據庫有任何影響。

2、一致性(Consistency)

一致性是指事務必須使數據庫從一個一致性狀態變換到另一個一致性狀態,也就是說一個事務執行之前和執行之後都必須處於一致性狀態。拿轉賬來說,假設用戶A和用戶B兩者的錢加起來一共是5000,那麼不管A和B之間如何轉賬,轉幾次賬,事務結束後兩個用戶的錢相加起來應該還得是5000,這就是事務的一致性。

3、隔離性(Isolation)

隔離性是當多個用戶併發訪問數據庫時,比如操作同一張表時,數據庫爲每一個用戶開啓的事務,不能被其他事務的操作所幹擾,多個併發事務之間要相互隔離。

  即要達到這麼一種效果:對於任意兩個併發的事務T1和T2,在事務T1看來,T2要麼在T1開始之前就已經結束,要麼在T1結束之後纔開始,這樣每個事務都感覺不到有其他事務在併發地執行。

4、持久性(Durability)

 

  持久性是指一個事務一旦被提交了,那麼對數據庫中的數據的改變就是永久性的,即便是在數據庫系統遇到故障的情況下也不會丟失提交事務的操作。

  例如我們在使用JDBC操作數據庫時,在提交事務方法後,提示用戶事務操作完成,當我們程序執行完成直到看到提示後,就可以認定事務以及正確提交,

即使這時候數據庫出現了問題,也必須要將我們的事務完全執行完成,否則就會造成我們看到提示事務處理完畢,但是數據庫因爲故障而沒有執行事務的重大錯誤。

事務的隔離級別(默認事務級別爲可重複讀)數據庫事務無非就兩種:讀取事務(select)、修改事務(update,insert)修改時允許修改(丟失更新)
B) 修改時允許讀取(髒讀)
C) 讀取時允許修改(不可重複讀)
D) 讀取時允許插入(幻讀)
從上到下問題越來越不嚴重,但所需的性能開銷卻越大。

髒讀
  髒讀是指在一個事務處理過程裏讀取了另一個未提交的事務中的數據。

不可重複讀
  不可重複讀是指在對於數據庫中的某個數據,一個事務範圍內多次查詢卻返回了不同的數據值,這是由於在查詢間隔,被另一個事務修改並提交了。

虛讀(幻讀)
  幻讀是事務非獨立執行時發生的一種現象。

低級別的隔離級一般支持更高的併發處理,並擁有更低的系統開銷。

MySQL數據庫的四種事務隔離級別

Read Uncommitted(讀取未提交內容)

 

       在該隔離級別,所有事務都可以看到其他未提交事務的執行結果。本隔離級別很少用於實際應用,因爲它的性能也不比其他級別好多少。讀取未提交的數據,也被稱之爲髒讀(Dirty Read);

Read Committed(讀取提交內容)

       這是大多數數據庫系統的默認隔離級別(但不是MySQL默認的)。它滿足了隔離的簡單定義:一個事務只能看見已經提交事務所做的改變。這種隔離級別 也支持所謂的不可重複讀(Nonrepeatable Read),因爲同一事務的其他實例在該實例處理其間可能會有新的commit,所以同一select可能返回不同結果;

Repeatable Read(可重讀)

       這是MySQL的默認事務隔離級別,它確保同一事務的多個實例在併發讀取數據時,會看到同樣的數據行。不過理論上,這會導致另一個棘手的問題:幻讀 (Phantom Read)。

       簡單的說,幻讀指當用戶讀取某一範圍的數據行時,另一個事務又在該範圍內插入了新行,當用戶再讀取該範圍的數據行時,會發現有新的“幻影” 行。

       InnoDB和Falcon存儲引擎通過多版本併發控制(MVCC,Multiversion Concurrency Control)機制解決了該問題

Serializable(可串行化)

       這是最高的隔離級別,它通過強制事務排序,使之不可能相互衝突,從而解決幻讀問題。簡言之,它是在每個讀的數據行上加上共享鎖。在這個級別,可能導致大量的超時現象和鎖競爭。

         這四種隔離級別採取不同的鎖類型來實現,若讀取的是同一個數據的話,就容易發生問題。例如:

 

         髒讀(Drity Read):某個事務已更新一份數據,另一個事務在此時讀取了同一份數據,由於某些原因,前一個RollBack了操作,則後一個事務所讀取的數據就會是不正確的。

         不可重複讀(Non-repeatable read):在一個事務的兩次查詢之中數據不一致,這可能是兩次查詢過程中間插入了一個事務更新的原有的數據。

         幻讀(Phantom Read):在一個事務的兩次查詢中數據筆數不一致,例如有一個事務查詢了幾列(Row)數據,而另一個事務卻在此時插入了新的幾列數據,先前的事務在接下來的查詢中,就會發現有幾列數據是它先前所沒有的。

         在MySQL中,實現了這四種隔離級別,分別有可能產生問題如下所示:

        

         20151219142625513.jpg (838Ã267)

  ① Serializable (串行化):可避免髒讀、不可重複讀、幻讀的發生。

  ② Repeatable read (可重複讀):可避免髒讀、不可重複讀的發生。

  ③ Read committed (讀已提交):可避免髒讀的發生。

  ④ Read uncommitted (讀未提交):最低級別,任何情況都無法保證。

 

  以上四種隔離級別最高的是Serializable級別,最低的是Read uncommitted級別,當然級別越高,執行效率就越低。像Serializable這樣的級別,就是以鎖表的方式(類似於Java多線程中的鎖)使得其他的線程只能在鎖外等待,所以平時選用何種隔離級別應該根據實際情況。在MySQL數據庫中默認的隔離級別爲Repeatable read (可重複讀)。

  在MySQL數據庫中,支持上面四種隔離級別,默認的爲Repeatable read (可重複讀);而在Oracle數據庫中,只支持Serializable (串行化)級別和Read committed (讀已提交)這兩種級別,其中默認的爲Read committed級別。

 

 

問了一個數據庫的查詢語句 怎麼查出數據庫中兩條完全相同的數據(select * from noid a group by id,name,age having count(*)>0  這樣應該可以吧... 當時沒想出來)

數據庫鎖

列舉幾個複雜度nlogn的排序算法:歸併排序—遞歸法實現

怎麼用Java實現一個棧的操作 棧:後進先出集合

什麼是方法重寫 什麼是方法重載

什麼是多態 怎麼實現

 

多線程,線程鎖 sleep和wait區別 同步方法

這兩個方法來自不同的類分別是,sleep來自Thread類,和wait來自Object類。

sleep是Thread的靜態類方法,誰調用的誰去睡覺,即使在a線程裏調用了b的sleep方法,實際上還是a去睡覺,要讓b線程睡覺要在b的代碼中調用sleep。最主要是sleep方法沒有釋放鎖,而wait方法釋放了鎖,使得其他線程可以使用同步控制塊或者方法。

sleep不出讓系統資源;wait是進入線程等待池等待,出讓系統資源,其他線程可以佔用CPU。一般wait不會加時間限制,因爲如果wait線程的運行資源不夠,再出來也沒用,要等待其他線程調用notify/notifyAll喚醒等待池中的所有線程,纔會進入就緒隊列等待OS分配系統資源。sleep(milliseconds)可以用時間指定使它自動喚醒過來,如果時間不到只能調用interrupt()強行打斷。

 

Spring的常用註解 列舉 以及@controller 和 @service的區別

事務的註解使用

Springmvc常用的註解 列舉

實習項目用到的框架,語言

1.java基本類型

2.int byte short 長度

3.字節和位的關係

4.哈希碰撞,有沒有其他解決哈希碰撞的原理【沒有,我就給說了一下HashMap解決哈希碰撞的方法】

5.冪等性

6.ArrayList LinkList的時間複雜度

7.數據庫【剛要問,因爲我們數據庫數據比較少又是JPA,也沒有涉及SQL優化,所以也沒有怎麼聊】

8.數據庫ACID

9.幻讀怎麼回事

10.SpringMVC怎麼返回實體類【當然是json】

11.SpringMVC處理流程

12.只接收GET請求,怎麼辦

13.講彈性EIP項目

14.講敏感詞引擎項目

15.共享帶寬項目

16.JAVA 8新特性,隨便手寫一個Lamda表達式

 


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章