Java面试题总结

本文详细总结了Java面试中的核心知识点,涵盖面向对象、集合、内存管理、反射、注解、多线程、锁机制等多个方面。内容包括Java的三大特性、数据类型与对象的区别、重载与重写、抽象类与接口、反射与自定义注解的用途、内存泄漏与内存溢出的区别、线程池的实现原理等。同时,文章还探讨了线程安全问题,如final、finally、finalize的区别,以及Java集合框架中的List、Set、HashMap和并发容器ConcurrentHashMap的工作原理。最后,文章讨论了JDBC流程和Session管理策略,帮助读者全面理解和掌握Java编程的核心技术。
摘要由CSDN通过智能技术生成

面向对象思想

三大特性
  • 封装
    利用抽象数据类型将数据和基于数据的操作封装在一起,使其构成一个不可分割的独立实体。数据被保护在抽象数据
    类型的内部,尽可能地隐藏内部的细节,只保留一些对外的接口使其与外部发生联系。用户无需关心对象内部的细
    节,但可以通过对象对外提供的接口来访问该对象。

  • 继承
    它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展
    继承实现了 IS-A 关系,例如 Cat 和 Animal 就是一种 IS-A 关系,因此 Cat 可以继承自 Animal,从而获得 Animal 非
    private 的属性和方法。
    继承应该遵循里氏替换原则,子类对象必须能够替换掉所有父类对象。
    Cat 可以当做 Animal 来使用,也就是说可以使用 Animal 引用 Cat 对象。父类引用指向子类对象称为 向上转型
    Animal animal = new Cat();

  • 多态
    多态性(polymorphisn)是允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针。 实现多态,有二种方式,覆盖,重载。

多态分为编译时多态和运行时多态:

编译时多态主要指方法的重载

运行时多态指程序中定义的对象引用所指向的具体类型在运行期间才确定
运行时多态有三个条件:

继承
覆盖(重写)
向上转型
final, finally, finalize 的区别

final 用于声明属性,方法和类, 分别表示属性不可变,,方法不可覆盖,,类不可继承.
finally是异常处理语句结构的一部分,表示总是执行.
finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等. JVM不保证此方法总被调用.

int 和 Integer 有什么区别

int 是 Java 提供的 8 种原始数据类型之一。Java 为每个原始类型提供了封装类,Integer 是 Java 为 int 提供的封装类。 int 的默认值为 0,而 Integer 的默认值为 null,是引用类型,即 Integer 可以区分出未赋值和值为 0 的区别,int 则无法表达出未赋值的情况, Java 中 int 和 Integer 关系是比较微妙的。关系如下:

  • int 是基本的数据类型;
  • Integer 是 int 的封装类;
  • int 和 Integer 都可以表示某一个数值;
  • int 和 Integer 不能够互用,因为他们两种不同的数据类型
重载和重写的区别

重载 Overload:
表示同一个类中可以有多个名称相同的方法,但这些方法的参数列表各不相同(即参数个数或类型不同)。

重写 Override:子类中
表示子类中的方法可以与父类中的某个方法的名称和参数完全相同,通过子类创建的实例对象调用这个方法时,将调用子类中的定义方法,这相当于把父类中定义的那个完全相同的方法给覆盖了,这也是面向对象编程的多态性的一种表现。

子类覆盖父类的方法时,只能比父类抛出更少的异常,或者是抛出父类抛出的异常的子异常,因为子类可以解决父类的一些问题,不能比父类有更多的问题。子类方法的访问权限只能比父类的更大,不能更小。如果父类的方法是private类型,那么,子类则不存在覆盖的限制,相当于子类中增加了一个全新的方法。

抽象类和接口有什么区别

在这里插入图片描述

说说反射的用途及实现

反射的用途
Java 反射机制是一个非常强大的功能,在很多的项目比如 Spring,MyBatis 都都可以看到反射的身影。通过反射机制,我们可以在运行期间获取对象的类型信息。利用这一点我们可以实现工厂模式和代理模式等设计模式,同时也可以解决 Java 泛型擦除等令人苦恼的问题。

反射的实现
获取一个对象对应的反射类

  • 通过 getClass() 方法
  • 通过 Class.forName() 方法
  • 使用 类.class
  • 通过类加载器实现,getClassLoader()
说说自定义注解的场景及实现

登陆、权限拦截、日志处理,以及各种 Java 框架,如 Spring,Hibernate,JUnit 提到注解就不能不说反射,Java 自定义注解是通过运行时靠反射获取注解。实际开发中,例如我们要获取某个方法的调用日志,可以通过 AOP(动态代理机制)给方法添加切面,通过反射来获取方法包含的注解,如果包含日志注解,就进行日志记录。反射的实现在 Java 应用层面上讲,是通过对 Class 对象的操作实现的,Class 对象为我们提供了一系列方法对类进行操作。在 JVM 这个角度来说,Class 文件是一组以 8 位字节为基础单位的二进制流,各个数据项目按严格的顺序紧凑的排列在 Class 文件中,里面包含了类、方法、字段等等相关数据。通过对 Class 数据流的处理我们即可得到字段、方法等数据。

内存泄漏和内存溢出的区别
  • 内存泄露(memory leak ) :程序在申请内存后,无法释放已申请的内存空间就造成了内存泄漏,一次内存泄漏似乎不会有大的影响,但内存泄漏堆
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值