面试题-基础篇
一、方法的重写(override)与重载(overload)区别
重载 | 重写 |
---|
同一个类中,方法名相同,参数列表不同的方法互为重载的方法 | 子类继承父类以后,对父类中同名同参的方法进行覆盖操作叫做方法的重写 | | 子类重写的方法的权限修饰符不得小于父类的 | | 子类重写的方法抛出的异常类型不得大于父类的 | | 子类重写的方法的返回值必须是父类的返回值类型或者父类的子类的返回值类型 | | 不能重写父类声明为 private 的方法 |
二、== 和 equals 的区别
== | equals |
---|
适用于基本数据类型:比较变量的值是否相等 | 只适用于引用数据类型:未重写的情况下等 == 作用一样 | 适用于引用数据类型:比较两个引用的地址是否相等 | 开发中一般重写 equal 方法,用于比较两个对象的实体内容是否相等 |
三、你是怎样理解面向对象的
概念 | 面向对象就是利用编程语言对现实事物进行抽,面向对象具有以下四大特征 |
---|
封装 | 封装的好处就是安全,方便。比如将属性私有化并提供get/set方法,这样外界只能通过get/set方法来操作属性,行为变得可控。比如单例模式,私有化构造器,提供获取实例的方法 | 继承 | 继承的好处就是代码的复用和扩展。继承可以保留父类的属性和方法,同时子类又可以扩展自己的属性和方法 | 多态 | 多态性可以理解为一个事物的多种形态,也就是对象的多样性,多态的好处是提高了代码的通用性和灵活性,父类的引用指向子类的对象 | 抽象 | 抽象是将一类对象的共同特征总结出来构造类的过程,包括数据抽象和行为抽象两方面 |
四、接口和抽象类的区别
抽象类 | 接口 |
---|
抽象类可以定义构造函数 | 接口不可以定义构造函数 | 类是单继承 | 接口是多实现 | 抽象类可以抽象方法和具体的方法 | 接口 JDK8 之前只有抽象方法,JDK8 新增了默认方法和静态方法,JDK9 新增了私有方法 | 抽象类的方法权限可以是 public 默认是 protected | 接口的方法权限可以是任意的 |
五、throws和throw的区别
throw | 表示抛出一个异常类的对象,是生成异常对象的过程,声明在方法体内 |
---|
throws | 属于异常处理的一种方式,声明在方法的声明处 |
六、final、finally、finalize的区别
final | Java 的关键字,修饰类,类不能被继承,修饰方法,方法不能被重写,修饰属性,属性不可变。 |
---|
finally | 异常处理语句结构的一部分,表示最终一定执行的代码 | finalize | Object 类的方法,在垃圾回收时调用 |
七、String和StringBuffer和StringBuilder的区别
String | 不可变字符序列,字符串常量存储在常量池中,属于引用数据类型,底层使用 char 型数组 |
---|
StringBuilder | 可变的字符序列,底层是长度为16的 char 型数组,默认扩容2倍+2,线程不安全 | StringBuffer | 和 StringBuilder类似,但是在方法上加了 synchronized 同步锁,线程安全 | 执行效率 | StringBuilder > StringBuffer > String |
八、Collections和Collection的区别
Collections | 操作 Collection 和 Map 的工具类,提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作 |
---|
Collection | 是集合类的上级接口,子接口主要有Set 和List |
九、ArrayList和LinkedList和Vector的区别
ArrayList | Vector | LinkedList |
---|
线程不安全 | 线程安全 | 线程不安全 | 动态数组 | 动态数组 | 双向链表 | JDK1.7之前底层是默认长度为10的数组,默认扩容1.5倍,JDK1.7之后底层默认是空数组 | 底层默认是长度为10的数组,默认扩容2.0倍 | 当频繁在集合中插入、删除元素时,效率较高,但是查找遍历的效率较低 | 相同点 | 都实现了List接口 | 都存储有序的可重复的数据 |
十、HashMap 的底层原理
HashMap在jdk8中相较于jdk7在底层实现方面的不同:
- new HashMap():底层没创建一个长度为16的数组,首次调用put()方法时,才会在底层创建长度为16的数组
- jdk 8底层的数组是:Node[],而非Entry[]
- jdk7底层结构只:数组+链表。jdk8中底层结构:数组+链表+红黑树。
- 形成链表时,七上八下(jdk7:新的元素指向旧的元素。jdk8:旧的元素指向新的元素)
- 当数组的某一个索引位置上的元素以链表形式存在的数据个数 > 8 且当前数组的长度 > 64时,此时此索引位置上的所数据改为使用红黑树存储。
HashMap底层典型属性的属性的说明:
- DEFAULT_INITIAL_CAPACITY : HashMap的默认容量,16
- DEFAULT_LOAD_FACTOR:HashMap的默认加载因子:0.75
- threshold:扩容的临界值,容量填充因子:16 * 0.75 => 12
- TREEIFY_THRESHOLD:Bucket中链表长度大于该默认值,转化为红黑树:8
- MIN_TREEIFY_CAPACITY:桶中的Node被树化时最小的hash表容量:64
十一、int 和 Integer 有什么区别
Integer | int |
---|
Integer 是引用数据类型,是 int 的包装类 | int 是 java 的一种基本数据类型 | Integer 变量必须实例化后才能使用 | int变量不需要实例化 | Integer 实际是对象的引用,当 new一个 Integer 时,会在堆空间开辟空间 | int 则是在栈中开辟空间或者在方法区中 | Integer的默认值是null | int的默认值是0 |
十二、说说反射的用途及实现
反射的用途:通过反射机制,可以在运行期间获得对象的类型信息,在很多框架中都有使用,比如spring、mybatis,利用反射可以实现工厂模式和代理模式等设计模式。 反射的实现:获取一个对象对应的反射类有四种方法 1. 通过 getClass() 方法 2. 通过 Class.forName(“”) 方法 3. 使用 类.class 4. 通过类加载器实现,getClassLoader()
十三、什么是 java 序列化,如何实现 java 序列化
- 序列化就是一种用来处理对象流的机制。可以对序列化后的对象进行读写操作,也可将序列化的对象传输于网络之间。
- 序 列 化 的 实 现 : 将 需 要 被 序 列 化 的 类 实 现 Serializable 接 口 , 该 接 口 没 有 需 要 实 现 的 方 法 , implements Serializable 只是为了标注该对象是可被序列化的,然后使用一个输出流(如:FileOutputStream)来构造一个ObjectOutputStream(对象流)对象,接着,使用 ObjectOutputStream 对象的 writeObject(Object obj)方法就可以将参数为 obj 的对象写出(即保存其状态),要恢复的话则用输入流。
十四、原生JDBC操作数据库流程
JDBC操作数据库的四大接口
- Connection:程序和数据库的连接,可以进行数据库的交互
- PreparedStatement:负责处理SQL语句以及占位符
- ResultSet:对查询结果集的封装
- DirveManager(类):负责创建数据库连接
JDBC操作数据库流程
- 加载数据库驱动包
- 获取数据库的连接对象
- 获取预处理对象
- 填充占位符
- 执行SQL
- 处理结果集
- 关闭资源
十五、请求转发和重定向的区别
转发(Forward) | 重定向(Redirect) |
---|
转发携带请求参数,共享数据,数据不会丢失 | 重定向不能携带请求参数,不共享数据 | 转发是服务器端的跳转,地址栏不发生改变 | 客户端跳转,地址栏发生改变 | 只能访问 web 应用的内部资源 | 可以访问外部资源 | 效率高 | 效率低 | 只发送一次请求 | 实际发送了两次请求 |
十六、GET和POST的区别
get请求 | post请求 |
---|
请求的数据放到地址栏中,不安全 | 请求的数据放到请求体中,安全 | get 请求是 form 表单的默认方法 | 上传文件必须使用post | 传递的数据的大小有限制 | 传递的数据大小无限制 | 传递文本类型的数据 | 可以传递二进制数据 | 一般用来查询操作 | 一般用在添加查询修改 | 效率高 | 效率低 |
十七、谈谈你对ajax的认识
概念 | 优势 | 特点 |
---|
Ajax是一种创建交互式网页应用的网页开发技术 | 承担了一部分由服务器承担的工作,减少了大用户量下服务器的负载、通过异步模式,提升了用户体验、优化了浏览器和服务器之间的传输,减少了不必要的数据往返 | 可以实现局部刷新,在不更新整个页面的前提下维护数据,提升了用户体验度 |
十八、cookie和Session的区别
Cookie | Sesssion |
---|
存储的数据只能是字符串,数据大小有限制 | 数据类型无限制,数据大小无限制 | 数据放到客户端,不安全 | 数据放到服务器端,安全 | 数据格式是key-value形式 | 数据格式是key-value形式 | 可以设置最大的生命周期(-1) | session底层是通过cookie实现 ,生命周期是一个会话 |
|