大四第一次找实习工作经历的笔试面试题合集

下面的答案有些是我回答的,有些是我没回答上来从网上找的我觉得对的,但是这里面仍然可能存在错误或者不完善的答案,如果您发现了并且愿意指正,在评论区发表评论或者发送到我的邮箱yangwanhao163@163.com

java基础:

1、StringBuilder的append()方法、StringBuffer的append()方法和+的区别:

  答:在java中,字符串连接所用的“+”会被编译成StringBuilder类的对象。如果是像String str = "abc"+"def";这样的语句,那么编译之后的语句就是String str = new StringBuilder("abc").append("def").toString();,由此可见,在简单的直接相连的情况下,StringBuilder和“+”的效率和功能是相同的。但是,如果实在循环内连加字符串的话,那么在实际编译过程中,每次循环就会创建一个新的StringBuilder对象,这样显然是效率低下的。StringBuilder和StringBuffer的功能相同,区别在于StringBuilder不是线程安全的而StringBuffer是线程安全的,因此理论上效率是StringBuilder更高。

2、为什么Java中静态方法中不可以直接使用非静态方法?

  答:类的静态成员(静态方法和静态变量)是属于类本身的,在类加载的时候就会为之分配内存且只分配这一次,可以通过类名.方法名(变量名)直接调用。类的非静态成员属于类的对象,只有在对象产生时才会为止分配内存,然后通过对象去访问。在静态方法中访问非静态成员会出错的原因是类的静态成员早于非静态成员分配内存,当试图去访问一个不在内存中的成员时自然会发生错误。

3、多线程是为了解决什么问题?

  答:①发挥多核CPU的优势②防止线程阻塞

4、== 和 equals() 方法的区别

  答:== 用于基本类型的对象比较时,比较的是两个对象的值;用于引用类型对象的比较时,比较的是他们的内存地址。equal()方法不能用于基本类型的对象的比较,用于引用类型的对象的比较时,如果没有重写equals()方法,默认的equals()方法也是比较两个对象的内存地址,重写了之后可以根据重写的规则进行比较。

5、对象的拷贝问题

  答:对象的拷贝分为深拷贝和浅拷贝。浅拷贝就是拷贝一个对象的内存地址,两个引用指向的是同一个对象。深拷贝是指将该对象的所有值都拷贝一份,生成一个新的对象,两个引用指向两个不同的对象。

6、ArrayList的底层原理

  答:详情见我的另一篇博客吧:模仿ArrayList和它的Iterator

7、ArrayList在动态扩容过程中但是扩容未完成时,新插入一个元素会怎样?(此问题至今本人无解)

  答:渴望着大佬的回复

8、简单描述一下Servlet的生命周期

  答:①被创建:当Servlet第一次被访问时,会创建Servlet并执行init()方法进行初始化。②提供服务:可多次执行service()方法提供服务。③被销毁:当服务器容器关闭时,会执行destory()方法销毁Servlet,只执行一次。

9、java的移位运算符有哪些?分别是什么运算?为什么用移位运算符?

  答:Java中的位移运算符有三个,分别是 <<(左移)、>>(有符号右移)、>>>(无符号右移)。它们只能用于整型变量的操作。在没有溢出的情况下,左移n位相当于乘以2的n次方。右移n位相当于除以2的n次方。

10、HashMap添加时key值重复了会怎样?hashcode重复了会怎样?

  答:①HashMap添加一个新的元素时,如果新元素的key值已经存在,那么新元素的value值会覆盖掉原来那个元素的value。这个简单,写几句代码试验一下就知道了。②当hashcode重复时,操作就复杂了,我在这里简单描述一下,更深层的理解稍后会更新博客。当hashcode重复时,首先会判断key值是否重复,如果重复则如①所说发生值覆盖;如果key不重复,则会将hashcode相同的元素散列到一个链表上,这种方法也被称为分离连接法。因此HashMap的底层数据及结构也可以简单概括为哈希表+链表。

