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类中继承的,默认的实现就是应用==

关注我的公众号【宝哥大数据】,更多干货等你来。。。