java面试题大合集(开发者必看二)

本人花费半年的时间总结的《Java面试指南》已拿腾讯等大厂offer,已开源在github ,欢迎star!

本文GitHub https://github.com/OUYANGSIHAI/JavaInterview 已收录,这是我花了6个月总结的一线大厂Java面试总结,本人已拿大厂offer,欢迎star

原文链接:blog.ouyangsihai.cn >> 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 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/

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>>1

3、有 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;
        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。


    //【程序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

原文地址:https://sihai.blog.csdn.net/article/details/109464701

本人花费半年的时间总结的《Java面试指南》已拿腾讯等大厂offer,已开源在github ,欢迎star!

本文GitHub https://github.com/OUYANGSIHAI/JavaInterview 已收录,这是我花了6个月总结的一线大厂Java面试总结,本人已拿大厂offer,欢迎star

原文链接:blog.ouyangsihai.cn >> java面试题大合集(开发者必看二)


 上一篇
ArrayList深入解析,看这篇就够了 ArrayList深入解析,看这篇就够了
戳上面的蓝字关注我们哦!  精彩内容    简介ArrayList 是 java 集合框架中比较常用的数据结构了。继承自 AbstractList,实现了 List 接口。底层基于数组实现容量大小动态变化。允许 null 的存在。同
2021-04-04
下一篇 
java基础(七) 深入解析java四种访问权限 java基础(七) 深入解析java四种访问权限
戳上面的蓝字关注我们哦!  精彩内容    引言  Java中的访问权限理解起来不难,但完全掌握却不容易,特别是4种访问权限并不是任何时候都可以使用。下面整理一下,在什么情况下,有哪些访问权限可以允许选择。 一、访问权限简介访问权限
2021-04-04