每日五题-java面试题220827


1、“a==b" 和 “a.equals(b)"有什么区别?

如果 a 和 b 都是对象,则 a==b 是比较两个对象的引用,只有当 a 和 b 指向的是堆中的同一个对象才会返回 true,而 a.equals(b) 是进行逻辑比较,所以通常需要重写该方法来提供逻辑一致性的比较。例如,String 类重写 equals() 方法,所以可以用于两个不同对象,但是包含的字母相同的比较。

2、a.hashCode() 有什么用? 与 a.equals(b) 有什么关系?

hashCode() 方法是相应对象整型的 hash值。它常用于基于 hash 的集合类,如 Hashtable、HashMap\LinkedHashMap等等。它与 equals() 方法关系特别紧密。根据 java 规范,两个使用 equal() 方法来判断相等对象,必须具有相同的 hash code。

3、 final、finalize 和 finally 的不同之处?

final 是一个修饰符,可以修饰变量、方法和类。如果final 修饰变量,意味着该变量的值在初始化后不能被该变。finalize 方法是 在对象被回收之前调用的方法,给对象自己最后一个复活的机会,但是什么时候调用 finalize 没有保证。finally 是一个关键字,与 try 和 catch 一起用于异常的处理。 finally 块一定会被执行,无论在 try 块中是否发生异常。

4、java 中的编译期常量是什么?使用它有什么风险?

公共静态不可变(public static final )变量也就是我们所说的编译期常量,这里的 public 可选的。实际上这些变量在编译时会被替换掉,因为编译器知道这些变量的值,并且知道这些变量运行时不能改变。这种方式存在的一个问题是你使用了一个内部的或第三方库中的公有编译时常量,但是这个值后面被其他人改变了,但是你的客户端仍然在使用老的值,甚至你已经部署了一个新的jar。为了避免这种情况,当你在更新依赖 JAR 文件时,确保重新编译你的程序。

5、List、Set、Map和 Queue 之间的区别?

List、Set、Queue 都继承自 Collection 接口,而 Map 则不是(继承自Object),所以容器类有两个根接口,分别 Collection 和 Map, Collection 表示单个元素的集合,Map表示键值对的集合。

List 的 主要特点就是有序性和元素可空性,它维护了元素的特定顺序,其主要实现类有 ArrayList 和 Linklist。 ArrayLIst 底层由数组实现,允许元素随机访问,但是向 ArrayList 列表中间插入或删除元素需要位移复制速度略慢;LinkList 底层由双向链表实现,适合频繁向列表中插入删除元素,随机访问需要遍历所以速度略慢,适合当堆栈、队列、双向队列使用。

Set 的主要特性就是唯一性,存入Set 的每个元素都必须唯一,加入Set 的元素都必须确保对象的唯一性,Set不保证维护元素的有序性,其主要实现类有 HashSet、LinkHashSet、TreeSet。HashSet 是为快速查找元素而设计,存入HashSet的元素必须定义 hashCode 方法,其实质可以理解为是 HashMap的包装类,所以HashSet 的值还是具备可 null 性;LinkHashSet 具备HashSet 的查找速度且通过链表保证了元素的插入顺序(实质为HashSet 的子类),迭代时是有序的,同理存入 LinkHashSet 的元素必须定义hashCode 方法;TreeSet实质是 TreeMap 的包装类,所以TreeSet 的值不具备可null 性,其保证了元素的有序性,底层为红黑树结构,存入TreeSet 的元素必须实现Compareable接口,不过特别注意 EnumSet 的实现和 EnumMap 没有一点关系。

Queue 的主要特性就是队列,其主要的实现类有 LinkedList、PriorityQueue。LinkedList 保证了按照元素的插入顺序进行操作;PriorityQueue 按照优先级进行插入抽取操作,元素可以通过实现Comparable 接口来保证优先顺序。Deque是 Queue 的子接口,表示更为通用的双端队列,有明确的的在头或尾进行查看、添加和删除的方法,ArrayDeque基于循环数组实现,效率更高一些。

Map 自立门户,但是提供了嫁接到 Collection 相关方法,其主要特性就是维护键值对关联和查找特性,其主要实现类有 HashTable、Hashmap、LinkedHashMap、TreeMap。HashTab类似HashMap,但是不允许键为 null 和 值为 null,比HashMap慢,因为为同步操作;HashMap是基于散列列表的实现,其键和值都可以为 null;LinkedHashMap类似HashMap,其键和值都可以为null,其有序性为插入循序或者最近最少使用的次序(LRU算法的核心就是这个),之所以能有序,是因为每个元素还加入到了一个双向链表中;TreeMap 是基于红黑树算法实现的,查看键值对是会被排序,存入的元素必须实现Comparable接口,但是不允许键为 null, 值可以为 null;如果键为枚举类型可以使用专门的是实现类EnumMap,它使用效率更高的数组实现。

从数据结构角度看集合 的区别有如下:

动态数组:ArrayList 内部是动态数组,HashMap 内存的链表数组也是动态扩展的,ArrayDeque 和 PriorityQueue 内部也都是动态扩展的数组。

链表:LinkedList 是用双向链表实现的,HashMap中映射到同一个链表数组的键值对是通过单向链表连接起来的,LinkedHashMap 中每个元素还加入到了一个双向链表中维护插入或访问顺序。

哈希表:HashMap是用哈希表实现的,HashSet,LinkedHashSet 和 LinkedHashMap 基于 HashMap,内部当然也是哈希表。

排序二叉树:TreeMap 是用红黑树(基于排序二叉树)实现,TreeSet内部使用TreeMap,当然也是红黑树,红黑树能保持元素的顺序且综合性能很高。

堆:PriorityQue 是用堆实现的,堆逻辑上是树,物理上是动态数组,堆可以高效地解决一些其他数据结构难以解决的问题。

循环数组:ArrayDeque 是用循环数组实现的,通过头尾变量的维护,实现了高效的队列操作。

位向量:EnumSet 是用位向量实现的,对于只有两种状态且需要进行集合运算的数据使用位向量进行表示、位运算进行处理,精简且高效。

(1条消息) List、Map、Set、Queue的区别与关系_占位符号的博客-CSDN博客_list,set,map,queue区别

源链接-掘金

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值