日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

2020Java面试题汇总(2020年负重前行的Java码畜社招遇到的Java面试题---亲历总结)

發(fā)布時(shí)間:2023/12/14 java 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 2020Java面试题汇总(2020年负重前行的Java码畜社招遇到的Java面试题---亲历总结) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

終于熬過2020,分享一下負(fù)重前行的一年遇到的Java面試題

  • 一、Java基礎(chǔ)面試
      • 1、多線程和線程池(高頻重點(diǎn)考點(diǎn)·必備技能)
      • 2、集合(常見考點(diǎn))
      • 3、其他基礎(chǔ)問題(必備基礎(chǔ))
      • 4、數(shù)據(jù)庫基礎(chǔ)
      • 5、Redis---非關(guān)系型數(shù)據(jù)庫
      • 6、Linux相關(guān)基礎(chǔ)和指令
      • 7、框架:
      • 8、前端技術(shù)
      • 9、最后

前言:今年是個(gè)不平靜的一年。博主去年臨近畢業(yè)因?yàn)楣締畏矫鏆Ъs的原因,畢業(yè)被趕出校,倉促進(jìn)了一家做人臉識別的小公司。對公司的知遇之恩其實(shí)一直銘記在心,老大人也特別好。由于開發(fā)團(tuán)隊(duì)人員較少的原因,這一年來前端后端安卓端都在寫,接觸得多、但是每個(gè)領(lǐng)域都不精。一年下來真的沒啥技術(shù)上的沉淀。更多的就是CRUD。上半年遇到疫情,下半年項(xiàng)目在手,換工作的計(jì)劃一直被拖后。現(xiàn)在手上的項(xiàng)目也馬上試點(diǎn)了,自己也在陸續(xù)投遞簡歷。嘗試新機(jī)會。才發(fā)現(xiàn)自己的技術(shù)面還是太窄了。本應(yīng)精通的后端也只會CRUD和SSM。最近也面了幾個(gè)公司。也總結(jié)了一下遇到的面試題。在這兒分享一下。

  • 因?yàn)檫€在職,要帶實(shí)習(xí)生和跟項(xiàng)目。所以也沒全身心地投入到找工作中。九月份開始陸陸續(xù)續(xù)面過一些公司,有大有小、有國企有私企,仿佛回到了去年不停去各個(gè)學(xué)校聽宣講會的秋招。由于今年行情整體不是很好,待遇好多都不怎么樣,自己滿意的人家不要我,人家要我的我又不想去。收效也甚微。最近工作也基本落實(shí)了。來跟大家分享一下這期間我遇到的一些問題吧。

  • 注: 社招不同于校招,基礎(chǔ)也會問,但大多會偏向于更深層的方向去問。博主一年多工作經(jīng)驗(yàn),投的都是一年多左右的崗位。別看我年限,我是個(gè)菜雞。以下都是我遇到的,太多了總結(jié)了一些,有的寫了沒寫。挑些重要的講一下吧!

一、Java基礎(chǔ)面試

1、多線程和線程池(高頻重點(diǎn)考點(diǎn)·必備技能)

(1)、線程的創(chuàng)建方式和生命周期

  • 一般有四種辦法:繼承Thread、實(shí)現(xiàn)Runable接口、實(shí)現(xiàn)Callable接口、線程池創(chuàng)建線程。

  • a、創(chuàng)建線程類繼承Thread,重寫run方法,然后進(jìn)行調(diào)用。

public class MyThread extends Thread {@Overridepublic void run() {for (int i = 0; i<10; i++){System.out.println("mythread線程正在執(zhí)行:"+new Date().getTime());}}}//調(diào)用MyThread thread = new MyThread();//沒有傳入?yún)?shù)thread.start();
  • b、實(shí)現(xiàn)Runable接口
