- Java基础语法与数据类型
- 面向对象编程
- 异常处理
- Java内存管理
- 常用Java库
- 输入输出(I/O)
- 基础多线程
- 基础设计模式
Java基础语法与数据类型
JDK和JRE有什么区别?
JRE指的是Java运行环境,包括JVM,核心类库,和其他支持运行Java程序的文件。
JDK是JRE的超集,是用于开发Java程序的完整开发环境,包含JRE,以及开发、调试和监控Java应用程序的工具。
Java中的基本数据类型和包装数据类型有哪些?
Java提供了八种基本数据类型:byte、short、int、long、double、float、char、boolean。局部变量位于栈上,成员变量位于堆中。占用内存小,效率高,适合频繁操作。当小类型赋值给大类型时,会进行隐式转换,数据不会丢失。当大类型转成小类型时,需显式强制转换,导致精度丢失或溢出。
每个基本数据类型的都对应一个包装类型:Byte、Short、Integer、Long、Double、Float、Character、Boolean。包装数据类型是类,存储在堆中,用于面向对象编程,并且支持null。由于是对象,涉及内存分配和垃圾回收,性能较低。
Java中的StringBuilder是如何实现的?
StringBuilder主要是为了解决String类型对象的不可变性问题。大致的核心实现:内部使用char[]来存储字符序列,通过方法append(),insert()等操作,直接修改内部字符数组,而不是像String那样重新创建对象。每次当数组容量不足时,会通过扩展数组容量来容纳新的字符,按两倍扩容,以减少扩容次数,提高性能。
String和StringBuilder底层都是使用char数组存放,两者有什么区别?
String被final修饰,且内部char[]也是被final修饰,且是immutable类,具有不可变性,保证线程安全。
Java中的final、finally、finalize()各有什么区别?
final是用来修饰类、方法、变量,主要用来设计不可变的类,确保类的安全性、优化性能。(类被final修饰不可继承,方法被final修饰不可重写,变量被final修饰不可重新赋值,常用于定义常量)。
finally与try-catch语句块结合使用,确保无论是否发生异常,finally语句都会执行。一般用于资源的释放,比如数据库连接或文件的关闭。以保证即使发生异常,资源也会正常释放。
finalize()是Object类中的方法,是gc回收资源的一种机制,允许对象在被垃圾回收前进行清理操作。平时使用较少,且不稳定,在JDK9以后该方法已经被标记为废弃。
为什么在Java中编写代码会遇到乱码问题?
主要是因为在字符编码与解码不一致而产生的。如果在编码时使用了一种字符集,而在解码时使用了另一种字符集字符无法显示就会产生乱码。常见的有数据库乱码、默认编码设置、流处理编码问题。
面向对象编程
面向对象的三大特性?
封装:数据被保护在抽象数据类型的内部,尽可能地隐藏内部的细节,只保留一些对外接口使之与外部发生联系。用户无需知道对象内部的细节,但可以通过对象对外提供的接口来访问该对象。
继承:子类可以继承父类,从而获得父类非private方法和属性。
多态(编译时多态、运行时多态):方法重载和方法重写。
接口与抽象类的区别?
一个子类可以继承一个抽象类,但可以实现多个接口。
接口和抽象类的设计动机不同。接口的设计是自上而下的,我们知晓某一行为,基于这些行为定义接口,一些类需要这些行为,因此实现对应接口。
抽象类的设计是自下而上的,我们写了很多类,发现这些类有共性,有很多代码是重复的,因此我们将相同代码逻辑封装成抽象类,减少代码冗余。
接口用于定义行为规范,表示能做什么,interface关键字,定义一组方法而不提供实现。
抽象类用于定义一个类的公共行为和状态,表示是什么,abstrat关键字,提供部分实现和字段,可以有抽象方法和具体方法。
异常处理
Java中Execption和Error有什么区别?
Execption和Error都是Throwable类的子类。Execption表示可以被处理的程序异常,Execption又分为运行时异常和编译时异常。而Error表示系统级别的不可恢复的错误。
throws和throw的区别?
throws是异常的申明,若方法中存在检查异常,如果不对其捕获,那必须在方法头中显式声明该异常,以便于告诉方法调用者此方法存在异常,需要处理。
throw是异常的抛出。如果代码可能会引发某种错误,可以创建一个合适的异常类实例并抛出它,这就是抛出异常。
Java内存管理
类加载生命周期?
常用Java库
平时常用的开发工具库有哪些?
Apache Common是对JDK的扩展,包含了很多的开源工具。Hutool是一个小而全的Java工具类库。Spring常用工具类。
Lombok工具库用来解决什么问题?
我们通常需要编写大量代码才能使类变得有用。toString()方法hashCode() and equals()方法Getter and Setter 方法构造函数对于这种简单的类,这些方法通常是无聊的、重复的,而且是可以很容易地机械地生成的那种东西(ide通常提供这种功能)。