1.集合有哪些子类?各自的数据结构?有什么区别?

注:HashSet底层采用HashMap实现,TreeSet底层采用TreeMap实现

2.Hashmap如何解决哈希冲突?与HashTable有何不同?

hash :

翻译为“散列”,就是把任意长度的输入,通过散列算法,变成固定长度的输出,该输出就是散列值,这种转换是一种压缩映射,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出。

hash冲突:

就是根据key即经过一个函数f(key)得到的结果作为地址去存放当前的key、value键值对(这个是hashmap的存值方式),但是却发现算出来的地址上已经有人先来了。就是说这个地方被抢了啦。这就是所谓的hash冲突啦。

哈希函数:

一般情况下,需要在关键字与它在表中的存储位置之间建立一个函数关系,以f(key)作为关键字key记录在表中的位置,通常称这个函数f(key)为哈希函数。

链地址法

这种方法的基本思想是将所有哈希地址为i的元素构成一个称为同义词链的单链表,并将单链表的头指针存在哈希表的第i个单元中,因而查找、插入和删除主要在同义词链中进行。

HashMap和Hashtable在底层实现上基本是一样的,只是HashTable的方法上加上了Synchronized,是线程安全的。

HashMap允许存储null的键值对,HashTable不允许。

3.谈谈ArrayList、Vector、LinkedList的存储性能和特性?

ArrayList

底层是数组实现,是非线程安全的,插入删除性能低,因为要移动数组,查询速度快。

Vector

底层也是数组实现,方法上加上了synchronized关键字是线程安全的,插入删除性能低,因为要移动数组,查询速度快,但是比ArrayList慢。

LinkedList 底层采用链表实现,插入删除性能高,查询性能低。

4.TreeMap和TreeSet在排序时如何比较元素?

TreeMap是根据key进行排序,每次添加新的key、value键值对时,会用key和已经存储在TreeMap中的其他key进行比较,如果没有传入外部比较器会使用key的compareTo()方法进行比较。

如果创建对象是传递了外部比较器会使用外部比较器进行比较


TreeSet底层是使用TreeMap的key存储数据,所以比较元素的原理也是一样的。

5.Collections工具类中的sort()方法如何比较元素?

Collections工具类的sort方法有两种重载的形式

1.要求传入的待排序容器中存放的对象必须实现Comparable接口以实现元素的比较;
2.不强制性的要求容器中的元素必须可比较,但是要求传入第二个参数,参数是Comparator接口的子类型(需要重写compare方法实现元素的比较),相当于一个临时定义的排序规则。

Colloections 的sort()方法 调用的是Arrays.sort()方法


6.ConcurrentHashMap 的实现原理

ConcurrentHashMap和Hashtable一样都是线程安全的类,Hashtable是通过给方法加Synchronized方法实现线程安全,代价比较高,在同一个时刻只有一个线程可以执行该对象同一个方法。

ConcurrentHashMap在jdk1.7中的实现是引入了段的概念,把集合中的数据分成若干个段,每个段其实就是一个小的Hashtable,给段进行加锁,相当于把加锁的粒度变小了,只要多个修改操作发生在不同的段上,它们就可以并发进行。

在 JAVA1.8 中它摒弃了 Segment(锁段)的概念,而是启用了一种全新的方式实现,利用CAS算法+Synchronized来实现。

7.NIO了解过吗?谈谈你的理解

传统的IO是BIO

BlockingIO,阻塞式IO,最明显的表现为:当一个线程在进行read() ,如果读取不到信息将一直阻塞不能进行其他操作。

NIO

non-blocking IO 或者 new IO,非阻塞式IO ,同样是read(),如果数据没有准备好则直接返回,不会等待。如果数据已经准备好,也直接返回。

8.ClassLoader和Class.forName()这两个有什么区别?

类加载过程

装载:

通过类的全限定名获取二进制字节流,将二进制字节流转换成方法区中运行时的数据结构,在内存中生成Java.lang.class对象;

链接:

执行下面的校验、准备和解析步骤,其中解析步骤是可以选择的;

校验:

检查导入类或接口的二进制数据的正确性(文件格式验证,元数据验证,字节码验证,符号引用验证)

准备:

给类的静态变量分配并初始化存储空间;

解析:

将常量池中的符号引用转成直接引用;

