一、基础问题
**
1. -------------基础
**
2. Java基本数据类型,所占字节。
Float,4.double,8.byte,1.short,2.int,4.long,8.char,2.Boolean,1
3. 字符窜的分割,替换,查找。
Replace,替换。Split,切割。Match,匹配。
5. List,set,map集合的区别,以及使用效率。
List有放入顺序,元素可重复,set无法拥有重复的元素,内部排序,map保存key-value值,可存多值
6. 浅谈ArrayList、linkedlist和vetor的区别。
1.ArrayList底层由数组实现,插入速度较慢,查询速度快,运行效率高,线程同步。
2.LinkedList:采用的是双向链表的方式进行存储数据的,查询和修改速度慢,但是增加和删除速度快
3.Vector:底层由数组实现,查询慢,增删慢,线程同步。
7. 简述HashMap的工作原理。
在讲插入过程之前,我们先来了解一下哈希表的结构。哈希表底层结构是一个Map.Entry<K,
V>[]数组, 可以先将它简单理解为一个包含键和值的结点的数组。在哈希表中,索引的每个单独的位置叫做桶(bucket)。底层的数组结构保证了哈希表的随机查找⚪(1)。
具体的插入过程如下:
(1)对插入的K值做hashCode()方法,计算该K值的哈希值。
(2)对该哈希值做hash(key)方法,得到该键所映射到的索引。
(3)若该桶(bucket)内无键值对,则直接将键值对加入该桶。若该桶已被填充则以链表的形式添加到链表的第一个位置。(注释:为了插入效率考虑,将该值插入到链表头而不是链表尾,这样保证了插入操作时间复杂度为⚪(1)。而且插入的数据存在就可以了,顺序无所谓(HashMap是无序的))。若单个链表过长(达到默认长度8)为了查找效率会自动转化为红黑树。
(4)若该桶内已有与其相同的key值,则覆盖原有键值对。
7. Session和cookie区别。
Session存放于服务器端一种缓存,一般情况下,服务器在一顶时间内,(默认30分钟)保存这个session,过了时间限制,就会销毁这个session。
Cookiec存放与客户端,是session对象的一种,默认时间跟随浏览器的,不占用服务器资源,若设置有效时间将存储与硬盘上。
8. ==和equals区别。
==号在比较基本数据类型时比较的是值,而用==号比较两个对象时比较的是两个对象的地址值.
equals()方法存在于Object类中,因为Object类是所有类的直接或间接父类,也就是说所有的类中的equals()方法都继承自Object类,而通过源码我们发现,Object类中equals()方法底层依赖的是==号,那么,在所有没有重写equals()方法的类中,调用equals()方法其实和使用==号的效果一样,也是比较的地址值,然而,Java提供的所有类中,绝大多数类都重写了equals()方法,重写后的equals()方法一般都是比较两个对象的值。
9. 重载和重写区别?重载的方法能否更据返回类型进行区分?
方法的重载和重写都是实现多态的方式,区别在于前者实现的是编译时的多态 性,而后者实现的是运行时的多态性。重载发生在一个类中,同名的方法如果 有不同的参数列表(参数类型不同、参数个数不同或者二者都不同)则视为重 载;重写发生在子类与父类之间,重写要求子类被重写方法与父类被重写方法 有相同的返回类型,比父类被重写方法更好访问,不能比父类被重写方法声明 更多的异常(里氏代换原则)。重载对返回类型没有特殊的要求。
10. 抽象类和接口区别。
共同点:
接口和抽象类都不能被实例化,他们都位于继承树的顶端,用于被其他类实现和继承。
接口和抽象类都可以包含抽象方法,实现接口或继承抽象类的普通子类都必须实现这些抽象方法
区别:
1 接口里只能包含抽象方法,静态方法和默认方法,不能为普通方法提供方法实现,抽象类则完全可以包含普通方法。
2 接口里只能定义静态常量,不能定义普通成员变量,抽象类里则既可以定义普通成员变量,也可以定义静态常量。
3 接口不能包含构造器,抽象类可以包含构造器,抽象类里的构造器并不是用于创建对象,而是让其子类调用这些构造器来完成属于抽象类的初始 化操作。
4 接口里不能包含初始化块,但抽象类里完全可以包含初始化块。
5 一个类最多只能有一个直接父类,包括抽象类,但一个类可以直接实现多个接口,通过实现多个接口可以弥补Java单继承不足。
11. 讲讲java的反射机制。
在运行过程中获得类、对象、方法的所有信息。
反射就是程序运行期间JVM会对任意一个类洞悉它的属性和方法,对任意一个对象都能够访问它的属性和方法。
-
Servlet生命周期,详细说说。
默认情况下 servlet在用户第一次访问的时候,执行init()方法,创建servlet对象。之后不会创建新的对象,servlet是单例的! 在服务器关闭的时候 执行destory()方法销毁实例。 servlet因为是单例的,所以存在线程安全问题,尽量避免使用公共变量! 如果需要servlet在服务器启动的时候实例化,需要在web.xml中配置一下。 <load-on-startup>
13. Http协议的了解。
HTTP协议(HyperTextTransfer Protocol,超文本传输协议)是用于从WWW服务器传输超文本到本地浏览器的传送协议。它可以使浏览器更加高效,使网络传输减少。它不仅保证计算机正确快速地传输超文本文档,还确定传输文档中的哪一部分,以及哪部分内容首先显示(如文本先于图形)等。
14. 引用传递和值传递。
值传递:(形式参数类型是基本数据类型):方法调用时,实际参数把它的值传递给对应的形式参数,形式参数只是用实际参数的值初始化自己的存储单元内容,是两个不同的存储单元,所以方法执行中形式参数值的改变不影响实际参数的值。
引用传递:(形式参数类型是引用数据类型参数):也称为传地址。方法调用时,实际参数是对象(或数组),这时实际参数与形式参数指向同一个地址,在方法执行中,对形式参数的操作实际上就是对实际参数的操作,这个结果在方法结束后被保留了下来,所以方法执行中形式参数的改变将会影响实际参数。
具体参考(https://blog.csdn.net/the_dying_man/article/details/73261546)
15. Map集合的循环遍历(2种方法)
共四种方法,以下是其中两种:
// 遍历方法之一 treemap keySet()遍历
for (Object o : tempMap.keySet()) {
System.out.println("key=" + o
+ " value=" + tempMap.get(o));
}
System.out.println("11111");
// JDK1.5中,应用新特性For-Each循环遍历方法之二
for (Map.Entry<String, Integer>
entry : tempMap.entrySet()) {
String key = entry.getKey().toString();
String value =
entry.getValue().toString();
System.out.println("key=" +
key + " value=" + value