面向对象和面向过程的区别首先,面向过程和面向对象的语言在性能上没有具体的区别,需要根据各自语言的设计进行参考。个人认为面向过程和面向对象最大的区别在于,面向过程的语言是结构化的,而面向对象的语言是模块化的。模块化代码比结构化代码更容易维护、重用和扩展。OracleJDK与OpenJDK的区别OpenJDK是基于Sun捐赠的HotSpot的源代码开发的,是开源的。OracleJDK是Oracle的商业版JDK,由Oracle发布和维护,因此OracleJDK比OpenJDK更可靠。Java和C++之间的异同Java和C++都是面向对象的语言。Java不提供访问内存的指针,C++运行指针访问内存。垃圾回收机制。Java不需要开发者手动释放内存,因为Java通过垃圾回收机制自动回收内存;C++要求开发者手动释放内存。因此Java在内存管理方面比C++更安全。Java不支持多重继承,而C++支持。JVM、JDK和JRE的区别JVM:(javavirtualmachine)是java虚拟机JRE:(javaruntimeenvironment)是java运行环境JDK:(javadevelopmentkit)是java开发包,不仅包括jre和jvm,它还提供了javac编译器,javadoc等开发所需的工具。Java语言的特点是面向对象和平台无关,即跨平台(依赖于JVM)。垃圾回收机制(GC)支持多线程,支持便捷的网络编程编译解释(JIT)安全的面向对象特性面向对象的三大特性:封装、继承、多态。封装:封装是一种隐藏对象属性和实现细节,只提供外部可访问或可修改接口的技术。封装的目的是为了简化编程,增加程序的安全性,使用户无须知道对象的具体实现细节。继承:继承是在现有类之上定义新类的技术。在Java中,现有类称为基类(父类),新类称为派生类(子类)。子类具有父类的所有属性和方法。但是,子类不拥有父类中的私有方法或属性,不能访问和使用它们。继承的目的主要是为了代码零重用。多态性:多态性是指同一类型的对象,以相同的参数调用相同的方法,但其表现形式是不同的结果。多态的目的是为了程序的可扩展性和可维护性。在java中,可以利用继承和接口两大特性来实现多态。重载和重写的区别个人认为重载和重写是完全没有可比性的。我不知道为什么人们总是喜欢拍照和做笔记。重载:重载描述的是一个类中有多个具有相同方法名的方法,但是它们的参数、类型、返回值、参数的顺序可能不同,它们的表现形式也可能不同。重写:重写是指子类重写父类的一个方法的逻辑,但只重写方法的内容,方法名、参数、类型、顺序、返回值都不变。接口和抽象类的区别接口需要实现,而抽象类需要继承。接口中的方法是publicabstract,抽象类允许抽象和非抽象方法(在JDK8中,接口允许定义defalut方法,JDK9也允许定义private私有方法)。一个类允许实现多个接口,但只允许继承一个抽象父类。接口就是类的规范,规范就是行为能力。抽象类是类的抽象,抽象是逻辑。什么是对象类方法?getClassequalshashCodetoStringwaitwait(long):让当前对象进入TIMED_WATING状态wait(long,int):让当前对象进入TIMED_WATING状态notifynotifyAllclonefinalize静态属性方法和成员属性方法区分静态属性和方法所属类Class,而Member属性和方法属于实例化对象。静态方法只能使用静态方法和静态属性,不能使用成员属性和方法。因为静态属性和方法在对象还没有被实例化的时候就存在于类中。简单的理解就是不允许一个已经存在的东西去使用一个不存在的东西。不管怎样,都是先加载静态数据,所以先初始化父类静态变量和静态初始化块(静态变量和静态初始化块按照源码写的顺序执行,普通初始化块和普通成员变量也是如此),然后初始化子类静态变量和静态初始化块。普通初始化块和普通成员变量优先于构造方法,所以父类的普通初始化块和普通成员变量是其次加载,然后调用父类构造方法。调用子类普通代码块、普通变量和构造函数。自动拆箱和装箱自动拆箱和装箱实际上是Java编译器的语法糖。自动装箱是指将基本数据类型转换为相应包装对象的过程。自动拆箱是指将包装类型转换为对应的基本数据类型。自动装箱实际调用的是类包装类对象的valueof方法,如:Integer.valueof(1)自动拆箱实际调用的是类包装类的xxxValue方法,如:自动装箱时的Integer.intValue(),如果包装类允许缓存,并且值在缓存范围内,那么装箱产生的对象会缓存在常量池中。Integer、Byte、Short、Long、Character封装类型有缓冲池,而其他三种:Float、Double、Boolean则没有缓冲池。包装类的缓存池的缓存范围基本是:-128-127,只不过Character的缓存范围是0-127。为什么String是不可变的呢?先说说我的看法:String并不是Java中最常用的类之一。如果String是可变的,就会出现很多不明确的问题。有很多敏感数据,例如IP地址、个人姓名和电子邮件地址。如果String是可变的,就会出现安全问题,字符串常量池就无从谈起了。String是不可变的,所以它本质上是线程安全的。不可变类的缺点是需要为每个不同的值创建一个对象。String用final修饰,保证String类不能被扩展。String里面的字段是用final修饰的,外部是没办法修改字段的。这就是String不可变的原因。final关键字的作用被final修饰的类不能被继承,该类的所有成员方法都是final的,不能被重写。final修饰的属性变量不能被修改。如果变量是原始数据类型,则初始化后不能修改其值。如果变量是引用类型,那么引用就不能再指向其他对象。final修饰的方法不能被子类覆盖。StringBuilder和StringBuffer的区别StringBuilder和StringBuffer都是可变字符串,但是StringBuilder不是线程安全的。StringBuffer是线程安全的。因此,单线程情况下考虑使用StringBuilder,多线程情况下使用StringBuffer。它们之间的关系就像HashMap和HashTable的关系。equals的知识点==和equals的区别==,如果是基本数据类型,比较的是值,如果是引用数据类型,比较的是对象的内存地址;equals比较对象的值。所以在java中,比较两个对象的值是否相等,用equals,判断两个对象释放的是一个对象,用==。hashCode方法返回:equals方法的重写需要自反性:x.equals(x)==trueisalwaysestablishednon-nullness:x.equals(null)==falsealwaysestablishedsymmetry:ifx.equals(y)==true,theny.equals(x)==true传递性:如果x.equals(y)==true,且y.equals(z)==true,则x.equals(z)==true必须满足一致性:如果x.equals(y)==true,那么只要x和y的值不变,那么x.equals(y)==true就永远为真。为什么重写equals方法的时候一定要重写hashcode方法?在正常环境下(不涉及哈希表),equals方法与hashcode方法无关。这时候重写equals但不重写hashcode也没关系。但是在使用map、set等哈希表时,它们会根据对象的hashcode计算出对象在哈希表中的位置。试想一下,如果2个对象具有相等的值,但由于它们是2个对象,因此哈希码不相等。那么即使放入map中,set(map)中依然会存在重复数据。深拷贝和浅拷贝深拷贝:复制除基本数据类型变量以外的所有内容,甚至包括引用类型变量。浅拷贝:复制基本数据类型变量,对于引用类型变量,直接返回引用本身。IO流分类根据流的流向分为:输入流和输出流。按运算单元分为:字节流和字符流。字节流还是字符流?考虑到通用性,应该使用字节流。如果只是文本文件操作,可以使用字符流。BigDecimalBigDecimal是Java中表示大浮点数的类型。在Java中,如果遇到浮点数,可以使用BigDecimal进行计算,因为如果使用普通数据类型,可能会出现精度损失,此时的结果可能出乎意料。Java异常架构在Java中,异常分为Exception和Error,两者都继承自Throwable。异常:异常是程序本身可以处理的东西。异常分为运行时异常(RuntimeException)和非运行时异常(CheckedException)。RuntimeException:RuntimeException(运行时异常)是程序运行时可能出现的异常,比如NullPointException,这类异常往往是不可预测的,编译器不会要求你手动trycatch或throws。CheckedException:CheckedException(非运行时异常)是RuntimeException以外的异常,如IOException。这种异常需要trycatchorthrows必须显示出来。如果不处理,则编译不通过。Error:Error错误无法被程序处理,说明程序或JVM出现了非常严重且无法解决的问题。Comparable和ComparatorComparable:自然排序接口。实现它的类意味着它支持排序。比较器:外部比较器。不需要让需要排序的对象实现排序逻辑,而是按照Comparator定义的逻辑进行排序。Comparator比Comparable更灵活。为什么要谨慎使用Arrays.asList()?因为Arrays.asList方法返回的根本不是我们期望的ArrayList,而是Arrays类内部实现的ArrayList。该内部类只支持access和set操作,不支持remove、add、clear等修改操作。Java中的引用类型Java中有四种类型的引用:强引用、软引用、弱引用和虚引用。强引用(StrongReference):大多数Java程序都是强引用。通常,使用new关键字创建的对象都是强引用。只要强引用存在,强引用对象就不会被回收,除非不可达(参考jvm部分)软引用(SoftReference):一般不会回收软引用,但是当堆内存还不够,比如几乎会发生OOM的时候,软引用对象就会被回收。弱引用:一旦垃圾回收开始,弱引用对象就会被回收。幻影引用(PhantomReference,又称幽灵引用):与其他类型的引用不同,幻影引用不决定对象的生命周期,随时可能被回收。
