java基础

HashMap底层源码,数据结构

底层结构
jdk:数组+链表
jdk:数组+链表+红黑树

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

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< 索引超出范围>
➢ java.lang.ArrayIndexOutOfBoundsException<数组索引越界> ➢ java.lang.NumberFormatException<转换为数值类型异常> ➢ java.lang.ClassCastException <类型转换异常>
➢ java.lang.ArithmeticException <算数异常>
检查异常(checked exception):在编译期就显式的通知程序员必须处理
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()以及 contains()等方法都是复杂度为 O(1)的方法。
TreeSet 是采用树结构实现(红黑树算法)。元素是按顺序进行排列,但是 add()、remove() 以及 contains()等方法都是复杂度为 O(log (n))的方法。它还提供了一些方法来处理排序的 set, 如 first(), last(), headSet(), tailSet()等。

6.1.7 String buffer 和 String build 区别

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

6.1.8 Final、Finally、Finalize 区别

1.final
final 修饰符(关键字)有三种用法:
如果一个类被声明为 final,意味着它不能再派生出新的子类,即不能被继承,因此它和 abstract 是反义词。
将变量声明为 final,可以保证它们在使用中不被改变,被声明为 final 的变量必须在声 明时给定初值,而在以后的引用中只能读取不可修改。
被声明为 final 的方法也同样只能使用,不能在子类中被重写。
2.finally
通常放在 try…catch 的后面构造总是执行代码块,这就意味着程序无论正常执行还是发 生异常,这里的代码只要 JVM 不关闭都能执行,可以将释放外部资源的代码写在 finally 块 中。
3.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.12 Java 支持多继承么?

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

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值