初始化:

激活类的静态变量的初始化和静态Java代码块,并初始化程序员设置的变量值。

Class.forName(className)方法

内部实际调用的方法是Class.forName(className,true,classloader);
第2个boolean参数表示类是否需要初始化,Class.forName(className)默认是需要初始化。一旦初始化,就会触发目标对象的 static块代码执行,static参数也会被再次初始化。

ClassLoader.loadClass(className)方法

内部实际调用的方法是 ClassLoader.loadClass(className,false);
第2个boolean参数,表示目标对象是否进行链接,false表示不进行链接,由上面介绍可知,不进行链接意味着不进行包括初始化等一系列步骤,那么静态块和静态对象就不会执行。

9.谈一谈JVM的GC

GC指的是垃圾回收,jvm采用分代收集算法进行垃圾回收

Minor gc:

当Eden区满的时候,会触发第一次Minor gc,把还活着的对象拷贝到Survivor From( S0)区;当Eden区再次触发Minor gc的时候,会扫描Eden区和From区,对两个区域进行垃圾回收,经过这次回收后还存活的对象,则直接复制到To(S1)区域,并将Eden区和From区清空。
当后续Eden区又发生Minor gc的时候,会对Eden区和To区进行垃圾回收,存活的对象复制到From区,并将Eden区和To区清空
部分对象会在From区域和To区域中复制来复制去,如此交换15次(由JVM参数MaxTenuringThreshold决定,这个参数默认是15),最终如果还存活,就存入老年代。此过程采用的是复制算法。

Major gc:

当老年代的内存不足以放下从年轻代而来的对象时,触发Major gc,当触发Major gc时虚拟机暂停工作,因此应该尽量少的触发。

10.谈谈final, finally, finalize的区别

final修饰的变量为常量不可以被修改
final修饰的类不能被继承
final修饰的方法不能被重写
finally在处理异常时使用,不论是否有异常总会执行finally代码块
finalize()是一个方法,当对象被垃圾回收时,会自动调用该方法

11.Java 关键字volatile 与 synchronized 作用与区别?

在计算机中,cpu和内存的交互最为频繁,相比内存,磁盘读写太慢,内存相当于高速的缓冲区
但是随着cpu的发展,内存的读写速度也远远赶不上cpu。因此cpu厂商在每颗cpu上加上高速缓存,用于缓解这种情况
cpu上加入了高速缓存这样做解决了处理器和内存的矛盾(一快一慢),但是引来的新的问题 —— 缓存一致性
在多核cpu中,每个处理器都有各自的高速缓存,而主内存却只有一个。
在不同CPU执行的不同线程对同一个变量的缓存值不同。因此,操作系统提供了一些内存屏障以解决这种问题。
用volatile可以解决上面的问题,不同硬件对内存屏障的实现方式不一样。java屏蔽掉这些差异,通过jvm生成内存屏障的指令。
对于读屏障:在指令前插入读屏障,可以让高速缓存中的数据失效,强制从主内存取。 硬件层的内存屏障分为两种:Load Barrier
和 Store Barrier即读屏障和写屏障。【内存屏障是硬件层的】
当我们声明某个变量为volatile修饰时,这个变量就有了线程可见性,一个线程对共享变量做了修改,其他线程可以立即看到更改后的最新数据

Synchronized是加锁,在同一时刻只有一个线程可以执行加锁的代码。

12.Oracle的游标知道吗?如何使用?

游标是用来在PL/SQL中操作查询的结果集
语法:cursor 游标名 is 查询的结果集

使用步骤:

  1. 声明游标
  2. 打开游标 open 游标名
  3. 从游标中取数据 fetch 游标名 into 变量 (fetch一次就从游标中取一条记录)
    游标名%found:从游标中找到了数据
    游标名%notfound:从游标中没有找到数据
  4. 关闭游标 close 游标名
    需求:输出员工表中所有员工的姓名和工资
declare--声明游标cursor vrows is select * from emp;--定义行变量vrow emp%rowtype;begin--打开游标open vrows;--循环从游标中取数据loopfetch vrows into vrow;exit when vrows%notfound; --退出条件dbms_output.put_line(vrow.ename||' '||vrow.sal);       end loop;--关闭游标close vrows;    end;

13.Oracle是怎样分页的?

