Java基础
一、JDK、JRE、JVM之间的关系?
1、JDK(Java Development Kit):Java开发工具包,提供给Java程序员使用,包含了JRE,同时还包含了编译器javac与自带的调试工具Jconsole、jstack等。
2、JRE(Java Runtime Environment):Java运行时环境,包含了JVM,Java基础类库。是使用Java语言编写程序运行的所需环境。
3、JVM:Java虚拟机,运行Java代码。
二、==和equals的区别
1、==对于基本数据类型,比较的就是值,对于引用数据类型,比较的是他们的内存地址是否为同一地址。
2、equals比较的是对象的内容是否相同。
三、说说final 关键字
1. 修饰变量或字段,表示常量(即不能修改)
2. 修饰类:表示此类不能被继承
3. 修饰方法:表示该方法不能被重写
四、java语言有哪些特点
简单性、面向对象、分布式、健壮性、安全性、体系结构中立、可移植性、解释性、高性能、多线程、动态性等。
五、面向对象和面向过程的区别
- 抽象级别:面向过程主要关注解决问题的步骤和过程,以函数为基本单位,强调算法和流程控制。而面向对象则更关注问题领域中的实体和对象,强调将问题划分为多个相互关联的对象,并通过对象之间的交互来解决问题。
- 数据和行为:面向过程将数据和行为分离,强调数据的处理和操作,而面向对象则将数据和行为封装在一个单元中,即对象,对象包含了自身的状态(数据)和行为(方法)。
- 可重用性和扩展性:面向对象具有良好的可重用性和扩展性,通过继承、封装和多态等机制可以更方便地创建和扩展新功能。而面向过程缺乏这样的机制,代码复用和扩展相对较为困难。
六、instanceof关键字的作用
用于测试一个对象是否是指定类型的实例;(object instanceof class)
七、八大数据类型及封装类
八、java自动装箱与拆箱
自动装箱是 Java 编译器在基本类型和它们对应的包装类之间进行的自动转换。例如,将 int 类型转换为 Integer 类型,将 double 类型转换为 Double 型等等。如果转换以相反的方式进行,则称为拆箱。// 包装类和基本数据类型的相互转换
九、hashCode的作用
hashCode的存在主要是用于查找的快捷性,如Hashtable,HashMap等,hashCode是用来在散列存储结构中确定对象的存储地址的。
十、什么是字节码,采用字节码的好处
字节码是Java等编程语言源代码经过编译器编译后生成的一种中间代码格式,它包含了程序的所有信息,但比机器码更抽象,不能直接被计算机硬件执行。相反,字节码需要在Java虚拟机(JVM)或其他类似的虚拟机上执行,由虚拟机将其转换成特定平台的机器码后再执行。
采用字节码的好处:Java语言通过字节码的方式,在一定程度上解决了传统解释型语言执行效率低的问题,同时又保留了解释型语言可以移植的特点。所以Java程序运行时比较高效,而且,由于字节码并不专对一种特定机器,因此,Java程序无须重新编译便可以在多种不同的计算机上运行。
十一、Object类有哪些常见的方法
详细参考:Object类常见方法_object有哪些方法-CSDN博客
十二、java创建对象有几种方法
1、使用`new`关键字直接创建对象
2、工厂模式(Factory Pattern)
工厂模式是一种创建型设计模式,它提供了一种创建对象的最佳方式。在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。
3、单例模式(Singleton Pattern)
单例模式确保一个类仅有一个实例,并提供一个全局访问点。在单例模式中,对象的创建被封装在类内部,客户端通过类的静态方法获取对象实例。
4. 反射(Reflection)
Java反射API允许程序在运行时检查或修改类的行为。使用反射,可以在运行时动态地创建对象。
5. 序列化与反序列化
在Java中,序列化和反序列化是对象持久化的一种方式,它们分别用于将对象的状态保存到一系列字节中(序列化),以及从字节序列中恢复对象(反序列化)。虽然序列化和反序列化本身不是直接“创建”对象的过程,但它们可以用于在需要时重新构造对象的状态。
序列化
序列化是将对象的状态信息转换为可以存储或传输的形式的过程。在Java中,这通常是通过实现`java.io.Serializable`接口(或`java.io.Externalizable`接口,但后者需要更复杂的实现)来完成的。对象被序列化后,可以将其写入文件、发送到网络上的另一个进程,或者存储在内存中等待后续使用。
反序列化
反序列化是序列化的逆过程,即将序列化后的字节序列转换回原来的对象。通过反序列化,可以从文件中读取对象、从网络上接收对象,或者在程序的其他部分中重新构造对象。
详细参考:
java中创建对象地方式有哪几种?(面试高频)_java创建对象的几种方式-CSDN博客
Java 创建对象的几种方式_java创建对象的几种方式-CSDN博客
十三、获取类class对象的方式有哪些
详细参考:三种获取Class的对象的方法_获取class对象的三种方式-CSDN博客
十四、什么是泛型,泛型有什么作用
详细参考:什么叫泛型?有什么作用?-CSDN博客
十五、重载和重写的区别
十六、String、StringBuffer、StringBuilder的区别
1、String的内容不可修改,StringBuffer与StringBuilder的内容可以修改.
2、StringBuffer与StringBuilder大部分功能是相似的
3、StringBuffer采用同步处理,属于线程安全操作;而StringBuilder未采用同步处理,属于线程不安全操作。
十七、String安全吗
安全,(1)String是一种不可变对象,String类被final修饰(被final修饰意味着不能被继承,有助于确保String类的稳定性和安全性)(2)String类中的字符实际保存在内部维护的value字符数组中,value被修饰被final修饰,表明value自身的值不能改变,即不能引用其它字符数组,但是其引用空间中的内容可以修改。
尽量避免对String的直接修改,如果要修改建议尽量使用StringBuffer或者StringBuilder。
String和StringBuilder最大的区别在于String的内容无法修改,而StringBuilder的内容可以修改。
十八、深拷贝与浅拷贝区别了解吗
十九、抽象类和接口的区别
核心区别: 抽象类中可以包含普通方法和普通字段, 这样的普通方法和字段可以被子类直接使用(不必重写), 而接口中不能包含普通方法, 子类必须重写所有的抽象方法。
详细参考:
抽象类和接口的区别(最详细)_抽象类与接口的区别-CSDN博客
接口和抽象类的区别-CSDN博客
补充:
抽象类和接口
一、抽象类特性:六点
- 抽象类不能直接实例化对象
- 抽象方法不能是 private 的
- 抽象方法不能被final和static修饰,因为抽象方法要被子类重写
- 抽象类必须被继承,并且继承后子类要重写父类中的抽象方法,否则子类也是抽象类,必须要使用 abstract 修饰
- 抽象类中不一定包含抽象方法,但是有抽象方法的类一定是抽象类
- 抽象类中可以有构造方法,供子类创建对象时,初始化父类的成员变量
二、接口
- 在java中,接口可以看成是:多个类的公共规范,是一种引用数据类型。
- 接口不能直接使用,必须有一个“实现类”实现该接口,实现接口中的所有的抽象方法。
三、接口特性:八点
- 接口类型是一种引用类型,但是不能直接new接口的对象
- 接口中每一个方法都是public的抽象方法, 即接口中的方法会被隐式的指定为 public abstract(只能是 public abstract,其他修饰符都会报错)
- 接口中的方法是不能在接口中实现的,只能由实现接口的类来实现
- 重写接口中方法时,不能使用默认的访问权限
- 接口中可以含有变量,但是接口中的变量会被隐式的指定为 public static final 变量
- 接口中不能有静态代码块和构造方法
- 接口虽然不是类,但是接口编译完成后字节码文件的后缀格式也是.class
- 如果类没有实现接口中的所有的抽象方法,则类必须设置为抽象类
- jdk8中:接口中还可以包含default方法。
四、一个类只能继承一个类(只有一个父类),但可以实现多个接口,当一个类实现多个接口时,每个接口中的抽象方法都要实现,否则该类必须设置为抽象类。接口可以多继承接口。