Java优点
跨平台性:一次编译,随处运行,由于JVM,Java文件编译成class文件之后可以随处运行;
内存管理:JVM自动进行垃圾回收,无需手动释放内存
Java的类是单继承的,C++是多继承
Java不提供指针直接访问内存,程序内存更加安全
支持多线程
强大的生态环境:很多标准类库以及对应的框架
面向对象:面向对象的编程语言,程序设计更加结构化和模块化
JVM、JRE、JDK之间的关系
JVM:Java虚拟机,Java程序需要运行在虚拟机上,不同的平台有自己的虚拟机,保证Java语言可以实现跨平台性。编译成.class字节码文件之后,不需要面向特定的处理器,只要在虚拟机上运行即可。
.java文件---->编译器----->.class文件----->虚拟机,解释器----->二进制机器码------>程序运行
JRE:Java运行时环境,需要包括Java虚拟机以及核心类库,核心类库主要是Java.lang包,包括Java程序运行时不可缺少的系统类,比如基本数据类型、线程等。
JDK:给开发人员使用,包括了Java开发工具比如(javac:编译器,编译为字节码文件;jdb:Java调试器;jar:部署工具)和JRE,有了JDK之后,就不需要JRE了。
Oracle JDK在JVM上的性能更好,但不开源,Open JDK开源。
JDK>JRE>JVM.
基本数据类型和引用类型
byte、short、int、long、float、double、boolean、char
除了基本数据类型其他都是引用类型,包括数组,类,接口,string等
Java语言采用何种编码方案?有何特点?
采用Unicode编码,每个字符都有唯一的数值。
访问修饰符 private,default、protected,public的 区别
分别可以被当前类、同包、子类、其他包访问
this关键字、super关键字以及这两个关键字的区别是什么?
this是对当前对象的引用,能够调用当前类的构造函数、方法和属性
super是对当前对象父类的引用,用于调用父类的构造器、方法和属性
他们都是指代对象,不能使用在static修饰的内容里。
static
意义:为Java提供了在类级别上操作属性和方法的能力,不需要实例化对象,在类加载的过程中就能被创建。可以用于共享状态和常量存储。
作为关键字可以修饰变量、方法、代码块。被static修饰的内容,与类相关联而不是与实例对象关联,优于对象加载的,在类加载的时候就被初始化,没有实例化也可以访问。静态方法可以通过类名.静态方法名()调用,静态只能访问静态,非静态可以访问静态和非静态。
静态方法中不能有super和this()方法,因为这两者是针对对象而言的,而静态方法是在类加载时就被初始化,静态不能访问非静态。
面向对象的三大特性
封装:将对象的属性和方法捆绑在一起,并隐藏对象内部的具体实现细节,只通过提供的方法和属性供外部访问,这样能够避免外部干扰和不恰当使用。
继承:允许一个类继承另一个类的属性和方法。可以定义新的内容也可以使用父类的方法,但不能选择性继承父类。提高了代码的重用性、为实现多态提供了基础。
多态:父类或接口的引用对象可以指向子类或具体实现类的实例化对象。一个引用变量具体用的是什么方法,要在程序运行期间才能决定。
实现多态的方式:
继承:子类继承父类,并且可以重写覆盖父类的一些方法。
方法重写:子类对父类的方法进行重写,调用子类的实现
接口:类通过实现接口确保遵循特定的约定或规范,不同的类可以以不同的方式实现接口,从而实现多态。
方法重载:同一个类中,存在参数列表不一样的多个同名方法,允许方法以多种形式存在。
抽象类和接口的区别
1、都不能实例化,但抽象类允许有构造函数,接口不能有构造函数。
2、抽象类是单继承的,一个类只能继承一个抽象类,但可以实现多个接口。
3、访问修饰符,抽象类中的方法可以是任意访问修饰符,但接口中的方法默认是public修饰符,不能是private或protected。
4、抽象类是对子类的抽象,包括行为和属性。为不同的子类提供一个公共的基类,而接口是对类的行为的抽象,是一种规范,定义外部可以调用的行为,不涉及如何实现。
5、抽象类可以有默认方法实现,Java8之后,接口也可以包含默认方法和静态方法。
创建一个对象用什么关键字?对象实例与对象引用有何不同?
静态变量与实例变量的区别?
静态变量被static修饰,存储在方法区,而实例变量存在堆内存中;
静态变量的生命周期跟类的生命周期一样,实例变量的生命周期跟对象一致,如果对象被回收,实例对象也会销毁;
静态变量在类加载的时候被初始化,只会初始化一次,可以在类级别上被操作,实例变量是创建实例对象的时候被初始化,可以被初始化多次,只能通过实例对象来操作。
静态方法和实例方法同理,且实例方法可以访问静态成员变量。
== 和 equals 的区别是什么?
hashCode 与 equals
为什么equals重写必须重写hashcode?
对象的相等与指向他们的引用相等,两者有什么不同?
值传递和引用传递之间的区别?
Java中IO流分为几种?
BIO,NIO,AIO 有什么区别?
BIO:blocking IO,同步阻塞IO,一当线程发起IO请求操作时,它会被阻塞,不能执行其他任务,直至IO操作完成。
NIO:none-blocking IO,同步非阻塞IO,指一个线程可以管理多个IO请求,处理IO请求的时候,线程不会被一直阻塞,可以去执行别的操作,通过轮询的方式去查看IO操作是否完成。
AIO:异步IO,通过回调的方式实现高效IO,完全异步,线程发起IO之后无需等待可以立即返回,并执行其他任务,IO操作完成时,系统会自动通知线程进行处理。
反射机制是什么?优缺点?实现方式?应用场景?为什么框架需要反射?
Java反射机制在程序运行的过程中,可以动态地获取一个类的属性和方法信息,可以动态地调用对象地属性和方法,这种动态获取类的信息和调用对象属性方法的功能称为Java语言的反射机制。
优点:运行期间判断,可以动态加载,提高代码的灵活性;减少代码重复,不必为每个可能用到的对象类型写特定的代码。
缺点:性能开销:Java反射比直接Java方法调用要慢,通过反射可以访问和修改私有字段和方法,破坏了封装性,也增大了安全风险。
使用方式:Class<?> clazz = str.getclass() / Class.forName() / 类名.class。
使用场景:JDBC连接数据库时使用class.forname()加载驱动程序;spring中通过xml配置装在bean对象,将配置文件加载到内存中,实现类的实例化、属性赋值;动态代理:“Proxy”类通过反射创建动态代理实例,在AOP面向切面编程中,通过反射创建动态代理对象执行增强逻辑,并且委托目标对象执行原始代码逻辑从而实现动态增强。
框架反射:框架主要是为了灵活性和动态性,反射机制允许框架灵活适应各种场景;框架配置和依赖注入,通过xml配置装配bean;代理和拦截,反射可以和代理结合,这样能够实现方法调用的拦截、事务管理、日志记录等。
什么是字符串常量池?String类型为什么是不可变的?
答:字符串常量池位于堆内存中,专门用来存储字符串常量,可以提高内存使用率,避免开辟多余空间存储相同的字符串,创建字符串时,JVM会首先检查字符串常量池,如果已经存在会返回它的引用,如果不存在,实例化一个放入池中,返回其引用。
数组有没有 length()方法?String 有没有 length()方法?
String和StringBuffer、StringBuilder的区别是什么?String 为什么是不可变的?
基本数据类型和包装类型之间的转换
答:通过拆箱和装箱实现,Integer num = Integer.valueof(3) int b =num.intValue();
基本数据 | 字节 | 包装类型 | 常量池范围 |
char | 2 | Character | \u0000 到 \u007F(前128个) |
byte | 1 | Byte | -128 到 127 |
short | 2 | Short | -128 到 127 |
int | 4 | Integer | -128 到 127 |
long | 8 | Long | -128 到 127 |
double | 8 | Double | 无 |
float | 4 | Float | 无 |
bool | 1 | Boolean | true + false |
为了提升性能和减少不必要的对象大量创建,包装类型引入了缓存机制,缓存范围如上表所示。
new关键字产生的变量在堆内存中,每次new都会产生一个新的对象,即使内容一样也会重新分配新的内存空间。
常量池中获取的对象用==比较时,返回的是同一个引用地址,所以结果为true
包装类型的对象和基本数据类型比较时,会进行自动拆箱,如果在常量池中存在,会返回存在的那个引用地址。
hashmap中用string类型当作key有什么好处?
答:
如何理解Java的注解?解决了什么问题?
Java注解和AOP之间有什么区别?
使用目的:Java提供的一种元数据机制,允许在代码中添加额外的信息。
使用场景:注解常用于数据配置、校验等功能,AOP则主要用于日志记录、事务管理、性能监控等。
工作机制:注解本身不会执行任何代码,要使注解生效,需要注解处理器来解析并执行一些动作;AOP通过代码或字节码操作会对原有的代码进行修改,添加一些新的功能。两者应该会结合使用。
Exception 和 Error 有什么区别?
答:都是Java中用于处理异常情况的,都是Throwable的子类,都可以用throw关键字抛出并通过try catch捕获。
目的和性质:Exception通常代表了程序可以并且应该处理的问题,往往是由程序的某种逻辑错误或非预期情况导致,如尝试打开一个不存在的文件;error代表了更严重的问题,通常是JVM内部错误或者资源耗损严重。
针对exception,程序应该尝试捕获并处理,做出操作,针对error,不应尝试捕获,而是应该停止运行或记录日志进行分析。