一、Java SE 篇
1.1 代码块执行
1.1.1 静态代码块,构造代码块,普通方法执行顺序?
答:先执行静态代码块、然后是构造器(先加载父类再子类)、最后普通方法按顺序依次执行。
1.1.2 静态代码块,构造代码块,局部代码块执行顺序?
答:先执行静态代码块,然后执行构造代码块,再执行构造器,最后是局部代码块。
1.1.3 创建对象的时候,构造方法是如何执行的?
- 先执行父类构造器(先执行父类的静态代码块)
- 子类构造器
- set get 方法
- 创建什么对象,打印的this 就是谁
1.2 相似(重写与重载、==与equals、string相关API)
1.2.1 重写与重载的区别?
重载:
- 方法名必须相同
- 形参列表必须不同
- 返回类型没有要求,一般在本类。
- 解决了相同功能方法起名麻烦的问题
重写:(一同,两小,一大)
- 发生到子类和父类之间
- 方法签名必须相同(方法名+形式参数)
- 子类的返回类型是和父类一致或者是比它小
- 子类抛出的异常和父类一致或者比它小
- 子类的修饰符必须大于等于父类的
- 解决子类继承父类,父类方法满足不了我们子类方法要求,需要在子类里面重写该方法。
1.2.2 equals 与 = = 的区别?
-
==是一个比较运算符
-
==既可以判断基本类型,又可以判断引用类型
-
==如果判断基本类型,判断的是值是否相等。
-
==如果判断引用类型,判断的是地址是否相等,即判定是不是同一个对象
-
equals:是Object类中的方法,只能判断引用类型,
-
默认判断的是地址是否相等,子类中往往重写该方法,用于判断内容是否相等。
1.2.3 Stringbuilder 、 StringBuffer 、 String 的区别?**
- Stringbuilder : 非线程安全,单线程使用,速度快
- StringBuffer : 线程安全,多线程使用,速度较快
- String : 速度慢,每次拼接都要创建新的对象
1.3 集合相关
1.3.1 HashTable与HashMap的区别?
- 线程安全:HashMap是非线程安全的,HashTable是线程安全的,因为HashTable中的方法基本都实现了synchronized.
- 效率:HashMap线程不安全,所以相对来说效率较高。
- key-value 类型支持:HashMap的key 允许一个为Null ,但是HashTable的key 和value 都不允许为空。
- 扩容机制:
- HashMap第一次扩容为16,且加载因子为0.75,后面按2倍扩容;HashTable 第一次的容量为11,后面扩容按2倍+1来扩。
- 创建时给定一个默认大小值,HashTable会按照那个值,但是HashMap是扩充为2的幂次方大小(1,2,4,8,16,32…)。
- 底层数据结构:HashMap 是数组 + 链表+ 红黑树,如果链表的长度大于8 并且数组的大小大于64 ,便会树化。HashTable没有这样的机制。
1.3.2 HashMap的的加载因子为什么是 0.75 而不是 0.5 或 1 ?
- 如果加载因子过大,那么它的扩容频率低,浪费的存储空间小,不过发生hash冲突的几率比较大,假如加载因子是1,如果HashMap的大小是128,那么这个容量存储的数据在64- 128 之间,那么这个时间段就更容易造成hash冲突,使得链表的长度较长,从而影响性能。
- 如果加载因子偏小,那么它的扩容频率高,因此会占用更多的空间,但是表就会稀疏,hash冲突的几率就比较小,操作性能就会比较高(如加载因子为0.5,那么HashMap的大小为256时,那么这个容量存储的数据在64 - 128之间,浪费空间有点大)
1.3.3 HashMap的扩容操作是怎么实现的 ?
- 首先判断当前容量是否为空,如果为空,则扩容到16.
- 获取key的hashcode,对hashcode进行扰动处理,计算出元素的下标。
- 根据元素的下标判断是否有hash碰撞,如果没有,则直接放入table表中。
- 如果有hash碰撞,则比较两个key是否相同,相同则覆盖,不相同则以链表的方式插入到尾部(尾插法)。
- 如果插入到尾部以后链表的长度到了8,并且table表的容量已经到达64,则进行树化。
- 插入成功后,如果元素个数到达阈值则进行扩容。
1.3.3 ArrayList和LinkedList的区别 ?
- 数据结构:ArrayList底层是一个动态数组,而LinkedList底层是一个双向链表。
- 随机访问效率:ArrayList随机访问效率比LinkedList高,因为ArrayList是一种线性储存方式,所以移动指针从前往后依次查找即可。
- 插入删除效率:LinkedList比ArrayList效率高,因为ArrayList的操作要影响其它元素的下标。
- 线程安全:它们都是非线程安全的,都没有实现synchronized。
- 内存占用:LinkedList更占内存,因为LinkedList节点中除了储存对象还要存储两个引用,一个指向前一个元素,一个指向后一个元素。
二、JavaWeb篇
2.1 概念及专业术语的理解
2.1.1 Servlet 相关
2.1.1.1 什么是Servlet ?
- Sun ( Oracle )公司制定的一种用来扩展Web服务器功能的组件 规范。
2.1.1.2 什么是组件?
- 在软件开发行业,符合一定规范,实现部分功能,并且需要部署到容器当中才能运行的软件模块。
2.1.1.3 什么是容器?
- 符合一定规范,提供组件运行环境的一个程序。
2.1.2 什么是三层C/S结构,什么是三层B/S结构?
一、三层C/S架构(客户端 + 应用服务器 + DB)即客户端 - web 服务器 - 数据库。
- 其特点:
1、数据库只负责数据的管理
2、应用服务器提供所有的业务逻辑的处理
3、客户端只负责提供操作界面 - 其优点:
1、移植性好,适合大型应用
其缺点:
1、客户端需要单独安装,开发复杂(需要自定义协议,编写客户端和服务器端的通信模块)
二、三层B/S架构(Browser + Web Server + DB)即浏览器 - web服务器 - 数据库
B/S架构的优势:
特点:
1、数据库只负责数据的管理
2、Web服务器负责业务逻辑的处理
3、浏览器负责提供操作页面
优点:
1、不需要单独安装客户端。
2、开发相对于CS简单,客户端和服务器的通信模块都是使用标准的HTTP协议进行通信。
2.1.3 请列出JSP页面9大内置对象及四大域对象?
一、四大域对象为:输入输出对象,作用域通信对象、Servlet对象、异常对象。
- 输入输出对象包括:
1、request:用来请求信息。
2、response:用来响应信息。
3、out:输出的数据流。 - 作用域通信对象包括:
4、session:用于会话。
5、application:是全局的上下文对象。
6、pageContext:是JSP页面上下文。 - Servlet对象包括:
7、page:是JSP页面本身。
8、config:Servlet配置对象。 - 异常对象包括:
9、exception:用于捕获网页异常.
谈谈重定向与转发的区别联系?
区别与联系:
1、重定向是浏览器发送请求并收到响应以后再次向一个新地址发请求,转发是服务器收到请求后为了完成响应转到一个新的地址。
2、重定向中有两次请求对象;不共享数据;转发只产生一次请求对象且在组件间共享数据。
3、重定向后地址栏地址改变;而转发则不会。
4、重定向的新地址可以是任意地址;转发到的新地址必须是同一个应用内的某地址