大数据面试常见Java问题——Java基础

大数据面试常见Java问题——Java基础文章目录Java基础1.HashMap底层源码,数据结构2.面向对象的特征有哪些方面1.继承2.封装3.多态性3.请问error和exception有什么区别?4.请说明一下Java中反射的实现过程和作用分别是什么?5.HashMap和HashTable区别6.TreeSet和HashSet区别7.StringBuffer和StringBuild区别Java基础1.HashMap底层源码,数据结构底层结构:jdk7:数组+链表jdk8:数组+链表+红黑树HashMap中维护了Node类型的

Java基础

1.HashMap 底层源码,数据结构

底层结构:

  • jdk7:数组+链表
  • jdk8:数组+链表+红黑树
    HashMap中维护了Node类型的数组table,初始为null。
  1. 创建对象时,将加载因子loadFactor初始化为0.75,其他成员保持默认值。
  2. 添加元素时,相当于putVal方法,需要先将元素的key哈希值获取出来,并且运算得出在数组中存放索引。
  • 如果该索引处没有其他元素,则可以直接存放。
  • 如果该索引处没有其他元素,则需要先判断是否相等。
  • 如果相等,则覆盖。
  • 如果不想等,则继续判断,是否为树结构或链表结构,根据不同结构进行不同处理。
  1. 如果需要扩容,则进行对应的扩容。
  • 如果第一次添加,则扩容table的capacity为16,临界值threshold为12。
  • 如果其他次扩容,则扩容table的capacity为2倍,临界值threshold为2倍。
  1. 当链表中节点数>=7 && capacity>=64则将链表变成树结构。
    jdk7和jdk8的对比:
结构 table数据类型 初始容量
jdk7 数组+链表 Entry 16
jdk8 数组+链表+红黑树 Node 0

jdk7中创建对象时,则初始化table容量为16(饿汉式)。
jdk8中创建对象时,并没有初始化,而是第一次添加元素初始化table容量为16(懒汉式)。

2.面向对象的特征有哪些方面

1.继承

继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法。对象的一个新类可以从现有的类中派生。这个过程称为类继承。新类继承了原始类的特性,新类称为原始类的派生类(子类),而原始类称为新类的基类(父类)。派生类可以从它的基类那里继承方法和实例变量,并且类可以修改或增加新的方法使之更适合特殊的需要。

2.封装

封装是把过程和数据包围起来,对数据的访问只能通过已定义的界面。面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治,封装的对象,这些对象通过一个受保护的接口访问其他对象。

3.多态性

多态性是指允许不同类的对象对同一消息作出响应。多态性包括参数化多态性和包含多态性。多态性语言具有灵活,抽象,行为共享,代码共享的优势,很好的解决了应用程序函数同名问题。

3.请问error和exception有什么区别?

首先Exception和Error都是继承于Throwable类,在Java中只有Throwable类型的实例才可以被抛出(throw)或者捕获(catch),它是异常处理机制的基本组成类型。Exception和Error体现了Java这门语言对于异常处理的两种方式。Exception是Java程序运行中可预料的异常情况,咱们可以获取到这种异常,并且对这种异常进行业务外的处理。Error是Java程序运行中不可预料的异常情况,这种异常发生以后,会直接导致JVM不可处理或者不可恢复的情况。所以这种异常不可能抓取到,比如OutOfMemoryError,NoClassDefFoundError等。其中的Exception又分为检查性异常和运行时异常(RuntimeException)。两个根本的区别在于,检查性异常,必须在编写代码时,使用try catch捕获(比如:IOException异常)。
运行时异常(RuntimeException)在代码编写时,可以忽略捕获操作(比如:ArrayIndexOutOfBoundsException),这种异常是在代码编写或者使用过程中通过规范可以避免发生的。
运行时异常(RuntimeException):在程序运行时才会出现

  • java.lang.NullPointerException<空指针异常>
  • java.lang.IndexOutOfBoundsException<索引超出范围>
  • java.lang.ArrayIndexOutOfBoundsException<数组索引越界>
  • java.lang.NumberFormatException<转换为数值类型异常>
  • java.lang.ClassCastException<类型转换异常>
  • java.lang.ArithmeticException<算数异常>
    检测异常(checked exception):在编译期就显式的通知程序员必须处理
  • java.lang.ClassNotFoundException<类未找到异常>
  • java.io.IOException<IO 异常>

4.请说明一下Java中反射的实现过程和作用分别是什么?

Java语言编译之后会生成一个.class文件,反射就是通过字节码文件找到某一个类,类中的方法以及属性等。反射的实现主要借助以下四个类:Class:类的对象,Constructor:类的构造方法,Field:类中的属性对象,Method:类中的方法对象。
作用:反射机制指的是程序在运行时能够获取自身的信息。在Java中,只要给定类的名字,那么就可以通过反射机制来获取类的所有信息。