ROWNUM关键字编写分页的SQL语句

SELECT employee_id, last_name, hire_date FROM (SELECT ROWNUM AS rn, t.* FROM (SELECT * FROM employees ORDER BY hire_date desc) t WHERE ROWNUM <= 20
)WHERE rn > 10

由里到外,它是由三层查询组成
最内层查询——进行排序等限制

SELECT * FROM employees ORDER BY hire_date desc

中间层查询——设置最大记录数

SELECT ROWNUM AS rn, t.* FROM (最内层查询结果) t WHERE ROWNUM <= 20

最外层查询——设置最小记录数

SELECT employee_id, last_name, hire_date FROM (中间层查询结果)WHERE rn > 10

14.解释什么是死锁,如何解决Oracle中的死锁?

2个线程各自持有对方的一把锁 相互等待的状态

解决oracle中的死锁 (只看第一部分 删除和更新之间引起的死锁)
https://www.cnblogs.com/xinxin1994/p/6679551.html

15.怎样创建一个存储过程, 游标在存储过程怎么使用, 有什么好处?

存储过程(Stored Procedure)是一组为了完成特定功能的SQL 语句集,存储在数据库中,经过第一次编译后调用不需要再次编译,用户通过指定存储过程的名字来执行它,语法形式如下:

CREATE [OR REPLACE] PROCEDURE 存储过程名 [(param1 [mode1]        type1,param2 [mode2]        type2,
…)]
IS | AS
变量声明
BEGIN
业务处理
END;param1、param2:形参名称
mode1、mode2:参数模式,包括IN(默认)、OUT
type1、type2:参数数据类型

需求:根据员工编号输出员工的姓名、工资和入职时间

create procedure P_GETEMP(eno in emp.empno%type)
isv_name emp.ename%type;v_sal emp.sal%type;v_hiredate emp.hiredate%type;
beginselect ename,sal,hiredate into v_name,v_sal,v_hiredate from emp where empno=eno;dbms_output.put_line(v_name);  dbms_output.put_line(v_sal); dbms_output.put_line(v_hiredate);
end ;

16.当数据表中A、B字段做了组合索引,那么单独使用A或单独使用B会有索引效果吗?

如果建立索引的顺序是 A ,B
那么单独使用A 会使用索引,单独使用B 不会使用索引

17.mybatis是如何工作的?

工作方式一:

工作方式二:

18.项目中是如何进行分页的?Mybatis可以分页吗?如何实现?

使用mybatis提供的PageHelper插件进行分页。
前提:导入PageHelper的依赖包
PageHelper.startPage(1, 2);//设置当前页和每页显示的条数
List list = session.selectList(“UserMMapper.selectAll”);//执行查询语句
PageInfo pageinfo = new PageInfo(list);//创建PageInfo对象

19.Mybatis动态sql有什么用?执行原理?有哪些动态sql?

作用:可以在编写sql时加入流程控制,比如if choose when foreach 等,便于业务处理
原理:在执行sql前解析标签,最终形成我们要执行的sql语句。
动态sql:

1. if 语句 (简单的条件判断)
2. where (主要是用来简化sql语句中where条件判断的,能智能的处理 and or ,不必担心多余导致语法错误)
3. choose (when,otherwize) ,与 jstl 中的choose 很类似.
4. set (主要用于update语句)
5. trim (在自己包含的内容前加上某些前缀或者后缀)  与java中的trim要区分开
6. foreach (在实现in 语句查询时特别有用)

20.线程池的原理及实现

线程池和数据库连接池是一个道理,节省资源开销
参考如下博客学习:
https://www.cnblogs.com/rinack/p/9888717.html

21.使用MyBatis的mapper接口调用时有哪些要求?

  1. Mapper.xml文件中的namespace,就是接口的类路径
  2. Mapper接口方法名和Mapper.xml中定义的每个SQL的id相同;
  3. Mapper接口方法的输入参数类型和mapper.xml中定义的每个sql的parameterType类型相同
  4. Mapper接口方法的输出参数类型和mapper.xml中定义的每个sql的resultType的类型相同

22.Spring的AOP怎么理解的,Spring的IOC怎么理解的?

23.谈谈Spring Bean的生命周期?

https://blog.csdn.net/w_linux/article/details/80086950

24.Spring事务的实现方式和实现原理?

