java面试题大合集(开发者必看二)
前言
本文來自百度網絡的一篇文章,由于沒有答案,現在整理了一些比較好的回答和好的博客,可以自己擴展思路,如果大家有一下面試題的更好的答案,歡迎在評論區留言。以上全部來自網絡!此外,我的微信公眾號將每日分享下面面試題相關的知識點總結干貨,歡迎關注微信公眾號:好好學java!
文章推薦
精選java等全套學習資源
精選java電子圖書資源
精選大數據學習資源
java項目練習精選
知識面
1、解釋什么是 MESI 協議(緩存一致性)
參考:http://blog.csdn.net/zxp_cpinfo/article/details/53523697
2、談談 reactor 模型
參考:https://www.jianshu.com/p/2461535c38f3
3、Java 9 帶來了怎樣的新功能
參考:http://blog.csdn.net/u013322876/article/details/76610029
4、Java 與 C++ 對比,C++ 或 Java 中的異常處理機制的簡單原理和應用
參考:http://blog.sina.com.cn/s/blog_c065adec0101eu98.html
5、簡單講講 Tomcat 結構,以及其類加載器流程
參考:http://blog.csdn.net/lai1365266/article/details/45271985
6、虛擬內存是什么
參考:http://blog.csdn.net/guoweimelon/article/details/50849710
7、闡述下 SOLID 原則
參考:https://www.cnblogs.com/OceanEyes/p/overview-of-solid-principles.html
8、請簡要講一下你對測試驅動開發(TDD)的認識
參考:https://www.cnblogs.com/OlderBird/p/4322925.html
9、CDN實現原理
參考:https://www.cnblogs.com/losbyday/p/5843960.html
10、Maven 和 ANT 有什么區別
參考:http://blog.csdn.net/yangkai_hudong/article/details/12554983
11、UML中有哪些常用的圖
參考:http://blog.csdn.net/suxinpingtao51/article/details/8011335
Linux
1、Linux 下 IO 模型有幾種,各自的含義是什么。
參考:http://www.jb51.net/article/94783.htm
2、Linux 系統下你關注過哪些內核參數,說說你知道的
參考:http://www.jb51.net/LINUXjishu/335549.html
3、Linux 下用一行命令查看文件的最后五行
cat filename | tail -n +3000 | head -n 10004、平時用到哪些 Linux 命令
參考:https://www.cnblogs.com/bugutian/p/4528650.html
5、用一行命令輸出正在運行的 Java 進程
參考:https://www.cnblogs.com/bugutian/p/4528650.html
6、使用什么命令來確定是否有 Tomcat 實例運行在機器上
7、什么是 N+1 難題
參考:https://www.cnblogs.com/yzlpersonal/p/5077392.html
8、什么是 paxos 算法
參考:http://blog.csdn.net/21aspnet/article/details/50700123
9、什么是 restful,講講你理解的 restful
參考:http://www.ruanyifeng.com/blog/2011/09/restful.html
10、什么是 zab 協議
參考:https://www.cnblogs.com/jian-xiao/p/5821675.html
11、什么是領域模型(domain model)?貧血模型(anaemic domain model) 和充血模型(rich domain model)有什么區別
參考:https://www.cnblogs.com/feng9exe/p/5611992.html
12、什么是領域驅動開發(Domain Driven Development)
參考:http://blog.csdn.net/johnstrive/article/details/16805121
13、介紹一下了解的 Java 領域的 Web Service 框架
參考:http://blog.csdn.net/apicescn/article/details/42965785/
14、Web Server、Web Container 與 Application Server 的區別是什么
參考:https://www.cnblogs.com/vipyoumay/p/5853694.html
15、微服務(MicroServices)與巨石型應用(Monolithic Applications)之間的區別在哪里
16、描述 Cookie 和 Session 的作用,區別和各自的應用范圍,Session工作原理
參考:http://blog.csdn.net/yanghaitao_1990/article/details/51723066
17、你常用的持續集成(Continuous Integration)、靜態代碼分析(Static Code Analysis)工具有哪些
18、簡述下數據庫正則化(Normalizations)
19、KISS,DRY,YAGNI 等原則是什么含義
參考:http://blog.csdn.net/zj_show/article/details/8078447
20、分布式事務的原理,優缺點,如何使用分布式事務?
參考:http://blog.csdn.net/a291382932/article/details/52567094
21、布式集群下如何做到唯一序列號
參考:https://www.cnblogs.com/yelongsan/p/6306418.html
網絡
1、HTTPS 的加密方式是什么,講講整個加密解密流程
參考:http://blog.csdn.net/shw372029857/article/details/52687906
2、HTTPS和HTTP的區別
參考:https://www.cnblogs.com/wqhwe/p/5407468.html
3、HTTP連接池實現原理
參考:https://www.cnblogs.com/likaitai/p/5431246.html
4、HTTP集群方案
參考:http://aokunsang.iteye.com/blog/2053719
5、Nginx、lighttpd、Apache三大主流 Web服務器的區別
參考:http://blog.csdn.net/u013404872/article/details/70799420
6、是否看過框架的一些代碼
7、持久層設計要考慮的問題有哪些?你用過的持久層框架有哪些
所謂"持久"就是將數據保存到可掉電式存儲設備中以便今后使用,簡單的說,就是將內存中的數據保存到關系型數據庫、文件系統、消息隊列等提供持久化支持的設備中。持久層就是系統中專注于實現數據持久化的相對獨立的層面。
持久層設計的目標包括:
數據存儲邏輯的分離,提供抽象化的數據訪問接口。
數據訪問底層實現的分離,可以在不修改代碼的情況下切換底層實現。
資源管理和調度的分離,在數據訪問層實現統一的資源調度(如緩存機制)。
數據抽象,提供更面向對象的數據操作。
持久層框架有:
Hibernate
MyBatis
TopLink
Guzz
jOOQ
Spring Data
ActiveJDBC
8、數值提升是什么
參考:http://blog.csdn.net/yangcheng33/article/details/76408580
9、你能解釋一下里氏替換原則嗎
參考:http://blog.csdn.net/xingyunlost/article/details/53169283
10、你是如何測試一個應用的?知道哪些測試框架
參考:https://www.cnblogs.com/fnng/p/3653793.html
11、傳輸層常見編程協議有哪些?并說出各自的特點
傳輸層位于OSI七層網絡模型中的第四層,協議有TCP · UDP · TLS · DCCP · SCTP ·RSVP · PPTP。OSI(Open System Interconnection,開放系統互連)七層網絡模型稱為開放式系統互聯參考模型 ,是一個邏輯上的定義,一個規范,它把網絡從邏輯上分為了7層。每一層都有相關、相對應的物理設備,比如路由器,交換機。建立七層模型的主要目的是為解決異種網絡互連時所遇到的兼容性問題,其最主要的功能就是幫助不同類型的主機實現數據傳輸。它的最大優點是將服務、接口和協議這三個概念明確地區分開來,通過七個層次化的結構模型使不同的系統不同的網絡之間實現可靠的通訊。
編程題
計算加班費
加班10小時以下加班費是時薪的1.5倍。加班10小時或以上,按4元/時算。提示:(一個月工作26天,一天正常工作8小時)
1、計算1000月薪,加班9小時的加班費
2、計算2500月薪,加班11小時的加班費
3、計算1000月薪,加班15小時的加班費
賣東西
一家商場有紅蘋果和青蘋果出售。(紅蘋果5元/個,青蘋果4元/個)。
1、模擬一個進貨。紅蘋果跟青蘋果各進200個。
2、模擬一個出售。紅蘋果跟青蘋果各買出10個。每賣出一個蘋果需要進行統計。
提示:一個蘋果是一個單獨的實體。
日期提取
有這樣一個時間字符串:2008-8-8 20:08:08 , 請編寫能夠匹配它的正則表達式,并編寫Java代碼將日期后面的時分秒提取出來,即:20:08:08
線程
1、設計4個線程,其中兩個線程每次對j增加1,另外兩個線程對j每次減少1。寫出程序。
2、用Java寫一個多線程程序,如寫四個線程,二個加1,二個對一個變量減一,輸出
3、wait-notify 寫一段代碼來解決生產者-消費者問題
數字
1、判斷101-200之間有多少個素數,并輸出所有素數
package C; public class Sushu {public static void main(String[] args) {int sum=0;for (int i = 101; i < 201; i++) {for (int j = 2; j <=i; j++){if(j==i){System.out.println(j);}else if(i%j==0){sum++;break;}}}System.out.println("總共有"+(100-sum)+"個素數");} }2、用最有效率的方法算出2乘以17等于多少
17>>13、有 1 億個數字,其中有 2 個是重復的,快速找到它,時間和空間要最優
4、2 億個隨機生成的無序整數,找出中間大小的值
public class Test2 { public static void main(String [] srgs) { int i=(int)(Math.random()*900)+100; //int i= new java.util.Random().nextInt(900)+100;也可以 System.out.println(i); } }5、10 億個數字里里面找最小的 10 個
package com.yuzhiyun; import java.util.Arrays; /*** 求一億個數里面最小的10個數* 首先建立節點個數為10的最大堆,然后考慮每一個新的值,讓他和堆頂比較,比堆頂大的元素直接拋棄,如果比堆頂小的數字,讓他替換堆頂,然后調整堆。*/ public class MaxTenNumber {public static void main(String[] args) {/**第一個元素0不參與,只是用于占位置,這樣的話,只要array[k]>array[2k] && array[k]>array[2k+1]那就是最大堆了,* 此外,這里暫時用20個數代替1億個*/int[] array={0,1,2,3,4,7,8,9,10,11,12,13,14,15,16,17,18,19,20,6,5};//建立建立節點個數為10的最大堆for(int i=10/2;i>=1;i--){adjustHeap(array, i, 10);}//System.out.println(Arrays.toString(array));for(int i=11;i<array.length;i++){//如果這個元素小于堆頂,和堆頂交換,然后重新調整堆if(array[i]<array[1]){swap(array, i, 1);adjustHeap(array, 1, 10);}}System.out.println(Arrays.toString(array));System.out.println("最小的10個數字為:");for(int i=1;i<=10;i++){System.out.print(array[i]+" ");}}/*** 交換* @param array* @param i* @param j*/private static void swap(int[] array, int i, int j) {int tem=array[i];array[i]=array[j];array[j]=tem;}/*** 在以array[head]為根的左右子樹是最大堆的前提下把以array[head]為根的樹調整為最大堆* @param array* @param head* @param tail*/static void adjustHeap(int[] array,int head,int tail){int root=array[head];int i=2*head;while(i<=tail){int max=array[i];if(i+1<=tail)if(array[i+1]>array[i]){max=array[i+1];i++;}if(root>max)//別手抖寫成了return;break;else{array[i/2]=array[i]; ? ? ? ?}i*=2;}array[i/2]=root;} }6、1到1億的自然數,求所有數的拆分后的數字之和,如286 拆分成2、8、6,如1到11拆分后的數字之和 => 1 + … + 9 + 1 + 0 + 1 + 1
7、一個數如果恰好等于它的因子之和,這個數就稱為 “完數“。例如6=1+2+3.編程 找出1000以內的所有完數
package a; public class Wanshu {public static void main(String[] args) {for (int i = 1; i <= 1000; i++){int sum=0;for (int j = 1; j < i; j++){if(i%j==0){sum+=j;}}if(i==sum){System.out.println(i);}}} }8、一個數組中所有的元素都出現了三次,只有一個元素出現了一次找到這個元素
? ?int singleNumber(int A[], int n) { ?int result=0; ?for(int i=0;i<32;i++){ ?int bit=0; ?for(int j=0;j<n;j++){ ?bit+=(A[j]>>i)&1; ?} ?result |= (bit%3)<<i; ?} ?return result; ?} ?9、一球從100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在 第10次落地時,共經過多少米?第10次反彈多高?
package lianxi; public class Qiu {public static void main(String[] args) {double sum1 = 0, sum2 = 0, hight = 100.0;for (int i = 0; i < 10; i++){sum1 = sum1 + hight;// 顯示了一下高度的變化// System.out.print(hight);hight = hight / 2;// System.out.print(" "+hight);//System.out.println();if (i < 9){sum2 = sum2 + hight;}}System.out.println("第10次落地時,共經過" + (sum1 + sum2) + "米");System.out.println("第十次反彈高度為" + hight + "米");} }10、求100-1000內質數的和
public class TestZhiShu { public static void main(String[] args) {/*** 求100-1000之內的質數的數量*/int count=0;for (int i = 102; i <= 1000; i++) { // 質數for (int k = 2; k <= i; k++) { // 除數// 排除所有在 i=k 之前 能被k整除(余數為0)的數if (i % k == 0 && i != k) {break;}// 輸出所有在 i=k 且 i%k=0的數if (i % k == 0 && i == k) {//System.out.println(i);count++;}}}System.out.println(count);}}11、求1到100的和的平均數
12、求s=a+a+aaa+aaaa+aa…a的值,其中a是一個數字。例如2+22+222+2222+22222(此時共有5個數相加),幾個數相加有鍵盤控制。 求出1到100的和
package com.liron.p1; import java.io.IOException; import java.util.Scanner; /*** 求s=a+aa+aaa+aaaa+aa...a的值,其中a是一個數字。* 例如2+22+222+2222+22222(此時共有5個數相加),幾個數相* 加有鍵盤控制。*/ public class Topic18 {public static void main(String[] args) throws IOException ?{ ?Scanner sc = new Scanner(System.in);System.out.println("用哪個數循環?:");int _temp = sc.nextInt(); ?System.out.println("循環相加多少次?:");int temp = sc.nextInt();int newNumber = 0; // 每次生成的新數 ?int total = 0; // 計算結果 ?for (int i = 0; i < temp; i++) ?{ ?newNumber = newNumber * 10 + _temp; ?System.out.println(newNumber); ?total = total + newNumber; ?} ?System.out.println("計算結果:" + total); ?} }13、算出1到40的質數,放進數組里
① 顯示放組里的數
② 找出第[5]個數
③ 刪除第[9]個數,再顯示刪除后的第[9]個
14、有 3n+1 個數字,其中 3n 個中是重復的,只有 1 個是不重復的,怎么找出來。
15、有一組數1.1.2.3.5.8.13.21.34。寫出程序隨便輸入一個數就能給出和前一組數字同規律的頭5個數
16、計算指定數字的階乘
public class CalculatingFactorial {public static void main(String args[]) {for (int counter = 0; counter <= 10; counter++) {System.out.printf("%d! = %d\n", counter, factorial(counter));}}public static long factorial(long number) {if (number <= 1)return 1;elsereturn number * factorial(number - 1);} }17、開發 Fizz Buzz
參考:https://www.cnblogs.com/webary/p/6507413.html
18、給定一個包含 N 個整數的數組,找出丟失的整數
? ?import java.util.*; ?public class Finder { ?public int findMissing(int[][] numbers, int n) { ?// write code here ?int i = 0; ?for(i=0; i<n; ++i){ ?if(i%2!=numbers[i][0]){ ?break; ?} ?} ?return i; ?} ?} ?19、一個排好序的數組,找出兩數之和為m的所有組合
? ? public static void main(String[] args) throws UnsupportedEncodingException { ?int[] ints = { 1, 3, 10, 12 , 13, 18, 22 ,58 }; ?int find = 23; ?int start = 0; ?int end = ints.length - 1; ?while (ints[start] >= find) { ?System.out.println("都比他-------------------------------大哦!"); ?return; ?} ?while (end > start) { ?if (ints[start] + ints[end] == find) { ?System.out.println(ints[start] + " + " + ints[end] + " = " ?+ find); ?end--; ?start++; ?} else if (ints[start] + ints[end] < find) { ?start++; ?} else if (ints[start] + ints[end] > find) { ?end--; ?} ?System.out.println(start +" ? "+end); ?} ?} ?20、將一個正整數分解質因數。例如:輸入90,打印出90=233*5。
? ?//【程序4】FenJie.java 題目:將一個正整數分解質因數。例如:輸入90,打印出90=2*3*3*5。 ?程序分析:對n進行分解質因數, ?//應先找到一個最小的質數k,然后按下述步驟完成: ?(1)如果這個質數恰等于n,則說明分解質因數的過程已經結束,打印出即可。 ?//(2)如果n<>k,但n能被k整除,則應打印出k的值,并用n除以k的商,作為新的正整數n,重復執行第一步。 ? //(3)如果n不能被k整除,則用k+1作為k的值,重復執行第一步。 ?//任何一個正整數都可以分解為其由多個質數相乘。。 ?import java.io.*; ?import java.util.*; ?public class FenJieApp { ?/** * @param args */ ?public static void main(String[] args) { ?// TODO Auto-generated method stub ?System.out.println("請輸入數字:"); ?Scanner scanner = new Scanner(System.in); ?int parm=scanner.nextInt(); ?System.out.print(parm+"="); ?for(int i=2;i<=parm;i++) ?{ ?while(parm!=i) ?{ ?if(parm%i==0) ?{ ? System.out.print(i+"*"); ?parm=parm/i; ?} ?else ?break; ?} ?} ?System.out.print(parm); ?} ?} ?21、打印出所有的 “水仙花數 “,所謂 “水仙花數 “是指一個三位數,其各位數字立方和等于該數本身。例如:153是一個 “水仙花數 “,因為153=1的三次方+5的三次方+3的三次方
package com.hanqi; public class Text4 {public static void main(String[] args) {for (int num=100;num<1000;num++){int gw=num%10;int sw=num/10%10;int bw=num/100%10;if (gw*gw*gw+sw*sw*sw+bw*bw*bw==num){System.out.println(num);}}} }22、原地交換兩個變量的值
參考:https://www.cnblogs.com/Brad-Lee/p/5808299.html
23、找出4字節整數的中位數
參考:http://blog.csdn.net/randyjiawenjie/article/details/6968591
24、找到整數的平方根
參考:https://www.cnblogs.com/Matrix_Yao/archive/2009/07/28/1532883.html
25、實現斐波那契
參考:http://blog.csdn.net/duhacker/article/details/48295807
文章有不當之處,歡迎指正,同時也歡迎在評論區給你的漂亮的答案,你也可以關注我的微信公眾號:好好學java,每日更新知識點總結干貨。
總結
以上是生活随笔為你收集整理的java面试题大合集(开发者必看二)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java基础(三) 加强型for循环与I
- 下一篇: ArrayList深入解析,看这篇就够了