5.HashMap和HashTable区别

  • HashMap:线程不安全的,key和value可以是null。
  • HashTable:线程安全全的,key和values不可以是null,否则会报空指针异常。

6.TreeSet和HashSet区别

HashSet是采用hash表来实现的。其中的元素没有按顺序排列,add(),remove()以及contains()等方法都是复杂度为O(1)的方法。
TreeSet是采用树结构实现(红黑树算法)。元素是按顺序进行排列,但是add(),remove()以及contains()等方法都是复杂度O(log(n))的方法。它还提供了一些方法来处理排序的set,如first(),last(),headSet(),tailSet()等。

7.StringBuffer和StringBuild区别

StringBuffer与StringBuilder中的方法和功能完全是等价的。
只是StringBuffer中的方法大都采用了synchronized关键字进行修饰,因此是线程安全的,而StringBuffer没有这个修饰,可以被认为是线程不安全的。
在单线程程序下,StringBuilder效率更快,因为它不需要加锁,不具备多线程安全。而StringBuffer则每次都需要判断锁,效率相对更低。

8.Final,Finally,Finalize区别

1.final

final修饰符(关键字)有三种方法
如果一个类被声明为final,意味着它不能再派生出新的子类,即不能被继承,因此它和abstract是反义词。
将变量声明为final,可以保证它们在使用中不被改变,被声明为final的变量必须在声明时给定初值,而在以后的引用中只能读取不可修改。
被声明为final的方法也同样只能使用,不能在子类中被重写

2.finally

通常放在try…catch的后面构造总是执行代码块,这就意味着程序无论正常执行还是发生异常,这里的代码只要JVM不关闭都能执行,可以将释放外部资源的代码写在finally块中。

3.finalize

Object类中定义的方法,Java中允许使用finalize()方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在销毁对象是调用的,通过重写finalize()方法可以整理系统资源或者执行其他清理工作。

9.==和Equals区别

  • ==:如果比较的是基本数据类型,那么比较的是变量的值。
  • ==:如果比较的是引用数据类型,那么比较的是地址值(两个对象是否指向同一块内存)。
  • equals:如果没重写equals方法比较的是两个对象的地址值。
  • 如果重写了equals方法后我们往往比较的是对象中的属性的内容。
  • equals方法是从Object类中继承的,默认的实现就是使用==。

10.Java支持的数据类型有哪些?什么是自动拆箱?

Java语言支持的8个基本数据类型是:

  • byte
  • short
  • int
  • long
  • float
  • double
  • boolean
  • char
    自动装箱是Java编译器在基本数据类型和对应的对象包装类型之间的一个转化。比如:把int转化成Integer,double转化成Double,等等。反之就是自动拆箱。

11.Java中的方法覆盖(Overriding)和方法重载(Overloading)是什么意思?

Java中的方法重载发生a在同一个类里面两个或者多个方法的方法名相同但是参数不同的情况。与此相对。方法覆盖是说子类重新定义了父类的方法。方法覆盖必须有相同的方法名,参数列表和返回类型。覆盖者可能不会限制它所覆盖的方法的访问。方法重写又称方法覆盖。若子类中对方法与父类的某一方法具有相同的方法名,返回类型和参数表,则新方法将覆盖原有方法,如需父类中原有的方法,可使用super关键字,该关键字引用了当前类的父类。
Java的方法重载,就是在类中可以创建多个方法,它们具有相同的名字,但具有不同的参数和不同的定义。调用方法时通过传递给它们的不同参数个数和参数类型来决定具体使用哪个方法,这就是多态。重载的时候,方法名要一样,但是参数类型和个数不一样,返回值类型可以相同也可以不相同。无法以返回型别作为重载函数的人区分标准。

12.Java支持多继承么?

不支持,Java不支持多继承。每个类都只能继承一个类,但是可以实现多个接口

13.接口和抽象类的区别是什么?

Java提供和支持创建抽象类和接口。它们的实现有共同f点,不同点在于:

  • 接口中所有的方法隐含的都是抽象的。而抽象类则可以同时包含抽象和非抽象的方法。
  • 类可以实现很多个接口,但是只能继承一个抽象类。
  • 类如果要实现一个接口。它必须要实现接口声明的所有方法。但是,类可以不实现抽象类声明的所有方法,当然,在这种情况下,类也必须得声明成是抽象得。
  • 抽象类可以在不提供接口方法实现的情况下实现接口。
  • Java接口中声明的变量默认都是final的。抽象类可以包含非final的变量。
  • Java接口中的成员函数默认是public的。抽象类的成员函数可以是private,protected或者是public。
  • 接口是绝对抽象的,不可以被实例化。抽象类也不可以被实例化,但是,如果它包含main方法的话是可以被调用的。

今天的文章大数据面试常见Java问题——Java基础分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/11203.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注