java面试总结(上)

JAVA面试整理(上篇)

一、抽象,封装,继承和多态。

  1. 抽象修饰类不能实例化,只能通过继承来实现。
  2. 封装是使用private关键字实现,只能通过get/set方法进行查询修改。
  3. 继承是可以子类可以获得父类除了private之外的全部属性和方法(构造方法除外),子类有时候会需要重写父类的方法,在重写时必须保证方法名和形参列表相同,返回值类型和异常类型子类需要小于父类;访问权限,子类需要大于父类。
  4.  多态是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用只有在程序运行期间才会确定,在Java中通过继承的方式来实现多态,即父类接口引用变量指向子类或实现类的实例对象,这样程序调用的方法在运行期才会动态绑定引用变量所指向的具体实例对象的方法,也就是内存里正在运行的对象方法。需要注意的是多态是方法的多态而不是属性的多态,多态是在继承的基础上实现的。

 

二、接口和抽象的区别是什么?

  1. 抽象类是一个类,而接口是其他的类型
  2. 抽象类除了不能实例化之外跟普通的类没有区别,而接口完全不存在方法的实现,不能有构造器,只能使用public访问修饰符,没有main方法等

 

三、已经有基本类型了,为什么还需要包装类型呢?

  1. 是自动装箱时系统会创建缓存,并将当前数据添加到缓存中,有两个作用,第一是为了缓解使用包装类型导致数据存储会略微变慢的问题,第二是解决了包装类型判断是否相等的问题。
  2. 基本数据类型并不具备面向对象的特征,这会导致数据存储的问题,例如在处理空值的时候,使用Integer时需要判断null,使用int的时候需要判断0,而在数据库中通常默认值为0。

 

四、说一下"=="和equals方法究竟有什么区别?

  1. ==用于判断两个变量是否相等。变量可以分为基本数据类型引用数据类型,如果是引用数据类型需要比较引用的内存首地址,如果是基本数据类型直接比较值。
  2. equals方法是判断两个对象的某些特征是否一致,通过重写对象的equals方法。
  3. equals方法会首先判断两个比较值类型是否一致,然后再比较数值或字符,例如Integer类型会自动拆箱为int类型进行比较,String会将字符串拆分成字符。

 

五、讲一下String和StringBuilder的区别(final)?StringBuffer和StringBuilder的区别?

  1. String是内容不可变的字符串(private final char value[])
  2. StringBuilder和StringBuffer继承自AbstractStringBuilder类(char[] value);
  3. 拼接字符串的时候不能使用String进行拼接,要使用StringBuilder和StringBuffer。前者效率高但线程不安全,后者效率低但线程安全。

 

六、简单说一下集合

  1. java中的集合主要分为value和key-value两种。
  2. 存储值分类list和set,list重复有序,set不可重复无序。并且set根据equals和hashcode判断,如果对象存储在set中,则必须重写这两个方法。
  3. 存储键值在java中是称之为map,在OC语言中叫字典。

 

七、List常用的ArrayList和LinkedList的区别和使用场景?

  1. ArrayList底层使用数组(private transient Object[] elementData;)
  2. LinkedList底层使用链表(transient Node<E> first; transient Node<E> last;)
  3. 数组是一块连续的内存,因此插入和删除的时候需要移动内存。由于有这个特点所以说数组查询元素快,插入和删除删除慢。
  4. 链表的原理是在当前元素中存放上一个和下一个元素的地址,查询时从头部开始一个个找,因此查询效率慢,由于做修改的时候不需要做内存移动操作,只需要改变引用指向即可完成,所以插入和删除操作效率高。

 

八、讲一下HashMap和 HashTable的区别?HashTable和ConcurrentHashMap的区别?

  1. 首先HashTable是不可以使用null作为key或者value的,HashTable在存储数据的时候会返回synchronized。因此可以得出结论HashTable安全但效率不高。
  2. 如果想既效率高又安全,可以使用ConcurrentHashMap并发容器的方式,原理是将整个Map分成N个Segment(类似HashTable不加锁),提供相同的线程安全,但是效率提升N倍默认为16倍。

 

九、实现一个拷贝文件的工具类使用字节流还是字符流?

  1. 字节流和字符流都可以实现对文件的拷贝,如果确认不包含例如图片和音频这样特殊的文件,使用字符流即可,否则应该使用字节流。

 

十、线程的几种实现方式,启动方式?

  1. 两种实现方式:继承Thread类和实现Runnable接口。一般采用实现接口的方式,因为java只支持单继承。

 

十一、线程池的作用

  1. 线程过多的话会导致系统运行缓慢甚至崩溃,所以需要限制线程的个数
  2. 线程池如果每次都创建或者销毁会导致资源的浪费

 

