共计 2474 个字符,预计需要花费 7 分钟才能阅读完成。
1.1 hashMap 底层源码,数据结构
hashMap 的底层构造在 jdk1.7 中由数组 + 链表实现,在 jdk1.8 中由数组 + 链表 + 红黑树实现,以数组 + 链表的构造为例。
JDK1.8之前 Put办法:
JDK1.8之后 Put办法:
1.2 Java 自带有哪几种线程池?
1.2.1、newCachedThreadPool
创立一个可缓存线程池,如果线程池长度超过解决须要,可灵便回收闲暇线程,若无可回收,则新建线程。这种类型的线程池特点是:
工作线程的创立数量简直没有限度(其实也有限度的, 数目为Interger. MAX_VALUE
), 这样可灵便的往线程池中增加线程。
如果长时间没有往线程池中提交工作,即如果工作线程闲暇了指定的工夫(默认为 1 分钟),则该工作线程将主动终止。终止后,如果你又提交了新的工作,则线程池从新创立一个工作线程。
在应用 CachedThreadPool
时,肯定要留神管制工作的数量,否则,因为大量线程同时运行,很有会造成零碎瘫痪。
1.2.2、newFixedThreadPool
创立一个指定工作线程数量的线程池。每当提交一个工作就创立一个工作线程,如果工作线程数量达到线程池初始的最大数,则将提交的工作存入到池队列中。FixedThreadPool
是一个典型且优良的线程池,它具备线程池进步程序效率和节俭创立线程时所耗的开销的长处。然而,在线程池闲暇时,即线程池中没有可运行工作时,它不会开释工作线程,还会占用肯定的系统资源。
1.2.3、newSingleThreadExecutor
创立一个单线程化的 Executor,即只创立惟一的工作者线程来执行工作,它只会用惟一的工作线程来执行工作,保障所有工作依照指定程序 (FIFO, LIFO, 优先级) 执行。如果这个线程异样完结,会有另一个取代它,保障程序执行。单工作线程最大的特点是可保障程序地执行各个工作,并且在任意给定的工夫不会有多个线程是流动的。
1.2.4、newScheduleThreadPool
创立一个定长的线程池,而且反对定时的以及周期性的工作执行,反对定时及周期性工作执行。提早 3 秒执行。
1.3、HashMap 和 HashTable 区别
- 线程安全性不同
HashMap 是线程不平安的,HashTable 是线程平安的,其中的办法是 Synchronize 的,在多线程并发的状况下,能够间接应用 HashTabl,然而应用 HashMap 时必须本人减少同步解决。
- 是否提供 contains 办法
HashMap 只有 containsValue 和 containsKey 办法;HashTable 有 contains、containsKey 和 containsValue 三个办法,其中 contains 和 containsValue 办法性能雷同。
- key 和 value 是否容许 null 值
Hashtable 中,key 和 value 都不容许呈现 null 值。HashMap 中,null 能够作为键,这样的键只有一个;能够有一个或多个键所对应的值为 null。
- 数组初始化和扩容机制
HashTable 在不指定容量的状况下的默认容量为 11,而 HashMap 为 16,Hashtable 不要求底层数组的容量肯定要为 2 的整数次幂,而 HashMap 则要求肯定为 2 的整数次幂。
Hashtable 扩容时,将容量变为原来的 2 倍加 1,而 HashMap 扩容时,将容量变为原来的 2 倍。
1.4 TreeSet 和 HashSet 区别
HashSet 是采纳 hash 表 来实现的。其中的元素没有按顺序排列,add()、remove()以及 contains()等办法都是复杂度为 O(1)的办法。
TreeSet 是采纳 树结构 实现 (红黑树算法)。元素是按程序进行排列,然而 add()、remove() 以及 contains()等办法都是复杂度为 O(log (n))的办法。它还提供了一些办法来解决排序的 set,如 first(), last(), headSet(), tailSet()等等。
1.5 String buffer 和 String build 区别
1、StringBuffer 与 StringBuilder 中的办法和性能齐全是等价的,
2、只是 StringBuffer 中的办法大都采纳了 synchronized 关键字进行润饰,因而是线程平安的,而 StringBuilder 没有这个润饰,能够被认为是线程不平安的。
3、在单线程程序下,StringBuilder 效率更快,因为它不须要加锁,不具备多线程平安而 StringBuffer 则每次都须要判断锁,效率绝对更低
1.6 Final、Finally、Finalize
final:修饰符(关键字)有三种用法:润饰类、变量和办法。润饰类时,意味着它不能再派生出新的子类,即不能被继承,因而它和 abstract 是反义词。润饰变量时,该变量应用中不被扭转,必须在申明时给定初值,在援用中只能读取不可批改,即为常量。润饰办法时,也同样只能应用,不能在子类中被重写。
finally:通常放在 try…catch 的前面结构最终执行代码块,这就意味着程序无论失常执行还是产生异样,这里的代码只有 JVM 不敞开都能执行,能够将开释内部资源的代码写在 finally 块中。
finalize:Object 类中定义的办法,Java 中容许应用 finalize() 办法在垃圾收集器将对象从内存中革除进来之前做必要的清理工作。这个办法是由垃圾收集器在销毁对象时调用的,通过重写 finalize() 办法能够整顿系统资源或者执行其余清理工作。
1.7 == 和 Equals 区别
== : 如果比拟的是根本数据类型,那么比拟的是变量的值
如果比拟的是援用数据类型,那么比拟的是地址值(两个对象是否指向同一块内存)
equals: 如果没重写 equals 办法比拟的是两个对象的地址值。
如果重写了 equals 办法后咱们往往比拟的是对象中的属性的内容
equals 办法是从 Object 类中继承的,默认的实现就是应用 ==