1.声明式事务,通过xml配置文件实现
2.注解式事务,在需要添加事务的方法上加上@Transactional
通过AOP实现的(面向切面编程)

25.SpringMVC怎么和AJAX相互调用的?

在ajax请求的方法上加上注解 @ResponseBody 就可以为ajax返回json字符串

26.SpringMVC里面的拦截器了解吗?有几种?分别是怎么实现的?

拦截器不依赖servlet容器,使用反射实现,是AOP的一种实现方式, 拦截所有的controller中的请求
Spring MVC中的拦截器(Interceptor)类似于servlet中的过滤器(Filter),它主要用于拦截用户请求并作相应的处理。例如通过拦截器可以进行权限验证、记录请求信息的日志、判断用户是否登录等。
要使用Spring MVC中的拦截器,就需要对拦截器类进行定义和配置,一般通过通过实现HandlerInterceptor接口,或继承HandlerInterceptor接口的实现类(如HandlerInterceptorAdapter)来定义:


public class Login implements HandlerInterceptor {@Overridepublic void afterCompletion(HttpServletRequest httpRequest,HttpServletResponse httpResponse, Object arg2, Exception arg3)throws Exception {}@Overridepublic void postHandle(HttpServletRequest arg0, HttpServletResponse arg1,Object arg2, ModelAndView arg3) throws Exception {       }@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response,Object object) throws Exception {Object obj = request.getSession().getAttribute("user");if(obj==null){//请求的路径String contextPath=request.getContextPath();response.sendRedirect(contextPath + "/view/login.jsp");  return false;}return true;}}

上述代码中,自定义拦截器实现了HandlerInterceptor接口,并实现了接口中的三个方法:

