没有合适的资源?快使用搜索试试~ 我知道了~
首页Java中高级面试题(月薪过万).pdf
资源详情
资源评论
资源推荐

Java 基础
Java 基本类型哪些,所占字节
byte :1 个字节
short :2 个字节
char :2 个字节
int :4 个字节
long :8 个字节
float :4 个字节
double :8 个字节
java 集合以及底层原理
Java 集合框架的根接口有 Collection 和 Map。Collection 根接口包含 List 和 Set 二个子接口。
List 接口
它的特点是:元素有序、且可重复,主要包含三个实现类:ArrayList,vector,LinkedList
ArrayList 的特点:底层是数组,线程不安全,查找快,增删慢(数组的特点)。
ArrayList 的底层实现原理:通过 ArrrayList 空参构造器创建对象。
底层创建一个长度为 10 的数组,当我们向数组中添加 11 个元素时,底层会进行扩容,扩容为原来的 1.5 倍
(创建一个新的数组,长度为原数组长度的 1.5 倍,将原数组复制到新数组中)。
vector 的特点:古老的实现类,底层是数组,线程安全的,JDK1.0 就有了,Vector 总是比 ArrayList 慢,所以尽量
避免使用。
LinkedList 的特点:底层是使用双向链表。增删快,查找慢。
Set 接口
它的特点:
无序性:通过 HashCode 方法算出的值来决定在数组中存放的位置;
不可重复性:进行 equals 方法比较,结果为 true 则两个数据相同,若为 false 则不同。
主要包含三个实现类:HashSet,LinkedHashSet,TreeSet
HashSet 特点:线程不安全,集合元素可以为 null,不能保证元素的排列顺序
HashSet 的底层实现原理:
当向 HashSet 添加数据时,首先调用 HashCode 方法决定数据存放在数组中的位置,该位置上没有其他元素,
则将数据直接存放,若该位置上有其他元素,调用 equals 方法进行比较。若返回 true 则认为两个数据相同,
若返回 false,则以链表的形式将该数据存在该位置上,(jdk1.8)如果数量达到 8 则将链表换成红黑树。

HashSet 的底层就是一个 HashMap,向 HashSet 中添加的数据实际上添加到了 HashMap 中的 key 里。
所以 HashMap 的 key 可以看成是 Set 的集合。
LinkedHashSet 特点:继承了 HashSet,底层实现原理和 HashSet 一样,可以安照元素添加的顺序进行遍历
根据元素的 hashCode 值来决定元素的存储位置,它维护了一张链表该链表记录了元素添加的顺序。
底层就是一个 LinkedHashMap。
TreeSet 特点:底层为红黑树;可以安照指定的元素进行排序;TreeSet 中的元素类型必须保持一致,
底层就是 TreeMap。TreeSet 必须(自然排序)实现 Comparable 接口,重写 compareTo()方法,
按照某个属性进行排序,相结合添加元素或(定制排序)创建一个 Comparator 实现类的对象,
并传入到 TreeSet 的构造器中,按照某个属性进行排序,向集合添加元素。定制排序比自然排序灵活。
如果即有自然排序又有定制排序谁起作用? 定制排序
Map 接口
Map 的特点:
Map 存储的是键值对(key,value),Map 中的 key 是无序的且不可重复的,所有的 key 可以看成是一个 set 集合。
Map 中的 key 如果是自定义类的对象必须重写 hashCode 和 equals 方法,Map 中的 value 是无序的可重复的,
所有的 value 可以看成是 Collection 集合,Map 中的 value 如果是自定义类的对象必须重写 equals 方法,
Map 中的键值对可以看成是一个一个的 Entry.Entry 所存放的位置是由 key 来决定的。
Entry 是无序的不可重复的。主要的实现类:HashMap,LinkedHashMap,TreeMap,HashTable.
HashMap 特点
1.底层是一个数组 + 链表 + 红黑树(jdk1.8)
2.数组的类型是一个 Node 类型
3.Node 中有 key 和 value 的属性
4.根据 key 的 hashCode 方法来决定 Node 存放的位置
5.线程不安全的 ,可以存放 null
HashMap 的底层实现原理:
当我们向 HashMap 中存放一个元素(k1,v1),先根据 k1 的 hashCode 方法来决定在数组中存放的位置。
如果该位置没有其它元素则将(k1,v1)直接放入数组中,如果该位置已经有其它元素(k2,v2),调用 k1 的 equals 方
法和 k2 进行比较。
如果结果为 true 则用 v1 替换 v2,如果返回值为 false 则以链表的形式将(k1,v1)存放,
当元素达到 8 时则会将链表替换成红黑树以提高查找效率。
HashMap 的构造器:new HashMap() :创建一个容量为 16 的数组,加载因子为 0.75。
当我们添加的数据超过 12 时底层会进行扩容,扩容为原来的 2 倍。
LinkedHashMap:继承了 HashMap 底层实现和 HashMap 一样.
可以安照元素添加的顺序进行遍历底层维护了一张链表用来记录元素添加的顺序。
TreeMap 特点:可以对 Key 中的元素安照指定的顺序进行排序 ( 不能对 value 进行排序)
HashTable 特点:线程安全的 ,不可以存放 null,map 中的 key 不能重复,如果有重复的,后者的 value 覆盖前
者的 value
四大作用域和九大内置对象