public class MyRunable implements Runnable {public void run() {for (int i=0; i<10; i++){System.out.println("MyRunnable線程正在執(zhí)行:"+new Date().getTime());}}}//調(diào)用Thread thread = new Thread(new MyRunable());//注意傳入?yún)?shù)thread.start();
  • c、實(shí)現(xiàn)Callable接口
public class MyCallable implements Callable<String> {//注意泛型,傳入的類型就是call方法的返回值類型public String call() throws Exception {for (int i=0; i<10; i++){System.out.println("MyCallable正在執(zhí)行:"+new Date().getTime());}return "MyCallable執(zhí)行完畢!";}}//調(diào)用FutureTask task = new FutureTask(new MyCallable());//注意需要?jiǎng)?chuàng)建FutureTask對象,傳入Callable接口實(shí)現(xiàn)類的對象Thread thread = new Thread(task);//傳入FutureTask對象thread.start();
  • d、線程池創(chuàng)建(后面在細(xì)節(jié)講各個(gè)參數(shù))
public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue<Runnable> workQueue,ThreadFactory threadFactory,RejectedExecutionHandler handler) {}

(2)、start()和run()的區(qū)別

  • tart與run方法的主要區(qū)別在于當(dāng)程序調(diào)用start方法一個(gè)新線程將會被創(chuàng)建,并且在run方法中的代碼將會在新線程上運(yùn)行,然而在你直接調(diào)用run方法的時(shí)候,程序并不會創(chuàng)建新線程,run方法內(nèi)部的代碼將在當(dāng)前線程上運(yùn)行。

(3)、線程池的創(chuàng)建方法

  • 見第(4)題

(4)、線程池的幾個(gè)重要參數(shù)

  • 見第(5)題

(5)、各個(gè)參數(shù)值的設(shè)置有哪些講究

  • 傳送門》》》線程池的介紹《《

2、集合(常見考點(diǎn))

(1)、常見的集合list、set、map 子類介紹一下,原理、應(yīng)用場景

  • 傳送門 》》list、set、map區(qū)別和應(yīng)用場景《《

(2)、HashMap發(fā)生hash沖突是怎么解決的,1.8之后引入了什么東西解決,鏈表過長(紅黑樹)。

  • a、在java編程語言中,最基本的結(jié)構(gòu)就是兩種,一個(gè)是數(shù)組,另外一個(gè)是模擬指針(引用),所有的數(shù)據(jù)結(jié)構(gòu)都可以用這兩個(gè)基本結(jié)構(gòu)來構(gòu)造的,HashMap也不例外。HashMap實(shí)際上是一個(gè)“鏈表散列”的數(shù)據(jù)結(jié)構(gòu),即數(shù)組和鏈表的結(jié)合體。
  • b、當(dāng)我們往HashMap中put元素的時(shí)候,先根據(jù)key的hashCode重新計(jì)算hash值,根據(jù)hash值得到這個(gè)元素在數(shù)組中的位置(即下標(biāo)),如果數(shù)組該位置上已經(jīng)存放有其他元素了,那么在這個(gè)位置上的元素將以鏈表的形式存放,新加入的放在鏈頭,最先加入的放在鏈尾。如果數(shù)組該位置上沒有元素,就直接將該元素放到此數(shù)組中的該位置上。

(3)、HashMap的key存對象可以么,會出現(xiàn)什么問題

  • 這個(gè)問題博主專門搜了下,看這篇博客看懂的,可以參考下!
  • 》》傳送門《《

(4)、多線程操作ArrayList如何實(shí)現(xiàn)線程安全,那個(gè)關(guān)鍵字可以實(shí)現(xiàn)

  • a、Collections.synchronizedList(List list)

  • b、CopyOnWriteArrayList

    • Description:CopyOnWriteArrayList和Collections.synchronizedList是實(shí)現(xiàn)線程安全的列表的兩種方式。兩種實(shí)現(xiàn)方式分別針對不同情況有不同的性能表現(xiàn)。其中CopyOnWriteArrayList的寫操作性能較差,而多線程的讀操作性能較好。而Collections.synchronizedList的寫操作性能比CopyOnWriteArrayList在多線程操作的情況下要好很多,而讀操作因?yàn)槭遣捎昧藄ynchronized關(guān)鍵字的方式,其讀操作性能并不如CopyOnWriteArrayList。因此在不同的應(yīng)用場景下,應(yīng)該選擇不同的多線程安全實(shí)現(xiàn)類。

