分享一下Java(JDK部分)面试心得

1.ArrayList和LinkedList的区别,主要回答存储结构和增删改查的效率。

   答案:ArrayList是基于数组实现的,LinkedList是基于链表实现的,
   			 ArrayList随机查询速度快,LinkedList插入和删除速度快。
   原理解析:
   ArrayList是基于数组实现的,他的特性就是可以使用索引来提升查询效率;插入和删除数组的某个元素,会导致其后面的元素需要重新调整索引,产生一定的性能消耗。
   LinkedList是基于链表实现的,没有索引,所以查询效率不高,但是插入和删除效率却很高;为什么呢?因为链表里插入或删除某个元素,只需要调整前后元素的引用即可。

2.HashSet,TreeSet,以及Set和Map的区别,List和Set的区别。

   HashSet:当向HashSet存入元素时,HashSet会调用该对象的HashCode方法来得到该对象的HashCode值,然后决定该对象在HashSet中的存储位置。
   注意,如果要把一个对象放入HashSet中,重写该对象对应类的equals方法,也应该重写其hashCode()方法。其规则是如果两个对 象通过equals方法比较返回true时,其hashCode也应该相同。另外,对象中用作equals比较标准的属性,都应该用来计算 hashCode的值。
   TreeSet:SortedSet接口的唯一实现类,TreeSet可以确保集合元素处于排序状态。TreeSet支持两种排序方式,自然排序 和定制排序,其中自然排序为默认的排序方式。向TreeSet中加入的应该是同一个类的对象。
   重点:1、TreeSet 是二差树实现的,Treeset中的数据是自动排好序的,不允许放入null值。 
       2、HashSet 是哈希表实现的,HashSet中的数据是无序的,可以放入null,但只能放入一个null,两者        中的值都不能重复,就如数据库中唯一约束。 
      3、HashSet要求放入的对象必须实现HashCode()方法,放入的对象,是以hashcode码作为标识的,    而具有相同内容的 String对象,hashcode是一样,所以放入的内容不能重复。但是同一个类的对象可以放入不同的实例 。
   Set和Map的区别?
   Set是存储对象的,Map是存储键值对的。
   Set存储的元素不能重复,Map存储的键值对是键不能重复。
   Map是无序的。
   Map和Set一样都是关联式容器,底层容器都是红黑树(面试有时候会问)。
   Set和List的区别?
   List有序可以允许重复,Set无序不允许重复。

***3.Map中的HashMap,TreeMap,HashTable,ConcurrentHashMap。


  HashMap:底层数组+链表实现,可以存储null键和null值,线程不安全。Java1.8后是用数组+(链表或红黑树)来实现的。红黑树的存在是为了解决链表过长而优化的。
 HashMap了解 详情可以看:[Right_Boy大佬的分析](https://blog.csdn.net/qq_40118851/article/details/82804510)
  红黑树的介绍可以看[郑学炜大佬的分析](https://blog.csdn.net/u014590757/article/details/80208923)
  HashTable:底层数组+链表实现,无论key还是value都不能为null,线程安全,实现线程安全的方式是在修改数据时锁住整个HashTable,效率低,ConcurrentHashMap做了相关优化。
  ConcurrentHashMap:底层采用分段的数组+链表实现,线程安全。通过把整个Map分为N个Segment,可以提供相同的线程安全,但是效率提升N倍,默认提升16倍。(读操作不加锁,由于HashEntry的value变量是 volatile的,也能保证读取到最新的值。)
  ***4.集合类怎么解决高并发问题?***
   .使用线程安全的Set集合解决高并发。[LAZYNIU大佬实战分析](https://blog.csdn.net/weixin_43317510/article/details/100537587)
   ***5.队列的使用问题***

6.Exception和如何自定义异常?

	Exception:正常程序流程所不能处理或者没有处理的异常情况或异常事件。
	Try-Catch,以及框架中所用的日志输出方法。
	自定义异常:继承Exception类,如果自定义异常是为了提示,一定要用Try-catch,不能直接用throw往外抛,这样子只能被框架捕获。本人所在公司之前都是用RuntimeException或者是抛自定义的异常来获取异常并处理。

7.Object类中的方法

	euqals()方法,hashCode()方法,toString()方法。
	wait() , notify() ,notifyAll()方法。
	wait和Sleep的区别?
	sleep是Thread的静态方法,wait是Object的实例方法。
    wait会释放锁重新进入等待池中,sleep释放cpu片,不会释放锁,等到休眠结束继续执行。
	Object和T类型的区别?
	Object范围非常广,而T从一开始就会限定这个类型(包括它可以限定类型为Object)。
	Object由于它是所有类的父类,所以会强制类型转换,而T从一开始在编码时(注意是在写代码时)就限定了某种具体类型,所以它不用强制类型转换。(之所以要强调在写代码时是因为泛型在虚拟机中会被JVM擦除掉它的具体类型信息,这点可参考泛型,在这里不做引申)。
	实际应用中,例如我们写的工具类,大多用的T类型,因为使用时不需要强转。

8.Java1.8新特性?

	Lambda表达式:
	方法引用::
	接口的默认方法:defaule关键字。
	Stream:
	Optional类:
	时间日期API:(线程安全的)。
	Base64:

9.Map是无序的

基于hash表的,无序的存储结构。
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值