你离BAT之间,只差这一套Java面试题

最近,各大公司开始了春招,很多人已经开始在准备面试了,特地来总结下初中级程序员应该掌握的面试题目。这篇面试指南,只适用于初中级程序员,其中不涉及分布式等问题。关于中高级的程序员问题,我后面可能再出一篇文章。

对于一个初中级程序员来说,面试问题不仅仅涉及到Java语言,还会包括很多其他知识,比如计算机基础知识(数据结构、计算机网络、操作系统等)、C语言基础、Java底层知识以及一些框架相关知识等。本文几乎覆盖到了所有领域。

  1. 计算机基础知识
  2. C语言基础
  3. Java基础
  4. Java高级
  5. Java Web
  6. 设计模式
  7. 知识的综合能力
  8. 工具使用
  9. 项目相关
  10. 技术热情
  11. 表达能力
  12. 思考方式
  13. 其他
  14. 推荐阅读

还有,我知道很多人会问关于这些题目的答案问题。答案我都有,由于篇幅有限没办法直接贴上来。这些题目的答案我会在我的公众号及知识星球中给出,感谢关注。

为了方便,我把他们分了类,有一些是必看的,我用标注,有一些进阶型的我用标注,有一些需要了解的,我用标注。

void byte int long char short float double String StringBuffer StringBuilder Array Collection Collections List ArrayList LinkedList Vector Set HashMap TreeMap LinkedHashMap ConcerrentHashMap Set TreeMap HashMap synchronized volatile transient implements extends public private protected this super static final const run start thread enmu stack queue list heap throw throws try catch finally break continue instanceof

1、什么是队列、栈、链表

2、什么是树(平衡树,排序树,B树,B+树,R树,红黑树)、堆(大根堆、小根堆)、图(有向图、无向图、拓扑)

3、栈和队列的相同和不同之处

4、栈通常采用的两种存储结构

5、两个栈实现队列,和两个队列实现栈

1、排序都有哪几种方法?

2、会写常用的排序算法,如快排,归并等。

3、各种排序算法的时间复杂度稳定性 ,重点快排。

4、单链表的遍历和逆序

5、深度优先搜索广度优先搜索

6、最小生成树

7、常见Hash算法,哈希的原理和代价

8、全排列、贪心算法、KMP算法、hash算法

9、一致性Hash算法

1、虚拟内存管理

2、换页算法

3、进程间通信

4、进程同步:生产者消费者问题、哲学家就餐问题、读者写者问题

5、死锁的四个必要条件,避免方法

6、Linux的一些基本命令,如lstailchmod

1、tcp,udp区别

2、HTTP请求和响应的全过程

3、HTTP常见响应码:200、301、302、404、500

4、get和post的区别

5、forward和redirect的区别

6、osi七层模型

7、tcp/ip四层模型及原理

8、TCP和UDP区别

9、TCP的三次握手,四次关闭

10、丢包,粘包,

11、容量控制,拥塞控制

12、子网划分

13、IPV4和IPV6

14、HTTPS和HTTP/2

1、范式

2、数据库事务和隔离级别

3、为什么需要锁,锁定分类,锁粒度

4、乐观锁悲观锁的概念及实现方式

