JAVA基础理解(二)

一、JAVA基础理解

1、方法重写的规则

参数列表、方法名、返回值类型必须一致;构造方法不能被重写,声明为final的方法不能被重写;声明为static的方法不存在重写(重写和多态联合才有意义),访问权限不能比父类更低,重写之后的方法不能抛出更宽泛的异常;

2、throw 和 throws的区别

throw: throw语句用在方法体内,表示抛出异常,由方法体内的语句处理。

是具体向外抛出异常的动作,所以它抛出的是一个异常实例,执行throw一定是抛出了某种异常。

throws: 是用在方法声明后面,表示如果抛出异常,由该方法调用者来进行异常的处理

throws主要是声明这个方法会抛出某种类型的异常,让它的使用者要知道需要捕获的异常的类型。

throws表示出现异常的一种可能性,并不一定会发生这种异常。

3、抽象类和接口的区别

1、接口中所有的方法隐含的都是抽象的。而抽象类则可以同时包含抽象和非抽象的方法。

2、类可以实现很多个接口,但是只能继承一个抽象类

3、类如果要实现一个接口,它必须要实现接口声明的所有方法。但是,类可以不实现抽象类声明的所有方法,当然,在这种情况下,类也必须得声明成是抽象的。

4、抽象类可以再不提供接口方法实现的情况下实现接口。

5、Java接口中的成员变脸默认是final的。抽象类的可以包含非final 的变量。

6、Java接口中的成员函数默认是public的。抽象类的成员函数可以是private,protected或者是public。

7、接口是绝对抽象的,不可以被实例化(java8已支持在接口中实现默认的方法)。抽象类也不可以被实例化,但是,如果它包含main方法的话是可以被调用的。

4、java的基础类型和字节大小

byte 字节型 8位

short 短整形 16位

int 整形 32位

long 长整形 64位

char 字符型 char 16位

float 浮点型 32位

double 双精度 64位

boolean 布尔型 8位

5、四个访问修饰符合访问级别?

private,default,protected,public

6、String和StringBuffer的区别

String 和 StringBuffer主要区别是性能:String 是不可变对象,每次对String类型进行操作都等同于产生一个新的String对象,然后指向新的String对象。所以尽量不要对String进行大量拼接操作,否则会产生很多临时对象,导致GC开始工作,影响系统性能。StringBuffer是对象本身操作,而不是产生新的对象,因此在有大量拼接的情况下,我们建议使用StringBuffer(线程安全)。

7.HashSet的底层实现是什么?

HashSet的实现是依赖于HashMap的,HashSet的值都是存储在HashMap中的。在HashSet的构造方法中会初始化一个HashMap对象,HashSet不允许值重复。因此,HashSet的值是作为HashMap的key存储在HashMap中,当存储的值已经存在时返回false。

8.HashMap的工作原理是什么。

HashMap内部是是通过一个数组实现的,只是这个数组比较特殊,数组里存储的元素是一个Entry实体(在JAVA8中为Node),这个Entry实体主要包含Key、Value以及一个指向自身的next指针。

HashMap是基于hashing实现的,当进行put操作时,根据传递的key值得到它的hashcode,然后再用这个hashcode 与数组的长度进行模运算,得到一个int值,就是Entry要存储在数组的位置(下标);当通过get方法获取指定key的值时,会根据这个key算出它的hash值(数组下标),根据这个hash值获取数组下标对应的Entry,然后判断Entry里的key,hash值或者通过equals()比较是否与要查找的相同,如果相同,返回value,否则的话,遍历该链表(有可能就只有一个Entry,此时直接返回null),直到找到位置,否则返回null.

HashMap之所有在每个数组元素存储的是一个链表,是为了解决hash冲突问题,当两个对象的hash值相等时,那么一个位置肯定是放不下两个值的,于是HashMap采用链表来解决这种冲突,hash值相等的两个元素会形成一个链表。

9.抽象类的意义

抽象类含义:

  • 为其他子类提供一个公共的类型。

  • 封装子类中重复定义的内容

  • 定义抽象方法,子类虽然有不同的实现,但是定义是一致的。

10.你重写过hashcode和equals方法么

hashCode()的作用是获取哈希码,也称散列码;它实际上是返回一个Int整数。这个哈希码的作用是确定该对象在哈希表中的索引位置。如果两个对象相等,则hashcode一定也是相同的hashcode 值,他们也不一定是相等的因此,equals方法被覆盖过,则hashCode方法也必须被覆盖。

hashCode()的默认行为是对堆上的对象产生独特值。如果没有重写hashCode(),则该class的两个对象无论如何都不会相等(即使这两个对象指向相同的数据)。

11.HashSet 与 TreeSet的区别

HashSet是由一个hash表来实现的,因此,它的元素是无序的。add(),remove(),contains()方法的事件复杂度是O(1).TreeSet是由一个树形的结构来实现的,它里面的元素是有序的。因此,add(),remove(),contains()方法的时间复杂度是0(logn)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章