  • preHandle()方法:该方法会在控制器方法(controller中的方法)调用前执行,其返回值表示是否中断后续操作。当其返回值为true时,表示继续向下执行;当其返回值为false时,会中断后续的所有操作(包括调用下一个拦截器和控制器类中的方法执行等)。
  • postHandle()方法:该方法会在控制器方法(controller中的方法)调用之后,且解析视图之前执行。可以通过此方法对请求域中的模型和视图做出进一步的修改。
  • afterCompletion()方法:该方法会在整个请求完成,即视图渲染结束之后执行。可以通过此方法实现一些资源清理、记录日志信息等工作。

开发拦截器就像开发servlet或者filter一样,都需要在配置文件(spring-servlet.xml)进行配置,配置代码如下:

<mvc:interceptors><mvc:interceptor><!-- /是web项目的根目录/*是所有文件夹,不含子文件夹(一级目录)/**的意思是所有文件夹及里面的子文件夹(多级目录)/** 表示拦截所有请求 --><!-- <mvc:mapping path="/**" /> --><!-- /user/** 表示拦截/user/下的所有请求  /user/type/add.do--><!-- <mvc:mapping path="/user/**" /> --><!-- /item/* 表示拦截/item/下的请求  可以拦截/item/add.do  不可以拦截/item/type/add.do --><!-- <mvc:mapping path="/item/*" /> --><mvc:mapping path="/item/addCart.do" /><mvc:mapping path="/item/pay.do" /><!-- 不进行拦截 --><!-- <mvc:exclude-mapping path="/index.do" /> --><bean class="com.lq.interceptor.Login" /></mvc:interceptor></mvc:interceptors>

简单描述:拦截器不依赖servlet容器 ,是AOP的一种实现方式, 拦截所有的controller中的请求,实现HandlerInterceptor接口并重写他的三个方法preHandle() postHandle() afterCompletion() 然后还需要在spring配置文件中 通过<mvc:interceptors>进行拦截器配置

27.谈谈Spring MVC 的运行流程?

28.手写一个二分查找?

29.手写一个排序算法?

java实习生面试被问的较多的面试题(附参考答案)相关推荐

  1. java实习生面试会问什么问题,大量教程

    一次美团面经分享最后没啥问题了,他让我保持电话畅通.这一面面完,口干舌燥,我一度怀疑他可能不知道我是在应聘实习生的岗位.有太多要总结的了,放在总结的地方一起讲吧.美团技术三面25分钟面试官说是他是另外 ...

  2. python自动化面试常问问题_Python自动化测试常见面试题及解析答案

    一._ init _ _ 和 _ _ new _ _是什么? 1.1.概述 在python的面向对象中,利用new方法创建对象,然后把这个创建的对象传递到init函数中,以第一个参数进 1.2.详细描 ...

  3. ibm java英语面试_IBMJava英文面试题(附参考答案)

    IBMJava英文面试题(附参考答案) IBMJava英文面试题(附参考答案). 1.what is oracle.what is major differenece oracle8i and ora ...

  4. Java基础面试16问

    来自三太子敖丙的Java基础面试16问 原文地址 ** 说说进程和线程的区别? ** 进程是程序的一次执行,是系统进行资源分配和调度的独立单位,他的作用是是程序能够并发执行提高资源利用率和吞吐率. 由 ...

  5. 熬夜两天盘点2022年Java岗面试被问得最多的100道题

    刚刚过去的秋招也是有人欢喜有人愁,不知道在座的各位有没有拿到心仪的offer,先恭喜一下成功入职理想公司的同学,秋招面试不顺的同学也别气馁,咱收拾好心情,春招再战! 这么久没更新,为了体现我的诚意,在 ...

  6. 2019个人Java实习生面试记录

    2019个人Java实习生面试记录 第一次: 1.sql排序语句 2.对框架的理解 3.说一下对Spring的理解 4.说一下对mvc的理解 第二次 5.&与&&的区别 6.S ...

  7. Java面试题目大汇总(附参考答案)

    足足准备了长达3个月的面试,终于在上周拿到了阿里的offer! 博主汇总整理了一份我面试之前看的一些Java面试题目,可以说是非常详细! 分享给大家,希望对正在面试Java岗位的朋友有帮助哈~~ (文 ...

  8. Java实用面试题及参考答案分享

    Java开发人员在面试中少不了会被询问专业上的问题,面试官到底会问什么问题呢,想必小伙伴们一定很好奇吧,接下来小千就带大家一起来看看java常见的面试题. 1.什么是多线程上下文切换? 多线程的上下文 ...

  9. 2020最新软件测试面试题汇总【内附参考答案】,拼多多面试官看了都说,卧槽!!!

    2020最新软件测试面试题汇总[内附参考答案] 测试技术面试题 1.什么是兼容性测试?兼容性测试侧重哪些方面? 参考答案: 兼容测试主要是检查软件在不同的硬件平台.软件平台上是否可以正常的运行,即是通 ...

最新文章

  1. jquery 组合键键盘事件
  2. 教程-Win7极速优化20项
  3. 伪距定位算法(matlab版)
  4. 微信小程序点播插件_微信小程序 wxParse插件显示视频问题
  5. 开关电源之EMI设计
  6. 在Mac OS X上安装Oracle客户端
  7. 【CCCC】L3-012 水果忍者 (30分),,枚举斜率
  8. vue弹出框消息重置问题---一个投机取巧的方法
  9. USACO 3.2 msquare 裸BFS
  10. Fiddler(FD)抓包工具汉化版及使用方法
  11. 谷歌身份验证器的一次性验证_使用一次性密码创建和应用多因素身份验证策略
  12. RLC串联谐振那些事
  13. 学习Java的心路历程
  14. 这些音乐MV制作堪称大片,看过真是值回票价
  15. 【U8】会计科目使用自定义项著辅助核算步骤及注意事项
  16. Via浏览器 – 简洁优雅的手机浏览器
  17. 联想T430 安装msata接口的SSD固态硬盘
  18. 马尔萨斯模型的分析和应用
  19. 经典逻辑题-泊松数学趣题
  20. rust 案例_Option 和 unwrap

热门文章

  1. android 头部分割线,ItemDecoration实践之分割线与粘性头部
  2. gaierror: [Errno -2] Name or service not known
  3. android的各个版本和logo
  4. 看快手怎么显示无法访问服务器,看快手有访客痕迹吗,快手如何查看别人看过我?...
  5. ES6基础-ES6的扩展
  6. 网络工程师成长日记369-中铁20局延安更换路由器项目
  7. (四十四:2021.04.15)《Methodology Camp》——Chapter 2:Pieces
  8. 每周翻译一篇前端技术英文官网(一)
  9. @Deprecated 注解
  10. ViewPager系列之-仿掌上英雄联盟皮肤浏览效果