个人总结的Java面试题

首先这是我以前找工作时根据很多的面试题总结的一些知识点,所列出的基本上都是我所不熟悉的地方,当然了面试最主要的还是根据自己的简历来的,自己所掌握的技术点和实际项目经验都是很重要的。

常见的面试题

Java的序列化:序列化是一种处理流的机制,对象流可以在进行读写操作或者在网络中进行传输,而序列化就可以解决对对象流进行读写操作所引发的问题.

ArrayList、HashSet、HashMap 都不是线程安全的,但是可以使用Collections.synchronizedXXXX(X)方法来实现安全,他们底层都是在核心方法上添加synchronize关键字.

并发集合常见的有ConcurrentHashMap,ConcurrentLinkedQueue,ConcurrentLinkedDeque等,并发集合通过复杂的策略不仅保证了多线程的安全又提高了并发时的执行效率.

HashMap是线程不安全的,但执行效率高,允许存储null值作为键和值
HashTable是线程安全的,但执行效率低,不允许存储null值作为键或值

当操作是在一系列数据的后面添加数据而不是在前面和中间,并且要随机的访问其中的元素时,使用ArrayList会提供比较好的性能;当你的操作是在一系列数据的前面或者中间添加或删除数据时,并且按照顺序访问其中的元素时就应该使用LinkedList.

公平锁:在并发环境中,每个线程在获取锁时会先查看此锁维护的等待队列,如果为空或者当前线程是等待队列的第一个就占有锁,否则就加入到等待队列中.
非公平锁:比较粗鲁,上来就直接尝试占有锁,如果获取失败在采用类似公平锁的方式.

悲观锁:假定并发环境是悲观的,如果发生并发冲突就会破坏一致性,所以要通过独占锁彻底禁止冲突发生.
乐观锁:假定并发环境是乐观的,虽然会有并发冲突,但冲突可发现且不会造成伤害,所以可以不加任何保护,等发现并发冲突后再决定放弃操作还是重试.

wait和sleep的区别:最大的区别是在等待时wait能释放锁,而sleep一直持有锁;wait通常用于线程间交互,sleep通常用于暂停执行.

同一个类中的2 个方法都加了同步锁,多个线程能同时访问同一个类中的这两个方法吗?
首先需要考虑是使用lock还是synchronize,如果使用lock,它可以让等待线程的锁响应中断,然后获取锁,最后释放锁,所以多个线程不能同时访问被lock锁的这2个方法;而如果使用synchronize,我们访问同一类对象时,使用的是同一把锁,所以可以访问该对象的其他synchronize方法.

如何避免死锁:1)加锁顺序,即线程按照一定的顺序进行加锁 2)加锁时限,线程尝试获取锁的时候加上一定的时限,如果超过此时限就放弃对锁的请求然后再释放锁.

Java中多线程间的通信怎么实现:一种是使用共享变量,另一种是使用wait/notify机制.

静态嵌套类和内部类的不同:静态嵌套类使用static修饰,不依赖于外部类实例被实例化,而内部类需要依赖外部类实例而被实例化.

动静态代理的区别,什么场景使用?
静态代理通常只代理一个类,动态代理的是一个接口下的多个实现类.
静态代理事先知道要代理的内容,动态代理事先不知道,在运行时动态代理.
动态代理实现invocationHandler接口的invoke方法,但注意此时代理的是接口,所以业务层必须要实现接口,通过Proxy的newProxyInstance方法创建代理对象.还有一种动态代理CGLIB,代理的是类,不需要业务层实现接口,通过派生的子类来实现代理.通过在运行时动态的修改字节码达到修改类的目的.
AOP编程用到了动态代理,如spring框架和Hibernate框架等.

Java的设计模式:总共有23中设计模式,最常用的是:单例模式,工厂模式,抽象工厂模式,适配器模式,代理模式,建造者模式,享元模式,策略模式,模板方法模式,观察者模式.

JVM垃圾回收机制和常见算法:如何发现无用的对象,常用的搜素算法:1)引用计数器算法(已废弃) 2)根节点搜索算法(使用),通过使用”GC Roots”作为根节点对象,从这个节点往下搜索,搜索通过的路径成为引用链,当一个对象没有被GC Roots的引用链连接的时候,就说这个对象是不可用的.然后接下来就是回收的过程,回收算法有:1)标记清除算法 2)复制算法 3)标记-整理算法 4)分代算法

在存储数据方面,cookie只能存储Strirng类型对象,而session可以存储任意类型的java对象.

Session共享问题:1.服务器实现session复制和session共享,如JBOOS在搭建集群时可以通过配置实现,但是此方法不利于移植和扩展,如果更改服务器时还要修改配置. 2.利用成熟的技术实现session复制和session共享,如12306的gemfire,但是此方案严重依赖第三方 3.将session维护在客户端,出于安全性考虑应加密数据.

