java基础面试题-看我这一篇就够了

本文汇总了Java面试中的基础题,涵盖了String、StringBuffer、StringBuilder的区别,Vector、ArrayList、LinkedList的异同,Hashtable、HashMap、TreeMap的对比,以及ConcurrentHashMap与Hashtable的比较。此外,还讲解了Tomcat、Apache、JBoss的角色,HTTP报文结构,反射机制,Hibernate的一级和二级缓存,以及Spring的IOC和AOP原理。还涉及到线程同步、JVM内存模型、SQL优化、JVM垃圾回收和线程通信等内容,是Java开发者面试准备的宝贵资料。
摘要由CSDN通过智能技术生成

基础面试题精选

一、String,StringBuffer, StringBuilder 的区别是什么?String为什么是不可变的?

  1. String是字符串常量,StringBuffer和StringBuilder是字符串变量。
  2. StringBuffer是线程安全的,
  3. StringBuilder是非线程安全的。
  4. 具体来说String是一个不可变的对象(String类是由final修饰的类,俗称阉割类),每次修改String对象实际上是创新新对象(补充知识点https://blog.csdn.net/MOU_IT/article/details/78312399),并将引用指向新对象。效率很低。
  5. StringBuffer是可变的,即每次修改只是针对其本身(操作同一对象,不像string可能会引用常量池中已存在的string),大部分情况下比String效率高,StringBuffer保证同步(synchronized),所以线程安全。
  6. StringBuilder没有实现同步,所以非线程安全。但效率应该比StringBuffer高(多线程操作效率要比单线程高很多)。StringBuffer使用时最好指定容量,这样会比不指定容量快30%-40%,甚至比不指定容量的StringBuilder还快。

二、VECTOR,ARRAYLIST, LINKEDLIST的区别是什么?

vector是同步的(线程同步https://www.cnblogs.com/nufangrensheng/p/3521654.html),arraylist和linkedlist不是同步的。底层方面,vector与arraylist都是基于object[]array实现的,但考虑vector线程安全,所以arraylist效率上回比vector较快(多线程操作速度优于单线程)。元素随机访问上,vector与arraylist是基本相同的 。但在插入删除数据上,linkedlist则比arraylist要快很多。linkedlist比arraylist更占内存,因为linkedlist每个节点上还要存储对前后两个节点的引用。

三、HASHTABLE, HASHMAP,TreeMap区别?

Hashmap和HashTable都实现了Map接口,但HashTable是线程安全的,HashMap是非线程安全的。
HashMap中允许key-value值均为null,但HashTable则不允许。
HashMap适合单线程,HashTable适合多线程。
HashTAble中的hash数字默认大小是11,增加方式为old*2+1,HashMap中的hash默认大小为16,且均为2的指数。
TreeMap则可以将保持的数据根据key值进行排列,可以按照指定的排序方式。默认为升序。
TreeMap线程不安全。

四、ConcurrentHashMap和HashTable的区别?

两者均应用于多线程中,但当HashTable增大到一定程度时,其性能会急剧下降(synchronization关键字,基于jvm内存计数器分配cpu占用时间)。因为迭代时会被锁很长时间。但ConcurrentHashMap(通过锁方法不会占用cpu时间,若遇到已有线程占用锁会立即释放锁)则通过引入分割来保证锁的个数不会很大。简而言之就是HashTable会锁住真个map,而ConcurrentHashMap则只需要锁住map的一个部分。

五、Tomcat,apache,jboss的区别?

Tomcat是servlet容器,用于解析jsp,servlet。是一个轻量级的高效的容器;缺点是不支持EJB,只能用于Java应用。

Apache是http服务器(web服务器),类似于IIS可以用来建立虚拟站点,编译处理静态页面。支持SSL技术,支持多个虚拟主机等功能。

Jboss是应用服务器,运行EJB的javaee应用服务器,遵循javaee规范,能够提供更多平台的支持和更多集成功能,如数据库连接,JCA等。其对servlet的支持是通过集成其他servlet容器来实现的。如tomcat。

六、GET POST区别?(总结的不够完善,想了解具体get和post请求区别的请看https://www.cnblogs.com/logsharing/p/8448446.html)
get请求方式直接将参数暴露在url中,post请求将参数放在request body。所以Post相对安全。

get是把参数数据队列加到提交表单的action属性所指的URL中,值和表单内各个字段一一对应,在url中可以看到。post是通过HTTPpost机制,将表单内各个字段与其内容放置在html header(http相关知识https://www.cnblogs.com/chenliyang/p/6558756.html)内一起传送到action属性所指的url地址。

对于get方式,服务区端用request.QueryString获取变量值,对于post方式,服务器端用request.Form获取提交的数据。get传送的数据量较小((大多数)浏览器通常都会限制url长度在2K个字节,而(大多数)服务器最多处理64K大小的url。超过的部分,恕不处理。),post较大,一般不受限制。get安全性比post要低,但执行效率较高。

七、SESSION, COOKIE区别?

session数据放在服务器上,cookie则放在客户浏览器上。cookie不太安全,因为可以分析出本地cookie,并进行cookie欺骗,考虑安全应使用session。session会在一定时间内保存在服务器上,当访问增多时,会比较占用服务器的性能,考虑减轻服务器压力则应该使用cookie。单个cookie保持的数据不超过4k,很多浏览器都限制要给站点最多保存20个cookie。session创建要依赖cookie ,当一个用户登录时,服务器创建session 并在浏览器端创建一个名为SESSIONID的cookie储存sessionid,确认是否为当前登录用户。

八、Servlet的生命周期?(老铁,看这个,这个吊https://blog.csdn.net/qq_19782019/article/details/80292110)
主要分三个阶段:初始化——调用init()方法,响应客户请求阶段——调用service()方法,终止阶段——调用destroy方法。工作原理:浏览器发送一个请求,web容器(如tomcat)从硬盘中加载servlet.class文件,调用servletinit方法创建servlet实例(若不存在的情况,若存在直接用),servlet调用service()方法对请求进行响应,即对请求方式进行匹配,选择调用doGet、doPost方法等,然后进入对于的方法中调用逻辑层的方法(传递servletRequset,servletResponse实例,返回结果由servletResponse传递),实现对客户的响应。自定义的servlet必须实现servlet接口。当web容器关闭时调用distory方法销毁实例。
具体生命周期包括:装载Servlet、服务器创建Servlet实例、服务器调用Servlet的init()方法、客户请求到达服务器、服务器创建请求对象、服务创建相应对象、服务器激活Servlet的service方法,请求对象和响应对象作为service()方法的参数、service()方法获得关于请求对象的信息,处理请求,访问其他资源,获得需要的信息、service()方法可能激活其他方法以处理请求,如doGet(),doPost()

九、HTTP 报文包含内容(

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值