从初学者到大师的第一个java怎么样

Դ新浪

ߣ优化

19

2021-11-07 21:11:03

43.hashCode()介绍

hash code()的功能是获取hashCode,也称为哈希码;它实际上返回一个整数。此哈希代码的目的是确定对象在哈希表中的索引位置。Hascode()是在JDK的Object.java定义的,这意味着Java中的任何类都包含hascode()函数。

哈希表存储键值对,其特点是可以根据“键”快速检索对应的“值”。这利用了哈希代码!(可以快速找到需要的对象)

44.为什么要有 hashCode

我们以“HashSet 如何检查重复”为例子来说明为什么要有 hashCode:

当您向HashSet添加对象时,HashSet将首先计算该对象的hashcode值,以确定该对象被添加到哪里,同时,它将与其他已经添加的对象的hashcode值进行比较。如果没有匹配的hashcode,HashSet将假设对象不会重复出现。但是,如果找到具有相同hashcode值的对象,将调用equals()方法来检查具有相同hashcode的对象是否真的相同。如果它们相同,HashSet不会让它成功加入。如果不同,它将被散列到另一个位置。(摘自我的Java启蒙《Head first java》第二版)。这样,我们大大减少了等号的数量,相应地也大大提高了执行速度。

hashCode()与equals()的相关规定

如果两个对象相等,那么hashcode必须相同。

两个对象相等,分别对这两个对象调用equals方法返回true。

两个对象具有相同的hashcode值,它们不一定相等

因此,equals 方法被覆盖过,则 hashCode 方法也必须被覆盖

hcode()的默认行为是为堆上的对象生成唯一的值。如果没有重写hashCode(),这个类的两个对象无论如何都不会相等(即使它们指向相同的数据)。

对象的相等与指向他们的引用相等,两者有什么不同?

对象的相等比是存储在内存中的内容是否相等,而引用相等比较是它们所指向的内存地址是否相等。

45.抽象类和接口(Java7)的区别

1.抽象类可以提供成员方法的实现细节,但接口中只能存在公共抽象方法;

2.抽象类中的成员变量可以是各种类型,而接口中的成员变量只能是公共静态最终类型;

3.接口不能包含静态代码块和静态方法,而抽象类可以有静态代码块和静态方法;

4.一个类只能继承一个抽象类,而一个类可以实现多个接口。

46.Java 8的接口新增了哪些特性?

增加了默认方法和静态方法,可以有方法体。

47.重写和重载的区别

重写子类重写父类的可访问方法的实现过程,返回值和参数不可更改。也就是外壳不变,内核重写!

重写的好处是子类可以根据需要定义自己的行为。也就是说,子类可以根据需要实现父类的方法。

重写方法不能引发新的检查异常或比重写方法声明的异常更广泛的异常。

重载位于具有相同方法名和不同参数的类中。返回类型可以相同也可以不同。

每个重载方法(或构造函数)必须有一个唯一的参数类型列表

48.ArrayList和LinkedList有什么区别?

1.数组列表和链表的区别主要来自数组和链表的数据结构的不同。

基于数组实现ArrayList,基于双链表实现LinkedList。另外,LinkedList类不仅是List接口的实现类,还可以根据索引随机访问集合中的元素。此外,LinkedList还实现了Deque接口,这是Queue接口的一个子接口,代表一个双向队列。因此,LinkedList可以作为双向队列、堆栈(参见Deque提供的接口方法)和List集合使用,功能非常强大。

2.由于Array是一种基于索引的数据结构,所以使用index搜索和读取数组中的数据非常快,并且可以直接返回数组中索引位置的元素,因此在随机访问集合的元素方面有很好的性能。获取Array数据的时间复杂度为O(1),但是插入和删除数据的开销非常大,因为它需要移动数组中插入位置之后的所有元素。

3.与ArrayList相比,LinkedList在随机访问集合元素时性能较差,因为需要找到索引在双向列表中的位置,然后返回;但在插入时,删除操作更快。因为与ArrayList不同,LinkedList在数组满的时候不需要改变数组的大小,也不需要将所有的数据重新加载到新的数组中,这是ArrayList最差的情况,在LinkedList中插入或者删除的时间复杂度只有O(n)。ArrayList在插入数据时也需要更新索引(数组末尾除外)。

4.LinkedList需要更多的内存,因为ArrayList的每个索引的位置都是实际数据,而LinkedList中的每个节点都存储实际数据和前后节点的位置。

49.静态代理和动态代理的区别

静态代理中的代理类是在编译时确定的,而动态代理是在JVM运行时动态生成的。与动态代理相比,静态代理的效率相对较高,但静态代理的代码是冗余的,因此接口需要修改,代理类和委托类都需要修改。

50.JDK动态代理和CGLIB动态代理的区别

JDK动态代理只能为实现接口的类生成代理,而不能为类生成代理。

CGLIB是一个类实现的代理,主要生成指定类的子类,并覆盖其中的方法。因为是继承,所以最好不要将这个类或方法声明为final。

佭ϴý Ѷ Media8ý

在线客服

外链咨询

扫码加我微信

微信:juxia_com

返回顶部