Java基础知识回顾,还记得吗?

发表于:2021-2-26 09:27

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:一角钱技术    来源:今日头条

  面向对象与面向过程的区别
  首先面向过程和面向对象的语言没有具体的性能高下之分,要依据每种语言的设计来做参考。个人认为面向过程和面向对象的最大区别在于:面向过程的语言是结构化的,面向对象的语言是模块化的。模块化的代码比结构化的代码更易于维护,复用与扩展。
  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:(java virtual machine)是java虚拟机。
  ·JRE:(java runtime environment)是java运行时环境。
  ·JDK:(java development kit)是java开发工具包,不仅包含来jre和jvm,还提供来javac编译器和javadoc等其他开发所需工具。
  Java语言的特点
  ·面向对象
  ·平台无关性,也就是跨平台(依靠JVM)
  ·垃圾回收机制(GC)
  ·支持多线程
  ·支持便捷的网络编程
  ·编译和解释(JIT)
  ·安全
  面向对象的特征
  面向对象的三大特征:封装、继承、多态。
  ·封装:封装是隐藏对象属性和实现细节,只对外提供可访问或修改的接口的技术。封装的目的是为了简化编程和增加程序的安全性,使得使用者无需了解对象的具体实现细节。
  ·继承:继承是在已存在的类上定义新的类的技术。在Java中,已存在的类被成为基类(父类),新的类叫派生类(子类)。子类拥有父类所有属性、方法。但是子类对父类中私有的方法或属性并不拥有,并不能访问和使用。继承的目的主要是为零代码的复用。
  ·多态:多态指的是相同类型的对象,调用其相同的方法,参数也相同,但是它的表现形式也就是结果不同。多态的目的是为了程序的可扩展性和维护性。在java中可以使用继承和接口2大特性实现多态。
  重载和重写的区别
  个人认为重载和重写完全没有可比性,不知道为啥老有人喜欢拿图吗做笔记。
  ·重载:重载是描述一个类中有多个方法名相同的方法,但是它们的参数、类型、返回值、参数顺序可能不同,表现形式也就不同。
  ·重写:重写是描述子类对父类的某个方法的逻辑进行重新编写,但重写的只是方法的内容,方法名、参数、类型、顺序、返回值都不变的。
  接口和抽象类的区别
  ·接口需要被实现,而抽象类是需要被继承的。
  ·接口里的方法都是公共抽象的,而抽象类几允许抽象也允许非抽象的方法(在JDK8中,接口被允许定义defalut方法,JDK9中还允许定义private私有方法)。
  ·一个类允许实现多个接口,但只允许继承一个抽象父类。
  ·接口是对类的规范,规范的是行为能力。而抽象类是对类的抽象,抽象的是逻辑。
  Object类方法有哪些?
  ·getClass
  ·equals
  ·hashCode
  ·toString
  ·wait
  ·wait(long):让当前对象进入TIMED_WATING状态
  ·wait(long,int):让当前对象进入TIMED_WATING状态
  ·notify
  ·notifyAll
  ·clone
  ·finalize
  静态属性方法和成员属性方法区别
  静态属性和方法属于类Class,而成员属性和方法属于实例化的对象。
  静态方法只能使用静态方法和静态属性,不能使用成员属性和方法。因为静态属性和方法在对象还没有实例化的时候就存在类。
  简单理解就是不允许一个已经在的事物使用一个不存在的事物。
  子类属性与父类属性初始好顺序
  ·无论如何,静态数据首先加载,所以先初始化父类静态变量和静态初始块(静态变量和静态初始块按源代码编写的顺序执行,普通初始化块和普通成员变量也是如此),再初始化子类静态变量和静态初始化块。
  ·普通初始化块和普通成员变量优先于构造方法,所以接下来加载父类的普通初始化块和普通成员变量,再调用父类构造方法。
  ·调用子类普通代码块,普通变量和构造方法。
  自动拆箱和装箱
  自动拆箱和装箱实际上是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中比较2个对象的值是否相等使用equals,判断2个对象释放是一个对象,使用==。
  ·hashCode方法返回:
  ·equals方法重写要求
  ·自反性:x.equals(x) == true 永远成立
  ·非空性:x.equals(null) == false 永远成立
  ·对称性:如果x.equals(y) == true,那y.equals(x) == true
  ·传递性:如果x.equals(y) == tue,并且y.equals(z) == true,那么一定满足x.equals(z) == true
  ·一致性:如果x.equals(y) == true,那么只要x和y的值不变,那么x.equals(y) == true 永远成立
  ·为什么重写equals方法一定要重写hashcode方法
  在普通环境下(不涉及hash表),equals方法和hashcode方法一毛钱关系没有的,此时重写equals但不重写hashcode是没有关系的。但当使用map、set这些散列表时,它们会根据对象的hashcode来计算对象在散列表中的位置的。试想下,如果2个对象的值相等,但是由于它们是2个对象,hashcode却不相等。 那么即使放入map,set(map)仍会存在重复数据。
  深拷贝和浅拷贝
  ·深拷贝:拷贝所有的内容,除了基本数据类型变量复制一份,连引用类型变量也复制一份。
  ·浅拷贝:复制基本数据类型变量,对于引用类型的变量,直接返回这个引用本身。
  IO流分类
  ·按照流的流向,分为:输入流和输出流。
  ·按照操作单元,分为:字节流和字符流。
  使用字节流还是字符流?
  考虑通用性,应该使用字节流。如果只是文本文件的操作,可以使用字符流。
  BigDecimal
  BigDecimal时Java中表示大浮点数的类型。
  在Java中,如果遇到浮点数的判断,可以使用BigDecimal来做计算,因为如果使用普通数据类型很可能会发生精度丢失的情况,这个时候的结果可能会出乎意料之外。
  Java异常体系结构
  在Java中,异常分为 Exception和Error,这2个类都继承自Throwable。
  ·Exception: Exception异常是程序本身可以处理的。Exception 分为运行时异常(RuntimeException)和 非运行时异常(CheckedException)。
  ·RuntimeException: RuntimeException(运行时异常)是在程序运行时可能会发生的异常,如NullPointException, 这类异常往往是不可预料的,编译器也不会要求你手动try catch或throws。
  ·CheckedException: CheckedException(非运行时异常)是RuntimeException以外的异常,如IOException, 这类异常要求必须显示的try catch或throws , 如果不处理,那么编译就不会通过。
  ·Error: Error错误是程序无法处理的,表示程序或JVM出现了很严重的,无法解决的问题。
  Comparable和Comparator
  ·Comparable: 自然排序接口。实现了它的类意味着就支持排序。
  ·Comparator: 外部比较器。无需让需要排序的对象实现排序逻辑,而是根据Comparator定义的逻辑来排序。 Comparator相较于Comparable更加的灵活。
  为什么要慎用 Arrays.asList()?
  因为Arrays.asList这个方法返回的根本就不是我们期盼的ArrayList, 而是Arrays类内部实现的ArrayList,这个内部类只支持访问和set操作, 并不支持remove,add,clear等修改操作。
  Java中引用的类型
  Java中引用类型总共有四种: 强引用,软引用,弱引用,虚引用。
  ·强引用(Strong Reference): Java程序中绝大部分都是强引用,一般使用new关键字创建的对象就是强引用。 只要强引用存在,强引用的对象就不会被回收,除非不可达(参考jvm部分)
  ·软引用(Soft Reference): 软引用一般不会被回收,但是当堆内存不够的时候, 比如几乎快要发生OOM的时候,就会回收掉软引用对象。
  ·弱引用(Weak Reference): 只要垃圾回收开始,就会回收掉弱引用的对象。
  ·虚引用(Phantom Reference,又称幽灵引用): 和其他几种引用不同,虚引用不决定对象的生命周期, 它在任何时候都可能被回收掉。

  本文内容不用于商业目的,如涉及知识产权问题,请权利人联系博为峰小编(021-64471599-8017),我们将立即处理
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号