11、String str = new String("abc"); 假设上述代码是第一句也是第一次执行,会创建几个对象?怎么证明你的想法?

  答:两个。一个是str指向的String对象,在堆内存中;一个是"abc"这个字符串对象,在字符串常量池中。在JDK1.7之后,字符串常量池也被移到了堆内存中。至于证明方法,我就不知道了。当时随口说了一句使用javap反编译一下看看。然后面试官问我你能够看懂字节码指令?我回答说在一本书上看到过,但是没记住......(好尴尬啊),然后面试官问我是哪一本书,我回答说是《深入理解java虚拟机》,面试官点了点头,这个话题终于到此结束......

12、JDK是什么?JRE是什么?

  答:①JDK(Java Development Kit),包括Java程序设计语言、Java虚拟机、JavaAPI类库三部分。JDK是支持Java程序开发的最小环境。②JRE(Java Runtime Environment),包括JavaAPI类库中的JavaSE API子集和Java虚拟机两部分。JRE是支持Java程序运行的标准环境。

--------------------------------------------------分割线--------------------------------------------------

数据结构与算法:

1、用递归的方式实现字符串翻转

  答:JAVA面试题--如何用递归实现字符串反转

2、使用归并排序发对数组排序

  答:

3、二叉树的遍历,由前序遍历中序遍历的结果或者中序遍历后序遍历的结果求二叉树的结构以及另外一种方法的遍历结果。

  答:这个是最基本的数据结构题目,不在此多做解释说明。

4、使用数组模拟队列操作。

  答:

5、说说你对图的深度优先遍历和广度优先遍历的理解?

  答:

--------------------------------------------------分割线--------------------------------------------------

框架:

1、说几个Spring的常用注解

  答:@Autowired @Value @Controller @Service @Repository @Component @Configuration @Bean ......

2、@Autowired 和 @Resource 的区别

  答:①@Autowired是由spring提供的,在 org.springframework.beans.factory.annotation 包下;而@Resource是由jdk提供的,在 javax.annotation 包下。②@Autowire的是按照类型自动装配的,而@Resource是按照name装配的。

3、Spring的核心是什么?

  答:Spring的核心是IOC(控制反转)和AOP(面向切面编程)。

4、IOC和DI的关系

  答:

5、能否在未被Spring管理的bean内部使用Spring注入bean?

  答:

6、说说SpringMVC从接收请求到返回结果的执行流程。

  答:可自行百度,也可参考我的这一篇博客:SpringMVC的执行流程
--------------------------------------------------分割线--------------------------------------------------

数据库:

1、数据库的隔离级别有哪几个?MySQL默认是哪一隔离级别?

  答:数据库的隔离级别 ,MySQL的默认隔离级别是可重复读(Repeatable Read)。PS:Oracle、SQLServer的默认隔离级别是读已提交(Read Committed)。

2、你所常用的MySQL引擎有哪些?它们有什么区别?

  答:

3、什么情况下MySQL会全表扫描?

  答:全表扫描是数据库搜寻标的每一条记录来查找符合条件的记录,通常情况下,我们应该尽量避免全表扫描来提高查询性能。在数据库中,通常对无索引的表进行查找时会进行全表扫描。然而,对于有索引的表或字段,也有一些情况可能会发生全表扫描。①使用null作为判断条件②模糊查询的占位符%在左边(如%abc)③使用or作为连接条件④使用in或者not in时⑤使用 != 或者 <>时⑥使用count(*)时⑦条件的左边使用mysql提供的函数时。

4、Redis和MySQL的区别?Redis的使用场景?

  答:①Redis是非关系型数据库,MySQL是关系型数据库。②Redis是内存型数据库,所有的数据都放在内存中;MySQL是磁盘型数据库,所有数据都会持久化到硬盘上。③Redis可用于数据缓存,避免对MySQL的大量访问,因为访问内存要比访问外存更加快捷、更加轻松。可以用于做分布式会话(session共享)。可以用于做计时器。