十二、设计模式

  1. 单例模式:作用是保证某一实例的唯一性在类中定义一个实例对象并提供一个公开方法获取该实例,然后将构造器私有化,如果需要使用该实例的话,只能通过提供的公开方法而不能new出这个类,这样每次得到的实例就是同一个实例单例分为懒加载和立即加载两种模式,懒加载在创建对象的时候就加载实例,立即加载在需要的时候才加载实例
  2. 工厂模式SpringIoC中的BeanFactory,MyBatis中的SqlSessionFactory就都是工厂模式的实现
  3. 代理模式SpringAOP是通过动态代理实现
  4. 观察者模式Spring中的listener实现ApplicationListener
  5. 模板模式Spring集成了JdbcTemplate、RedisTemplate、SolrTemplate、JmsTemplate
  6. 适配器模式SpringMVC中的处理器映射器HandlerMapper

 

十三、说一下你对servlet的理解?或者servlet是什么?

  1. Java Servlet是使用J2EE服务端程序,后端代码通过实现Servlet接口并重写HTttpServlet的doGet/doPost方法来进行对数据库和浏览器之间的交流,Servlet程序需要运行在支持Java程序的应用服务器中,比如tomcat,jetty等。

 

十四、简单说一下servlet的生命周期?

  1. Servlet是一个接口规范,所以有比较明确的生存期定义,接口中的init,service和destory方法进行表述。

 

十五、Servlet API中forward()与redirect()的区别?

  1. forward就是转发,是服务端行为因此只发送一次请求也不会改变url地址,redirect是重定向,是客户端行为会改变url地址并且发送两次请求

 

十六、JSP和Servlet有哪些相同点和不同点?

1JSP是Servlet的扩展,所有的jsp文件都会被编译成一个继承自HttpServlet的类,因为servlet输出html比较麻烦,所以设计出jsp。

 

十七、JSP有哪些内置对象?作用分别是什么?

(1)request 用户端请求,此请求会包含来自GET/POST请求的参数

response 网页传回用户端的回应

pageContext 网页的属性是在这里管理

session 与请求有关的会话期

application servlet正在执行的内容

out 用来传送回应的输出

config servlet的构架部件

page JSP网页本身

exception 针对错误网页,未捕捉的例外

(2)四大作用域:

pageContext 整个page页面

request(HttpServletRequest) service方法

session(HttpSession) 第一次调用request.getSession()方法时

application(ServletContext) 整个WEB应用程序

 

十八、说一下Session和Cookie的区别?你在项目中都有哪些地方使用了?

  1. session和cookie都是HTTP的会话跟踪技术,是为了解决HTTP无状态的特性而设计的技术。cookie在客户端浏览器记录信息认证身份,session在服务端记录信息确认身份。session通过在cookie中存放的sessionId来保证信息的一致性。
  2. session和cookie的区别如下

1.由于cookie数据保存在浏览器中,因此有安全和数据限制的问题,考虑到这种情况应该使用session保存数据

2.session数据存在服务器上,当访问比较多的情况下会耗费服务器资源,考虑到这种情况应该使用cookie

 

十九、HTTP中GET和POST请求的区别

(1)get请求时,地址栏会显示请求信息,以?开头,多个参数以&连接,而post请求在request body中

2get请求由于浏览器对地址长度的限制而导致传输的数据有限,post则没有这个限制.

(3)get产生一个TCP数据包,浏览器会将http header和data数据一起发送,等待服务器响 应200并返回数据;post请求产生两个数据包,浏览器会发送header,等待服务器响应100 continue,浏览器才会发送data,最后等待服务器响应200和请求的数据

4对于get和post的区别,有一个比较有趣的比喻。get传递数据如同写在脸上,post传 递数据如同方法肚子里,脸上自然不能放太多东西也不能放隐私的东西,而肚子里就无所 谓了。

 

 

数据库篇

 

 

  • 数据库三范式

第一范式:实体中某个属性不能有多个值或重复属性。

第二范式:每一行必须可以唯一区分,就是表必须有主键。

第三范式:就是在表中不包含除其他表中除主键外的其他数据信息。

 

  • 数据库的事务

事务是并发控制的最小单位,用户定义的一个操作序列要么全部执行成功,要么全部失败。

 

  • 存储过程

本质上是sql语句的集合,这些集合像一个方法一样实现某个特定功能,通过设置名称的方式提供调用。

优点:(1)由于是预编译的代码块,所以执行效率会比较高,由于是许多sql一起执行,所以节省带宽。

(2)可以提供安全机制,对于没有权限执行存储过程的用户巨进行控制。

缺点:(1)调试和更改比较麻烦,且没办法做缓存和数据库集群。

 

  • 数据库优化

主要可以使用索引、分表和缓存来做数据库的优化,当有多个数据库服务器时,还可以采用读写分离的方式来做数据量集群。

 

 

 

 

 

猜你喜欢

转载自blog.csdn.net/qq1371189713/article/details/82821367