(5)、為什么get和set LinkedList會比ArrayList慢,add和remove 又更快

  • ArrayList 是一種可增長的數(shù)組的實(shí)現(xiàn)。
    使用ArrayList的優(yōu)點(diǎn)在于 對 get和set的調(diào)用是花費(fèi)常數(shù)時(shí)間。缺點(diǎn)就是有新的項(xiàng)插入,和現(xiàn)有的項(xiàng)刪除代價(jià)昂貴,除非變動是
    在ArrayList的末端進(jìn)行。

  • 使用LinkedList的優(yōu)點(diǎn)在于新的項(xiàng)的插入和現(xiàn)有的項(xiàng)的刪除開銷很小。這意味著在表的前端進(jìn)行添加和刪除都是常數(shù)時(shí)間的操作,因此LinkedList提供了addFirst,removeFirst,addLast,removeLast,以及getFirst和getLast等都有效的添加刪除和訪問。缺點(diǎn)就在于它不容易作索引的,所以get的調(diào)用是昂貴的,除非非常接近表的兩端。

(6)、HashMap ,HashTable 區(qū)別

  • HashMap和Hashtable都實(shí)現(xiàn)了Map接口,但決定用哪一個(gè)之前先要弄清楚它們之間的分別。主要的區(qū)別有:線程安全性,同步(synchronization),以及速度。

  • HashMap幾乎可以等價(jià)于Hashtable,除了HashMap是非synchronized的,并可以接受null(HashMap可以接受為null的鍵值(key)和值(value),而Hashtable則不行)。

  • HashMap是非synchronized,而Hashtable是synchronized,這意味著Hashtable是線程安全的,多個(gè)線程可以共享一個(gè)Hashtable;而如果沒有正確的同步的話,多個(gè)線程是不能共享HashMap的。Java 5提供了ConcurrentHashMap,它是HashTable的替代,比HashTable的擴(kuò)展性更好。

  • 另一個(gè)區(qū)別是HashMap的迭代器(Iterator)是fail-fast迭代器,而Hashtable的enumerator迭代器不是fail-fast的。所以當(dāng)有其它線程改變了HashMap的結(jié)構(gòu)(增加或者移除元素),將會拋出ConcurrentModificationException,但迭代器本身的remove()方法移除元素則不會拋出ConcurrentModificationException異常。但這并不是一個(gè)一定發(fā)生的行為,要看JVM。這條同樣也是Enumeration和Iterator的區(qū)別。

  • 由于Hashtable是線程安全的也是synchronized,所以在單線程環(huán)境下它比HashMap要慢。如果你不需要同步,只需要單一線程,那么使用HashMap性能要好過Hashtable。

  • HashMap不能保證隨著時(shí)間的推移Map中的元素次序是不變的。

(7)、Hashtable的優(yōu)點(diǎn)和缺點(diǎn)。升級版CurrentHashMap。二者的區(qū)別。

  • 這里直接推薦博主發(fā)現(xiàn)的一篇寶藏博客,我也是看了這篇博客后才更深入理解了幾個(gè)Map的區(qū)別的,大家可以參考下

    • 》》博客傳送門《《

(8)、講一下 HashMap 中 put 方法過程?

  • 這塊建議大家去詳細(xì)讀下HashMap的源碼,一切就會茅廁頓開了!手動滑稽~~~~