四大作用域:
page :当前页面有效时间最短(页面执行期)
request :HTTP 请求开始到结束这段时间
session :HTTP 会话开始到结束这段时间
application :服务器启动到停止这段时间
九大内置对象:
request :请求对象 作用域 Request
response :响应对象 作用域 Page
pageContext :页面上下文对象 作用域 Page
session :会话对象 作用域 Session
application :应用程序对象 作用域 Application
out :输出对象 作用域 Page
config :配置对象 作用域 Page
page :页面对象 作用域 Page
exception :例外对象 作用域 page
jsp 和 servlet 的区别
1.jsp 经编译后就变成了 Servlet.(JSP 的本质就是 Servlet,JVM 只能识别 java 的类,
不能识别 JSP 的代码,Web 容器将 JSP 的代码编译成 JVM 能够识别的 java 类)
2.jsp 更擅长表现于页面显示,servlet 更擅长于逻辑控制.
3.Servlet 中没有内置对象,Jsp 中的内置对象都是必须通过 HttpServletRequest 象,
HttpServletResponse 对象以及 HttpServlet 对象得到.
Jsp 是 Servlet 的一种简化,使用 Jsp 只需要完成程序员需要输出到客户端的内容,Jsp 中的 Java 脚本如何镶嵌
到一个类中,由 Jsp 容器完成。
而 Servlet 则是个完整的 Java 类,这个类的 Service 方法用于生成对客户端的响应。
servlet 生命周期
1.加载和实例化
2.初始化
3.请求处理
4.服务终止
加载(服务器启动时,会到 web.xml 文件中去找到 Servlet 文件的配置并创建 servlet 的实例)
→初始化(init()此方法只执行一次) →执行(service(),doGet(),doPost()) →销毁(销毁 destory())
service():
方法本身包含了 doGet()和 doPost().如果服务器发现了 service()方法,则不再执行 doGet(),doPost().
一般不建议去重写父类的 service 方法.因为重写了此方法 doGet 方法和 doPost 方法将得不到利用.
没有 service()方法默认执行 doGet()方法.

cookie 和 session 区别以及 JWT 与 Session 的差异
1、cookie 数据存放在客户的浏览器上,session 数据放在服务器上。
2、cookie 不是很安全,别人可以分析存放在本地的 cookie 并进行 cookie 欺骗,考虑到安全应当使用 session。
3、session 会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,考虑到减轻服务器性能方
面,应当使用 cookie。
4、单个 cookie 保存的数据不能超过 4K,很多浏览器都限制一个站点最多保存 20 个 cookie。
5、可以考虑将登陆信息等重要信息存放为 session,其他信息如果需要保留,可以放在 cookie 中。
1.Session 是在服务器端的,而 JWT 是在客户端的。
2.Session 方式存储用户信息的最大问题在于要占用大量服务器内存,增加服务器的开销。
3.JWT 方式将用户状态分散到了客户端中,可以明显减轻服务端的内存压力。
4.Session 的状态是存储在服务器端,客户端只有 session id;而 Token 的状态是存储在客户端。
JWT 与 OAuth 的区别
OAuth2 是一种授权框架 ,JWT 是一种认证协议。
无论使用哪种方式切记用 HTTPS 来保证数据的安全性
OAuth2 用在使用第三方账号登录的情况(比如使用 weibo, qq, github 登录某个 app)
JWT 是用在前后端分离, 需要简单的对后台 API 进行保护时使用。
Cookie 和 LocalStorage 和 sessionStorage 的区别
转
发和重定向的区别
转发:浏览器地址栏不变,1 次请求,request 请求,可以访问 web-inf,可以共享 request 请求域
数据,只能跳转工程内的资源

重定向:浏览器变化,2 次请求,response 响应,不能访问 web-inf,不可以共享 request 请求域数
据,可以跳转任意资源
饿汉于懒汉单例模式
单例模式设计:
第一步:私有化构造器
第二步:提供一个公共静态返回该类实例对象的方法
饿汉式:先初始化对象,Single 类一进内存,就已经创建好了对象。
class Single{
private Single(){}
private static Single s=new Single();
public static Single getInstance()
{
return s;
}
}
懒汉式:对象是方法被调用时,才初始化,也叫做对象的延时加载。
class Single{ //Single 类进内存,对象还没存在,只有调用了 getInstance 方法时,才建立对象
private Single(){}
private static Single s=null;
public static synchronize Single getInstance()
{
if(s==null){
s=new single();
}
return s;
}
}
操作共享的数据有多条,会出现线程安全问题,在方法加一个同步
过滤器和拦截器的区别
①拦截器是基于 java 的反射机制的,而过滤器是基于函数回调。
②拦截器不依赖与 servlet 容器,过滤器依赖与 servlet 容器。
③拦截器只能对 action 请求起作用,而过滤器则可以对几乎所有的请求起作用。
④拦截器可以访问 action 上下文、值栈里的对象,而过滤器不能访问。
⑤在 action 的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次。
⑥拦截器可以获取 IOC 容器中的各个 bean,而过滤器就不行,这点很重要,在拦截器里注入一个 service,可以调
用业务逻辑。
#和$的区别
剩余97页未读,继续阅读















安全验证
文档复制为VIP权益,开通VIP直接复制

评论0