在单点登录中,如果 cookie 被禁用了怎么办:单点登录的原理是后端生成一个session ID,然后设置到cookie,每次请求都会带上这个cookie,服务器通过cookie的session ID查询到用户信息,所以单点登录的关键不是cookie,而是通过cookie保存和传输session ID,而且可以使用HTTP的请求头也可以保存和传输session ID.

Jsp的四大域对象:request,session,pageContext,application

xml 的解析器有哪几种:有DOM和SAX两种,DOM采用以DOM树型结构加载内存,而SAX采用的是事件模型.

谈谈你对 ajax 的认识?Ajax是一种异步交换数据方式,能局部刷新页面,增强用户的体验性;能减少不必要的数据传输,减少带宽的使用;ajax引擎在客户端,承担了一部分由服务器承担的工作,减少大量用户访问服务器的负载压力;

jsonp 原理:浏览器的同源策略虽然提高了访问得的安全性,但是如果进行必须比较深入的前端编程时不得不进行跨域请求,此时jsonp跨域get请求是一种解决方案.jsonp的基本原理是动态的添加标签,使用scrip标签的src属性不受跨域的限制实现跨域.

Linux命令:tar zxvf解压 tar zcvf压缩 ps -ef |grep XX查询所有进程中的xx tail 用于查询文件的末尾内容,默认10行 tail -f动态的查询文件末尾内容,一般用于查询服务器日志信息

MySQL:
SQL Select 语句完整的执行顺序::from表名- where条件- group by -使用聚合函数计算-having条件-计算所有的表达式-select字段-order by排序
Mysql 性能优化:1当只要一行数据时使用limit 1,表示查询到一个就停止查询. 2.选择正确的数据库引擎 3.用not exists代替not in 4.对操作符的优化,尽量不采用不利于索引的操作符
Mysql 架构器中各个模块都是什么?1.连接管理与安全验证 2.解析器 3.优化器 4.执行器
Mysql 存储引擎有哪些? MyISAM innoDB memory memory(heap) archive NDB
MySQL 语句优化:1.where字句虽然可以对字段进行null值判断,但是我们尽量不用null值填充数据,因为如果不用varchar这样的变长字段,比如char(100),null还是占了100大小的字符空间,此时可以在null上设置默认值0,这样更好. 2.使用join时应使用小的结果驱动大的结果,牵涉到多表联合查询时应尽量拆分成多个query语句 3.limit的基数如果很大时应使用between 4.应尽量减少列上的数学运算,防止索引失效.
MySQL的事务:事务的四大特性:1原子性:整个事务要么同时成功,要么同时失败,不会停留在中间的操作上; 2.一致性:事物的操作前后不会破坏数据的完整性约束 3.隔离性:隔离状态执行事务,使它们好像是系统在给定时间内执行的唯一操作,每个事务是单独存在的,不同的事务不会相互影响的 4.持久性:在完成事务后,该事务对数据库所做的更改会持久化的保存到数据库中,并不会回滚.
MySQL 中文乱码问题完美解决方案:核心思想是统一编码.
MySQL的优化?1.表的设计要符合三大范式(第一范式:每一列不可再拆分,第二范式:每一列都不产生局部依赖,第三范式:每一列不产生传递依赖) 2.添加适当的索引,索引能加快查询的速度 3.添加适当的存储过程,触发器,事务 4.主从复制实现读写分离 5.对SQL语句的优化(见上面) 6.分表分区 7.对MySQL服务器硬件的升级操作

SpringMVC 的工作原理:1.用户向服务器发送请求,被spring MVC的前端控制器DispatchServlet所捕获 2.前端控制器对请求URL进行解析,得到请求资源标识符URL,然后根据URL调用处理器映射器将请求映射到处理器handlerExcutionChain 3.前端控制器根据Handler选择一个合适的处理器适配器进行处理 4.Handler对数据处理后得到modelAndView返回给前端控制器 5.Handler返回的modelAndView只是逻辑视图并不是一个正式视图,前端控制器通过视图解析器将modelerAndView()解析出真正的视图view 6. 前端控制器通过model解析出modelerAndView()中的参数进行解析并最终展示完整的view并返回给客户端.

如何解决 get 和 post 乱码问题?Post可以使用在web.xml中设置CharacterEncodingFilter过滤器,设置成utf-8格式. get方式有俩种:第一种修改Tomcat的配置文件添加编码与工程编码格式一样. 第二种是对参数重新编码.