(9)、ArrayList和LinkedList的區(qū)別,各自的適用場景優(yōu)缺點(diǎn)。

  • 區(qū)別
    • ArrayList底層是用數(shù)組實(shí)現(xiàn)的,可以認(rèn)為ArrayList是一個(gè)可改變大小的數(shù)組。隨著越來越多的元素被添加到ArrayList中,其規(guī)模是動態(tài)增加的。
    • LinkedList底層是通過雙向鏈表實(shí)現(xiàn)的, LinkedList和ArrayList相比,增刪的速度較快。但是查詢和修改值的速度較慢。同時(shí),LinkedList還實(shí)現(xiàn)了Queue接口,所以他還提供了offer(),
      peek(), poll()等方法。
  • 使用場景
    • LinkedList更適合從中間插入或者刪除(鏈表的特性)。
    • ArrayList更適合檢索和在末尾插入或刪除(數(shù)組的特性)。

(10)、ArrayList在遍歷的時(shí)候是否能刪除元素,需要注意些什么

  • 遍歷的時(shí)候可以刪除元素,但是要注意手動修改一下循環(huán)變量(減1),否則會導(dǎo)致中間的某些元素錯(cuò)誤地跳過,遍歷不到。刪除一個(gè)元素(n)之后,后邊的元素會自動前移,此時(shí)第n+1個(gè)元素會移動到第n的位置,正常循環(huán)會跳過這個(gè)元素,所以就需要對下標(biāo)做-1的操作了。
  • 用迭代器迭代的時(shí)候可以刪除元素,但是只能通過迭代器來刪除,不能直接在數(shù)組上刪除,否則迭代器會拋出異常。
  • 如果有多個(gè)迭代器同時(shí)迭代的話不能刪除,否則其他迭代器同樣會拋出異常

3、其他基礎(chǔ)問題(必備基礎(chǔ))

(1)、transient關(guān)鍵字的作用

  • 對象只要實(shí)現(xiàn)了Serilizable接口,這個(gè)對象就可以被序列化,java的這種序列化模式為開發(fā)者提供了很多便利,我們可以不必關(guān)系具體序列化的過程,只要這個(gè)類實(shí)現(xiàn)了Serilizable接口,這個(gè)類的所有屬性和方法都會自動序列化。
  • 然而在實(shí)際開發(fā)過程中,我們常常會遇到這樣的問題,這個(gè)類的有些屬性需要序列化,而其他屬性不需要被序列化,打個(gè)比方,如果一個(gè)用戶有一些敏感信息(如密碼,銀行卡號等),為了安全起見,不希望在網(wǎng)絡(luò)操作(主要涉及到序列化操作,本地序列化緩存也適用)中被傳輸,這些信息對應(yīng)的變量就可以加上transient關(guān)鍵字。換句話說,這個(gè)字段的生命周期僅存于調(diào)用者的內(nèi)存中而不會寫到磁盤里持久化。
  • 總之,java 的transient關(guān)鍵字為我們提供了便利,你只需要實(shí)現(xiàn)Serilizable接口,將不需要序列化的屬性前添加關(guān)鍵字transient,序列化對象的時(shí)候,這個(gè)屬性就不會序列化到指定的目的地中。

(2)、對象序列化操作

(3)、hashCode和equals方法的關(guān)系

  • equals相等,hashcode必相等;hashcode相等,equals可能不相等。

(4)、equals和 == 的區(qū)別

(5)、Object包含有哪些方法

(6)、垃圾回收機(jī)制,如何進(jìn)行JVM調(diào)優(yōu)。

(7)、如何避免循環(huán)依賴

(8)、Lock和Synchronized的區(qū)別。

(9)、TCP三次握手四次揮手(必背題)。

(10)、描述一下Http協(xié)議從請求到響應(yīng)的整個(gè)過程。

(11)、http和https的區(qū)別。


4、數(shù)據(jù)庫基礎(chǔ)

(1)、事務(wù)的四大特性,詳細(xì)介紹并舉例

(2)、你們用的事務(wù)隔離級別是什么

(3)、#和$的區(qū)別

