大数据知识点梳理-Java基础

6.1 Java基础

面试指导:
      以下精选了一些大数据面试中常问的Java问题,大数据开发使用的语言最多的是Java,所以在面试中会被问到一些Java核心的问题,需要能够回答。
      其中,Java基础是关于Java的一些基础问题,必须能够回答。多线程和JVM是大数据面试中常问的一些问题,需要能够回答出核心内容。


6.1.1 hashMap底层源码,数据结构

底层结构:

  • jdk7: 数组+链表
  • jdk8: 数组+链表+红黑树

HashMap中维护了Node类型的数组table,初始为null

(1)创建对象时,将加载因子loadFactor初始化为0.75,其他成员保持默认值

(2)添加元素时,相当于putVal方法,需要先将元素的key哈希值获取出来,并且运算得出在数组中存放索引。

  • 如果该索引处没有其他元素,则可以直接存放
  • 如果该索引处有其他元素,则需要先判断是否相等,
  • 如果相等,则覆盖
  • 如果不相等,则继续判断,是否为树结构或链表结构,根据不同结构进行不同处理

(3)如果需要扩容,则进行对应的扩容。

  • 如果第一次添加,则扩容table的capacity 为16, 临界值threshold为12.
  • 如果其他次扩容,则扩容table的capacity为2倍,临界值threshold为2倍.

(4)当链表中节点数>=7 && capacity>=64则将链表变成树结构

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

 

6.1.2面向对象的特征有哪些方面

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

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

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


6.1.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< 索引超出范围>r
      ➢java.lang.ArrayIndexOutOfBoundsException<数组 索引越界>
      ➢java.lang.NumberFormatException<转 换为数值类型异常>
      ➢java.lang.ClassCastException <类型转换异常>广
      ➢java.lang.ArithmeticException <算数异常>

      检查异常(checkedexception):在编译期就显式的通知程序员必须处理
      ➢java.lang.ClassNotFoundException<类 未找到异常>
      ➢java.io.IOException<IO 异常>


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

      JAVA语言编译之后会生成一个.class文件,反射就是通过字节码文件找到某一个类、类中的方法以及属性等。反射的实现主要借助以下四个类: Class: 类的对象,Constructor:类的构造方法,Field: 类中的属性对象,Method: 类中的方法对象。

      作用:反射机制指的是程序在运行时能够获取自身的信息。在JAVA中,只要给定类的名字,那么就可以通过反射机制来获取类的所有信息。
 

6.1.5 HashMap和HashTable区别

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

 

6.1.6 TreeSet和HashSet区别

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

 

6.1.7 String buffer和String build区别

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

 

6.1.8 Final、Finally、 Finalize 区别

      final:修饰符(关键字)有三种用法:
      如果一个类被声明为final, 意味着它不能再派生出新的子类,即不能被继承,因此它和abstract是反义词。
      将变量声明为final,可以保证它们在使用中不被改变,被声明为final的变量必须在声明时给定初值,而在以后的引用中只能读取不可修改。
      被声明为final的方法也同样只能使用,不能在子类中被重写。
      finally:通常放在tr...catch的后面构造总是执行代码块,这就意味着程序无论正常执行还是发生异常,这里的代码只要JVM不关闭都能执行,可以将释放外部资源的代码写在finally块中。
      finalize: Object 类中定义的方法, Java中允许使用finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在销毁对象时调用的,通过重写finalize()方法可以整理系统资源或者执行其他清理工作。

 

6.1.9 ==和Equals区别

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

equals方法是从Object类中继承的,默认的实现就是使用==

 

6.1.10 Java支持的数据类型有哪些?

Java语言支持的8中基本数据类型是:
      ➢byte
      ➢short
      ➢int
      ➢long .
      ➢float
      ➢double
      ➢boolean
      ➢char

什么是自动拆装箱?

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

 

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

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

 

6.1.12Java支持多继承么?

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

 

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

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值