谈谈你对 Spring 的理解:spring一个全栈级轻量级的开源框架,为企业级应用开发而生,核心是IOC和AOP,而且他还能整合其他框架及第三方类库; IOC:控制反转,本来创建对象需要new或者getInstance直接或间接调用构造方法创建,而spring容器通过工厂创建我们需要的对象,不需要我们自己创建,直接使用spring提供的对象,这就是IOC; AOP:面向切面编程,以前的面向对象编程是把事务纵向成一个个的对象, 而AOP是将一个个对象的共同部分横向抽取成切面,对这个切面进行事务管理,权限控制,日志管理等公共处理的思想就是面向切面编程,AOP的底层实现是动态代理,如果是接口采用jdk动态代理,如果是类采用CGLIB方式实现动态代理. DI:依赖注入,spring为我么的JavaBean对象通过set方法或有参构造方法为我们创建的对象设置所需的值的过程就是依赖注入的思想.

Spring中的设计模式:单例模式:在spring配置文件中设置bean默认就是单例的 工厂模式:spring中创建对象就是通过beanFactory工厂模式创建的 模板模式:spring中如:jdbcTemplate,JmsTemplate等. 代理模式:AOP的底层实现就是使用代理模式 适配器模式:spring MVC中的处理器适配器

编程类事务是自己写事务处理的类,然后调用;声明类事务是在配置文件中配置,一般搭配在框架中使用.BeanFactory 常用的实现类有哪些?常用的有:defaultListableBeanFactory,xmlBeanFactory,applicationContext.

Spring 的配置文件是xml文件,这个文件包含了类的信息,描述了如何配置他们,以及使用.
Spring的IOC容器负责创建对象,管理对象,通过依赖注入,装配对象,配置对象,并且管理这些对象的整个生命周期.
Spring的IOC的优点:减少代码量,减少耦合,测试更容易,IOC容器支持加载服务时的饿汉式初始化和懒加载.
Spring的beans的定义包含容器必知的所有配置元数据,包括如何创建一个bean,他的生命周期详情以及依赖.
Spring 支持的几种 bean 的作用域:singleton一个bean对应一个实例,prototype:一个bean的定义可以有多个实例,request:每次请求都会创建一个bean ,session在一个HTTP session中一个bean对应一个实例,global-session在一个全局的HTTP session中,一个bean对应一个实例.
Spring的单例bean并不是线程安全,spring没有对spring的单例bean做任何的多线程封装处理,使用prototype作用域是线程安全的.
Spring支持的ORM框架有:Hibernate,iBatis,mybatis,TopLink,JDO,spring-data-jpa等.
Spring的连接点即被拦截的点,spring只支持方法类型的连接点,所以spring的连接点就是被拦截到的方法.
Spring通知是指在方法执行前或执行后需要做的动作,spring切面可以应用5种类型的通知,before(方法执行之前执行的通知),after(方法执行之后调用,无论方法是否执行成功),after-returning(成功执行方法之后执行通知),after-throwing(方法抛异常退出时),around(方法执行前后).
Spring的切入点是指一个或一组连接点,通知将在这些位置执行,可以通过表达式或匹配的方式指明这些切入点.
被一个或多个切面所通知的对象是目标对象.代理是通知目标对象后创建的对象.
织入是将一个切面和其他应用类型或对象进行连接或创建一个被通知对象的过程.

对资源类型的管理称为粗颗粒度权限控制,对资源实例的控制称为细颗粒度权限管理,即控制到数据级别的权限.

Mybatis 的编程步骤是什么样的?1.创建sqlSessionFactory 2.根据sqlSessionFactory创建sqlSession对象 3.通过sqlSession执行数据库操作 4.提交事务 5.释放资源

JDBC 编程有哪些不足之处,MyBatis 是如何解决这些问题的?1.JDBC频繁的创建或释放连接会严重影响系统的性能,MyBatis通过配置数据可连接池解决的 2.JDBC把操作数据库和java代码放在一起,不利于维护和扩展,MyBatis通过xml配置文件分离操作数据库的代码.
3. JDBC向sql语句传参比较麻烦,MyBatis自动将对象映射成sql语句 4.JDBC处理操作的结果集比较麻烦,而Mybatis自动将sql执行结果映射成java对象.

使用 MyBatis 的 mapper 接口调用时有哪些要求?1.Mapper接口中的方法名和mapper.xml的每个sql的id相同 2.mapper接口方法的返回值和mapper.xml的resultType相同 3.mapper接口方法的参数和mapper.xml的parameterType相同 4.mapper.xml的namespace是mapper接口的全类名. 5.mapper接口和mapper.xml的创建结构相同,名称相同

MyBatis 在 insert 插入操作时返回主键 ID:MySQL中配置keyProperty(表示返回的id要保存到对象的那个属性中)和useGeneratedKeys(表示主键id自增)这两个属性即可,而oracle使用标签。

猜你喜欢

转载自blog.csdn.net/keyto1/article/details/91356463