5、Redis的持久化是什么?主从复制是什么?

  答:简单点说,Redis是一个内存型数据库,它的所有数据都放在内存中,这就是它的访问速度快的原因。然而,内存在服务器关闭的时候是要被清理的,这也就导致了一旦服务器因为某种原因关闭,Redis里的数据就会全部消失......Redis的持久化就是为了解决这个问题而存在的。持久化就是指将Redis里的数据从内存中copy一份持久化到磁盘上。这样即便内存中的数据全部丢失了,还有这么一份备份可以恢复。Redis提供了两种持久化方式:一种是RDB持久化(将Reids在内存中的数据库记录定时dump到磁盘上),另外一种是AOF(append only file)持久化(将Reids的操作日志以追加的方式写入文件)。RDB是Redis默认开启的持久化方式,它可以定期将内存中的数据持久化到硬盘中。它的特点是可以IO资源消耗小,但是存在可能会丢失一些数据。AOF是每当内存中的数据发生改变,就会将发生改变的数据持久化到硬盘中,这样的话可以保证数据的安全性和完整性,但是对于IO资源的消耗就会比较大。

  主从复制:持久化解决的是单机备份问题,但是举一个极端的例子,服务器关闭的同时硬盘也损坏了呢?那么持久化备份的数据也一样不存在了。而主从复制可以解决数据的多机热备。此外,主从复制还可以实现负载均衡和故障恢复。主从复制,是指将一台Redis服务器的数据,复制到其他的Redis服务器。前者称为主节点(master),后者称为从节点(slave);数据的复制是单向的,只能由主节点到从节点。默认情况下,每台Redis服务器都是主节点;且一个主节点可以有多个从节点(或没有从节点),但一个从节点只能有一个主节点。

--------------------------------------------------分割线--------------------------------------------------

设计模式:

1、单例模式:(两家公司在面试的时候分别要求手写出一个饿汉式和一个懒汉式)

  答:可自行搜索,也可参考我的这篇博客:我所知道的单例模式

--------------------------------------------------分割线--------------------------------------------------

JVM:

1、说说JVM的内存模型。

  答:JVM的内存模型大致上可以划分为这么几块:堆(Heap)、方法区(Method Area)、虚拟机栈(Vm Stack)、本地方法栈(Native Method Stack)和程序计数器(Program Counter Register)。其中堆和方法区是线程共享的,虚拟机栈、本地方法栈和程序计数器是线程独占的。

  堆:对于绝大多数应用来说,堆内存是Java虚拟机管理的内存中最大的一块,在虚拟机启动时被创建,被所有的线程共享。此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例都要在这里分配内存。堆也是垃圾收集器管理的主要区域。

  方法区:方法区与堆一样,也是被所有线程所共享的内存区域。它用于储存已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。

  虚拟机栈:java虚拟机栈是线程私有的,它的生命周期与线程相同。虚拟机栈描述的是方法执行的内存模型:每个方法在执行的同时都会创建一个栈帧用于存储局部变量表、操作数栈、动态链接、方法出口等信息。每一个方法从调用直至执行完成的过程,就伴随着一个栈帧在虚拟机栈中入栈到出栈的过程。

  本地方法栈:本地方法栈与虚拟机栈发挥的作用是非常相似的,它们的区别就是虚拟机栈为虚拟机执行java方法服务,而本地方法栈为native方法服务。

  程序计数器:程序计数器是一块儿较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示器。在虚拟机的概念模型里,字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令。分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。

  PS:上边的知识点全都是来自周志明老师的《深入理解java虚拟机》第二版,建议自己好好看一看。

2、对象一定会在堆内存上分配吗?(尼玛啊你真的是在找实习生吗?)

  答:堆内存唯一的目的就是存放实例对象,几乎所有的实例对象都会在对内存分配内存。在java虚拟机规范中的描述是:所有的对象实例以及数组都要在堆上分配。但是,随着JIT编译器的发展与逃逸分析技术的成熟,栈上分配、标量替换等优化技术将会导致一些变化。所有的对象都分配在堆内存上也不是那么绝对了。

  PS:此处只需要暂时知道这些知识点,因为我也不是很理解,所以无法做出深层次的解答,可自行百度。