5、分页如何实现(OracleMySql

6、Mysql引擎

7、MYSQL语句优化

8、从一张大表读取数据,如何解决性能问题

9、内连接左连接右连接作用及区别

10、StatementPreparedStatement之间的区别

11、索引以及索引的实现(B+树介绍、和B树、R树区别

12、什么是数据库连接池

1、海量日志数据,如何提取出某日访问淘宝次数最多的IP

2、上亿数据,统计其中出现次数最多的前N个数据

3、5亿个int,找出他们的中位数

4、两个文件,各存放50亿条URL,每个URL占64字节。内存限制是4G,找出两个文件中相同的URL

5、有40亿个不重复的unsigned int的整数,没排过序,现在给一个数,如何快速判断这个数是否在这40亿个数当中。

6、提示:分治、Hash映射、堆排序、双层桶划分、Bloom filter、bitmap、数据库索引、mapreduce

1、构造函数和析构函数

2、为什么不要在构造器中调用虚函数

3、为什么不要在析构函数中抛出异常

1、面向对象的三大基本特征,五大基本原则

2、C++继承的内存布局

3、C++多态的实现机制

4、new/deletr和malloc/free的区别

1、为什么使用补码

2、C语言中的内存泄漏

3、进制转换

4、自己编写strlen/strcpy/strcmp

5、C、C++以及Java之间的区别和各自优缺点

1、Java中实现多态的机制是什么,动态多态和静态多态的区别

2、接口和抽象类的区别,如何选择

3、Java能不能多继承,可不可以多实现

4、Static Nested ClassInner Class的不同

5、重载和重写的区别。

6、是否可以继承String

7、构造器是否可被override?

8、public,protected,private的区别?

1、列举几个Java中Collection类库中的常用类

2、ListSetMap是否都继承自Collection接口?存储特点分别是什么?

3、ArrayListLinkedListVector之间的区别与联系

4、HashMapHashtableTreeMap以及ConcurrentHashMap的区别

5、CollectionCollections的区别

6、其他的集合类:treeset,linkedhashmap等。

1、ErrorException的区别

2、异常的类型,什么是运行时异常

3、finalfinallyfinalize的区别

4、try-catch-finally中,如果在catchreturn了,finally中的代码还会执行么,原理是什么?

5、列举3个以上的RuntimeException

6、Java中的异常处理机制的简单原理和应用

1、StringStringBufferStringBuilder的区别

2、==equals的区别

3、hashCode的作用,和equals方法的关系

4、Input/OutputStreamReader/Writer有什么区别

5、如何在字符流和字节流之间转换?

6、switch可以使用那些数据类型

7、Java的四种引用

8、序列化与反序列化

9、正则表达式

10、intInteger的区别,什么是自动装箱和自动拆箱

1、进程和线程的区别

2、并行和并发的区别和联系

3、同步与异步

4、多线程的实现方式,有什么区别

5、什么叫守护线程

6、如何停止一个线程?

7、什么是线程安全

8、synchronizedlock的区别

9、当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法?

10、启动一个线程是用run()还是start()?

12、wait和sleep的区别

13、notify和notifyAll的区别

14、线程池的作用

15、Java中线程池相关的类

1、gc的概念,如果A和B对象循环引用,是否可以被GC?

2、jvm gc如何判断对象是否需要回收,有哪几种方式?

3、Java中能不能主动触发GC

4、JVM的内存结构,堆和栈的区别

5、JVM堆的分代

6、Java中的内存溢出是什么,和内存泄露有什么关系

7、Java的类加载机制,什么是双亲委派

8、ClassLoader的类加载方式

1、NIO、AIO和BIO 之间的区别

2、IONIO常用用法

1、hashcode 有哪些算法

2、反射的基本概念,反射是否可以调用私有方法

3、Java中范型的概念

4、JVM启动参数,-Xms-Xmx

5、代理机制的实现

6、String s = new String("s"),创建了几个对象。

1、JSPServlet的区别,Servelt的概念。

2、Servlet的生命周期

3、Servlet中的session工作原理 ,以及设置过期时间的方式

4、Servlet中,filter的应用场景有哪些?

5、JSP的动态include和静态include

6、web.xml中常用配置及作用

7、Servlet的线程安全问题

1、介绍几个常用的MVC框架

2、什么是MVC

3、Struts中请求的实现过程

4、Spring mvcStruts mvc的区别

5、Service嵌套事务处理,如何回滚

6、struts2 中拦截器与过滤器的区别及执行顺序

7、struts2拦截器的实现原理

1、sessioncookie的区别

2、HTTP请求中session实现原理?

3、如果客户端禁止Cookie能实现Session吗

4、http中 getpost区别

5、redirectforward的区别

6、常见的web请求返回的状态码。404、302、301、500分别代表什么

1、Hibernate/Ibatis/MyBatis之间的区别

2、什么是OR Mapping

3、hibernate的缓存机制、一级和二级缓存

4、使用Spring的好处是什么,Spring的核心理念

5、什么是AOPIOC,实现原理是什么

6、spring bean的初始化过程

7、Spring的事务管理Spring bean注入的几种方式

8、spring四种依赖注入方式

1、什么是web服务器、什么是应用服务器

2、常用的web服务器有哪些?

3、Tomcatweblogic的区别

1、什么是SQL注入 ,如何避免。

2、什么是XSS攻击,如何避免

3、什么是CSRF攻击,如何避免

1、Java的动态代理的概念

2、Java的动态代理的实现

1、常用的字符编码

2、如何解决中文乱码问题

1、XML的解析方式,以及优缺点。

2、什么是ajax,Ajax如何解决跨域问题

1、谈一下自己了解或者熟悉的设计模式

2、Singleton的几种实现方式,实现一个线程安全的单例。

3、工厂模式抽象工厂模式之间的区别

1、请介绍一下一个http请求的全过程,描述的越全面越好

2、当你在浏览器地址栏输入www.taobao.com,敲下回车之后都发生了什么

1、知道git/svn是干什么的吗?用过吗

2、知道maven/gradle是干什么的吗?用过吗

3、平常使用什么IDE,为什么

4、平常使用什么浏览器,为什么

5、平常开发机器是什么操作系统的

6、会在Linux上开发吗。Linux常用命令会吗

1、请简单介绍一下你的这个项目

2、你在这个项目中充当什么角色

3、这个项目的技术选型有做过么。

4、选择某项技术做过哪些调研和对比

5、这个项目中遇到的最大的问题是什么?你是如何解决的。

6、项目中是否考虑过性能、安全性等问题

1、当前Java的最新版本

2、Java8的lambda表达式

3、Java8的stream API

4、Java9的模块化

5、Java10的局部变量类型推断

6、Spring Boot2.0

7、HTTP/2

8、会FQ么,知道FQ的原理吗

9、你最近在读什么书

1、能不能简单做一个自我介绍。

2、能不能描述一下杭州给你的印象。用三句话概括一下。

1、如何估算杭州有多少软件工程师

2、你最近读过的印象最深的文章是什么

3、这篇文章中有几个观点,你最赞成哪一个,最不赞成哪一个

1、你对加班怎么看

2、你还有什么问题要问我(面试官)的么

程序员面试笔试宝典

程序员面试金典

Java编程思想

Effective Java

深入理解Java虚拟机

大话数据结构

剑指Offer

个人公众号(Java团长)

最近,我公众号的粉丝,部分拿到了阿里、京东、58等offer<,均表示这套题目覆盖率几乎可以达到80%。快来关注我的公众号吧。一起进步。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


在 Java 语言中,提高程序的执行效率有两种实现方法,一个是使用线程、另一个是使用线程池。而在生产环境下,我们通常会采用后者。为什么会这样呢?今天我们就来聊聊线程池的优点,以及池化技术及其应用。 1.池化技术 池化技术指的是提前准备一些资源,在需要时可以重复使用这些预先准备的资源。 池化技术的优点
在 Java 中停止线程的实现方法有以下 3 种: 自定义中断标识符,停止线程。 使用线程中断方法 interrupt 停止线程。 使用 stop 停止线程。 其中 stop 方法为 @Deprecated 修饰的过期方法,也就是不推荐使用的过期方法,因为 stop 方法会直接停止线程,这样就没有给
在多线程编程中,wait 方法是让当前线程进入休眠状态,直到另一个线程调用了 notify 或 notifyAll 方法之后,才能继续恢复执行。而在 Java 中,wait 和 notify/notifyAll 有着一套自己的使用格式要求,也就是在使用 wait 和 notify(notifyAll
在 Java 语言中,并发编程都是通过创建线程池来实现的,而线程池的创建方式也有很多种,每种线程池的创建方式都对应了不同的使用场景,总体来说线程池的创建可以分为以下两类: 通过 ThreadPoolExecutor 手动创建线程池。 通过 Executors 执行器自动创建线程池。 而以上两类创建线
sleep 方法和 wait 方法都是用来将线程进入休眠状态的,并且 sleep 和 wait 方法都可以响应 interrupt 中断,也就是线程在休眠的过程中,如果收到中断信号,都可以进行响应,并抛出 InterruptedException 异常。那 sleep 和 wait 的区别都有哪些呢
在 Java 中,线程的创建方法有 7 种,分为以下 3 大类: 继承 Thread 类的方式,它有 2 种实现方法。 实现 Runnable 接口的方式,它有 3 种实现方法。 实现 Callable 接口的方式,它有 2 种实现方法。 接下来我们一个一个来看。 1.继承Thread类 继承 Th
所谓的线程池的 7 大参数是指,在使用 ThreadPoolExecutor 创建线程池时所设置的 7 个参数,如以下源码所示: public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime,
在 Java 语言中,线程分为两类:用户线程和守护线程,默认情况下我们创建的线程或线程池都是用户线程,所以用户线程也被称之为普通线程。 想要查看线程到底是用户线程还是守护线程,可以通过 Thread.isDaemon() 方法来判断,如果返回的结果是 true 则为守护线程,反之则为用户线程。 我们
聊到线程池就一定会聊到线程池的执行流程,也就是当有一个任务进入线程池之后,线程池是如何执行的?我们今天就来聊聊这个话题。线程池是如何执行的?线程池的拒绝策略有哪些? 线程池执行流程 想要真正的了解线程池的执行流程,就得先从线程池的执行方法 execute() 说起,execute() 实现源码如下:
单例模式是面试中的常客了,它的常见写法有 4 种:饿汉模式、懒汉模式、静态内部类和枚举,接下来我们一一来看。 1.饿汉模式 饿汉模式也叫预加载模式,它是在类加载时直接创建并初始化单例对象,所以它并不存在线程安全的问题。它是依靠 ClassLoader 类机制,在程序启动时只加载一次,因此不存在线程安
线程安全是指某个方法或某段代码,在多线程中能够正确的执行,不会出现数据不一致或数据污染的情况,我们把这样的程序称之为线程安全的,反之则为非线程安全的。在 Java 中,解决线程安全问题有以下 3 种手段: 使用线程安全类,比如 AtomicInteger。 加锁排队执行 使用 synchronize
在 Java 语言中,保证线程安全性的主要手段是加锁,而 Java 中的锁主要有两种:synchronized 和 Lock,我们今天重点来看一下 synchronized 的几种用法。 用法简介 使用 synchronized 无需手动执行加锁和释放锁的操作,我们只需要声明 synchronize
在 Java 语言中,有两个线程池可以执行定时任务:ScheduledThreadPool 和 SingleThreadScheduledExecutor,其中 SingleThreadScheduledExecutor 可以看做是 ScheduledThreadPool 的单线程版本,它的用法和
从公平的角度来说,Java 中的锁总共可分为两类:公平锁和非公平锁。但公平锁和非公平锁有哪些区别?孰优孰劣呢?在 Java 中的应用场景又有哪些呢?接下来我们一起来看。 正文 公平锁:每个线程获取锁的顺序是按照线程访问锁的先后顺序获取的,最前面的线程总是最先获取到锁。 非公平锁:每个线程获取锁的顺序
单例模式的实现方法有很多种,如饿汉模式、懒汉模式、静态内部类和枚举等,当面试官问到“为什么单例模式一定要加 volatile?”时,那么他指的是为什么懒汉模式中的私有变量要加 volatile? 懒汉模式指的是对象的创建是懒加载的方式,并不是在程序启动时就创建对象,而是第一次被真正使用时才创建对象。
读写锁(Readers-Writer Lock)顾名思义是一把锁分为两部分:读锁和写锁,其中读锁允许多个线程同时获得,因为读操作本身是线程安全的,而写锁则是互斥锁,不允许多个线程同时获得写锁,并且写操作和读操作也是互斥的。总结来说,读写锁的特点是:读读不互斥、读写互斥、写写互斥。 1.读写锁使用 在
很多场景下,我们需要等待线程池的所有任务都执行完,然后再进行下一步操作。对于线程 Thread 来说,很好实现,加一个 join 方法就解决了,然而对于线程池的判断就比较麻烦了。 我们本文提供 4 种判断线程池任务是否执行完的方法: 使用 isTerminated 方法判断。 使用 getCompl
在 Java 中,线程池的状态和线程的状态是完全不同的,线程有 6 种状态:NEW:初始化状态、RUNNABLE:可运行/运行状态、BLOCKED:阻塞状态、WAITING:无时限等待状态、TIMED_WAITING:有时限等待状态和 TERMINATED:终止状态。而线程池的状态有以下 5 种:
volatile 是 Java 并发编程的重要组成部分,也是常见的面试题之一,它的主要作用有两个:保证内存的可见性和禁止指令重排序。下面我们具体来看这两个功能。 内存可见性 说到内存可见性问题就不得不提 Java 内存模型,Java 内存模型(Java Memory Model)简称为 JMM,主要
1.第一范式 第一范式规定表中的每个列都应该是不可分割的最小单元。比如以下表中的 address 字段就不是不可分割的最小单元,如下图所示: 其中 address 还可以拆分为国家和城市,如下图所示: 这样改造之后,上面的表就满足第一范式了。 2.第二范式 第二范式是在满足第一范式的基础上,规定表中