face task
ok题:
1.equals 和== 区别
答:== : 它的作用是判断两个对象的地址是不是相等。即,判断两个对象是不是同 一个对象。(基本数据类型 == 比较的是值,引用数据类型 == 比较的是内存地址)
equals() : 它的作用也是判断两个对象是否相等。但它一般有两种使用情况: 情况1:类没有覆盖 equals() 方法。则通过 equals() 比较该类的两个对象时, 等价于通过“==”比较这两个对象。
情况
2:类覆盖了 equals() 方法。一般,我们都覆盖 equals() 方法来两个对象 的内容相等;若它们的内容相等,则返回 true (即,认为这两个对象相等)。
2.hashmap 原理 和jdk解决重新分配死锁
HashMap实现通过数组加链表,JDK1.8在计算hashcode值时进行了优化,同时也把链表进行升级为红黑二叉树加快结点遍历速度,程序有时执行HashMap的get()方法时会出现卡死(死锁发生)问题,原因是因为扩容时链表部分的指针产生了循环指向引用,导致执行get()遍历到此结点时发生死循环,JDK1.7在扩容时是直接头插法倒叙排一遍,JDK1.8是打乱顺序排一遍,但是如果恰好打乱后的数据某一段顺序和之前一样,还是会出现死锁问题!
https://blog.csdn.net/bibiboyx/article/details/98756621
3.jdk8新特性有哪些
4.currenthashmap 1.8改造
**改进一:取消segments字段,直接采用transient volatile HashEntry<K,V>[] table保存数据,采用table数组元素作为锁,从而实现了对每一行数据进行加锁,进一步减少并发冲突的概率。**
**改进二:将原先table数组+单向链表的数据结构,变更为table数组+单向链表+红黑树的结构。对于hash表来说,最核心的能力在于将key hash之后能均匀的分布在数组中。如果hash之后散列的很均匀,那么table数组中的每个队列长度主要为0或者1。但实际情况并非总是如此理想,虽然ConcurrentHashMap类默认的加载因子为0.75,但是在数据量过大或者运气不佳的情况下,还是会存在一些队列长度过长的情况,如果还是采用单向列表方式,那么查询某个节点的时间复杂度为O(n);因此,对于个数超过8(默认值)的列表,jdk1.8中采用了红黑树的结构,那么查询的时间复杂度可以降低到O(logN),可以改进性能。**
5.reetenlock的公平锁和非公平锁
6.syn同步锁实现原理
7.线程池原理
8.其中Java 面向对象编程三大特性:抽象 封装 继承 多态
面向对象五大基本原则是:单一、开放封闭、里氏替换、依赖倒置、接口分离原则
9.形成死锁的四个必要条件是什么
1. 互斥条件:线程(进程)对于所分配到的资源具有排它性,即一个资源只 能被一个线程(进程)占用,直到被该线程(进程)释放
2. 请求与保持条件:一个线程(进程)因请求被占用资源而发生阻塞时,对 已获得的资源保持不放。
3. 不剥夺条件:线程(进程)已获得的资源在末使用完之前不能被其他线程 强行剥夺,只有自己使用完毕后才释放资源。
4. 循环等待条件:当发生死锁时,所等待的线程(进程)必定会形成一个环 路(类似于死循环),造成永久阻塞
10.创建线程有四种方式:
- 继承 Thread 类;
- 实现 Runnable 接口;
- 实现 Callable 接口;
- 使用 Executors 工具类创建线程池继承 Thread 类