3、JVM会在什么时候进行GC?

  答:当JVM不能为新的对象分配内存的时候(这里特指Eden区满的时候),就会触发Minor GC(新生代GC)。Full GC(老年代GC)会在老年代内存空间不足的时候或者方法区空间不足的时候或永久代空间满的时候会触发。调用System.gc()方法时,系统建议执行GC,但是JVM不一定会去执行GC。

4、什么样的对象会被回收?垃圾回收算法有哪些?

  答:java对象和垃圾回收

--------------------------------------------------分割线--------------------------------------------------

多线程高并发:

1、高并发有哪些常用的解决方案?(尼玛啊你真的是在找实习生吗?)

  答:以下是我所了解到的技术,但是并没有都掌握。①分布式②动态语言静态化③消息队列④缓存⑤数据库的读写分离

2、线程锁可以用在哪些地方?怎么用?

  答:

--------------------------------------------------分割线--------------------------------------------------

逻辑题目:

1、有一堆扑克牌共52张,其中10张是正面朝上的。要求:①闭着眼或者黑暗中(总之就是看不见)②把这一堆扑克牌分成两堆,每堆中正面朝上的数量一样③可以任意翻转任意一张扑克牌。

  答:①从这52张扑克牌中任意抽取出10张牌,分为A堆(42张牌)和B堆(10张牌),此时假设A堆中有X张是正面朝上的,那么B堆中就有10-X张正面朝上的。②将B堆中的每一张牌翻转一次,此时B堆中正面朝上的张数由10-X变为了X。不论X为多少,10-X == 10-X。此时两堆排中正面朝上的张数一样。

2、史密斯夫妇邀请另外 n 对夫妇就餐,已知他们每个人都不和自己握手,不和自己的配偶握手,且不和同一个人握手一次以上。在大家见面握手寒暄后,史密斯问大家握手了几次,每个人的答案都不一样。问:史密斯太太握手几次?

  答:①首先有2n+2个人参加了这次聚餐,在史密斯先生问的2n+1个人中,因为每个人的答案都不一样,所以他们的握手次数分别为0,1,2......2n次(因为不会和自己的配偶握手,所以不会出现2n+1次)。

    ②考虑握手次数微2n的人,ta和除去自己配偶和自己以外的其他所有人都握手了,那么存在握手次数为0的人就会是ta的配偶。以此类推配偶的情况会是:(0,2n)、(1,2n-1)、(2,2n-2)......,并得出结论每对夫妻的握手次数只和为2n。

    ③以此类推,那么在被问话的这2n-1个人中,只有握手次数为n的那个人落单了,所以她就是史密斯太太。因此史密斯先生和史密斯太太的握手次数都为n次。

3、现有一根连续七段的金条,需要给一名为你连续工作七天的工人发放工资,每次发放一段金条,不可以多给或者少给,但是这根金条只能被分割两次,应该怎么分割能够满足条件?

  答:将这根连续七段的金条分为数量为1段(A)、2段(B)、4段(C)三部分。实施情况如下:第一天将A发放给工人;第二天将B发放给工人,要回A;第三天将A发放给工人;第四天将C发放给工人,要回A和B......剩下的步骤以此类推吧。

4、有一个村子,一共有100个村民。村子里的男人说假话,女人说真话。一天一个陌生人问村民:你们村子一共有多少女人啊?第一个村民说1个,第二个村民说2个......第一百个村民说100个。那么这个村子到底有多少个女人?

  答:一共一百个人,一百个答案,但是只有一个是真的(村子里女人的人数是固定的),所以只有一个女人(只有女人会说真话)。

--------------------------------------------------分割线--------------------------------------------------

 非技术题目:(下面这些题目就自己百度自己发挥吧,但是这些题目也会是加分或者扣分项)

1、简单介绍一下你自己

2、你还有什么想问的

3、介绍一下你的项目

4、说说你的学校生活

5、你为什么会选我们公司

原文地址:https://www.cnblogs.com/yangwanhao/p/11219068.html