前言
本文来自百度网络的一篇文章, 由于没有答案, 现在整理了一些比较好的回答和好的博客, 可以自己扩展思路, 如果大家有一下面试题的更好的答案, 欢迎在评论区留言以上全部来自网络! 此外, 我的微信公众号将每日分享下面面试题相关的知识点总结干货, 欢迎关注微信公众号: 好好学 java!
文章推荐
精选 java 等全套学习资源
精选 java 电子图书资源
精选大数据学习资源
java 项目练习精选
知识面
1 解释什么是 MESI 协议(缓存一致性)
参考: http://blog.csdn.net/zxp_cpinfo/article/details/53523697
2 谈谈 reactor 模型
参考: https://www.jianshu.com/p/2461535c38f3
3Java 9 带来了怎样的新功能
参考: http://blog.csdn.net/u013322876/article/details/76610029
4Java 与 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
9CDN 实现原理
参考: https://www.cnblogs.com/losbyday/p/5843960.html
10Maven 和 ANT 有什么区别
参考: http://blog.csdn.net/yangkai_hudong/article/details/12554983
11UML 中有哪些常用的图
参考: http://blog.csdn.net/suxinpingtao51/article/details/8011335
Linux
1Linux 下 IO 模型有几种, 各自的含义是什么
参考: http://www.jb51.net/article/94783.htm
2Linux 系统下你关注过哪些内核参数, 说说你知道的
参考: http://www.jb51.net/LINUXjishu/335549.html
3Linux 下用一行命令查看文件的最后五行
cat filename | tail -n +3000 | head -n 1000
4 平时用到哪些 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/
14Web ServerWeb 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)
19KISS,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
网络
1HTTPS 的加密方式是什么, 讲讲整个加密解密流程
参考: http://blog.csdn.net/shw372029857/article/details/52687906
2HTTPS 和 HTTP 的区别
参考: https://www.cnblogs.com/wqhwe/p/5407468.html
3HTTP 连接池实现原理
参考: https://www.cnblogs.com/likaitai/p/5431246.html
4HTTP 集群方案
参考: http://aokunsang.iteye.com/blog/2053719
5NginxlighttpdApache 三大主流 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 . PPTPOSI(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, 二个对一个变量减一, 输出
3wait-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>>1
3 有 1 亿个数字, 其中有 2 个是重复的, 快速找到它, 时间和空间要最优
42 亿个随机生成的无序整数, 找出中间大小的值
- 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);
- }
- }
510 亿个数字里里面找最小的 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;
- }
- }
61 到 1 亿的自然数, 求所有数的拆分后的数字之和, 如 286 拆分成 286, 如 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+aaa 的值, 其中 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;
- else
- return 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
- // 程序 4FenJie.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
来源: http://mp.weixin.qq.com/s/Pq6xhTUGECTdYQB90F4b_A