(4)、B+樹和B樹的區(qū)別。

(5)、你知道的數(shù)據(jù)庫引擎有哪幾個(gè),InnerDB數(shù)據(jù)庫的查詢原理。

(6)、分頁查詢、每頁占多大。

(7)、索引的使用、索引機(jī)制,最左原理。

(8)、inner join、left join、right join的區(qū)別。


5、Redis—非關(guān)系型數(shù)據(jù)庫

(1)、你所用的過期機(jī)制

(2)、什么是緩存擊穿、緩存穿透、緩存雪崩。如何避免?

(3)、Redis存儲的類型有哪些。

(4)、什么是Redis持久化?Redis有哪幾種持久化方式?優(yōu)缺點(diǎn)是什么?

(5)、redis集群了解么,說說你的理解。


6、Linux相關(guān)基礎(chǔ)和指令

(1)、常用的指令有哪些

(2)、sysctrl指令

(3)、tomcat初始內(nèi)存,如何調(diào)整

(4)、Linux如何查看系統(tǒng)日志、用什么指令。

7、框架:

(1)、說說Spring有哪些優(yōu)點(diǎn),解決了哪些問題。

(2)、DI和IOC

(3)、描述一下MVC的運(yùn)行機(jī)制和原理

(4)、Spring常用注解,舉一些

(5)、SpringBoot和SpringMVC的區(qū)別

(6)、SpringBoot的關(guān)鍵注解是哪個(gè),里面主要包含了哪些東西。

8、前端技術(shù)

  • 由于博主簡歷上還寫了了解前端和安卓,有的也問到了前端或者安卓的一些問題,也只小公司會比較喜歡全棧的吧

(1)、vue的生命周期

(2)、v-if和v-show的區(qū)別

(3)、vue構(gòu)造器是什么,有哪幾個(gè)常用掛載點(diǎn)

  • 這里再分享一下博主之前寫的一篇基礎(chǔ)面試題。有重復(fù)的濾過。

  • 》》》傳送門《《《

  • 答案太多了先發(fā)這點(diǎn)吧,等我有時(shí)間再來繼續(xù)完善!哈哈,不是我懶,最近快過年了,提前祝大家新年快樂。

9、最后

  • 博主也遇到過好幾個(gè),要求現(xiàn)場手撕代碼的。當(dāng)然都是稍大一點(diǎn)的公司。有的也會直接安排一輪筆試。有的會讓寫表結(jié)構(gòu)、根據(jù)需求寫代碼、或者直接是算法題。所以不僅理論要扎實(shí),還是要會寫代碼!在這兒也沒啥可推薦的,還是建議去牛客網(wǎng)刷一下題。

  • 加油吧,打工人。只有努力提升自己的實(shí)力。我又違背了我去年違約時(shí)候說過的話了。我還沒成為大牛、我也不夠努力 !哎~~~~~~~~

  • 最后想說的: 希望大家都能找到心儀的工作,應(yīng)屆生真的千萬千萬不要去小公司、初創(chuàng)公司。真的無論眼界、接觸到的東西、學(xué)到的東西、真的很有限很有限。舉個(gè)簡單的例子接觸不到高并發(fā)的用戶、就接觸不到性能的瓶頸、更別提對于性能的調(diào)優(yōu)。包括很多情況下的開發(fā)工作都沒有那么規(guī)范、身邊缺少優(yōu)秀的人、缺少可以學(xué)習(xí)的人。但是去了大的公司、大的平臺這些都會有。我也是最近在找工作多次碰壁以后、才深深發(fā)現(xiàn)了自己的不足何所欠缺的東西。希望后來者不要走我的老路。當(dāng)然我也是被迫的~~哎!

  • 寫的有點(diǎn)多,如有錯(cuò)誤望指正!

總結(jié)

以上是生活随笔為你收集整理的2020Java面试题汇总(2020年负重前行的Java码畜社招遇到的Java面试题---亲历总结)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。