1 Java 自带的几种线程池介绍
1.CachedThreadPool(缓存)
介绍:一个缓冲线程池,如果线程池中有更多的线程需求,那么它能根据需求不断新建线程数;当存在空闲线程时,它也能灵活回收线程。
特点:其工作线程的创建数几乎没有限制(<=Integer.MAX_VALUE),这样可以很方便往线程池中添加线程;另外当工作线程有一段时间(default=1min)没有往线程池中提交任务,则该线程将自动终止,然后会被回收。接着又提交了新的任务时,线程池只会新建一个线程,因此也存在较大的线程回收和创建的资源消耗。最值得注意的是,在使用此线程池时,一定要控制好线程数,否则很容易造成巨额数量的线程创建,从而导致系统瘫痪。
2.FixedThreadPool(固定)
介绍:一个指定数量线程的线程池,每提交一个任务就创建一个工作线程,如果工作线程数量达到所设定的线程池线程阈值,就不会再创建新的线程,只会江提交的新任务放入池队列中,等待其他线程释放资源。
特点:此线程池是一个典型 、优秀且应用最多的线程池。具有线程响应速度快,节约创建新线程的资源消耗等优点。但是在线程池中没有运行任何任务时,不会释放资源,浪费了部分系统资源。
3.SingleThreadExecutor(单个)
介绍:一个单线程化的Executor,即相当于只有一个线程的线程池,依赖唯一的线程来执行任务。
特点:由于是单线程的,就可以保证任务的顺序执行,当然也会根据(FIFO,LIFO,优先级)等参数执行。另外还可以避免多线程的抢占资源,不会存在多个活动的线程。
4.ScheduleThreadPool(周期)
介绍:一个定长的线程池,支持定时或周期性的任务执行。
特点:在需要周期性执行固定任务的情况下,能高效准确的完成任务。
2 HashMap和HashTable的区别
HashMap | HashTable | |
---|---|---|
线程安全性 | 不安全 | 安全 |
是否包含contains方法 | 否 | 是 |
key和value是否允许为null | 是,key为null只允许存在最多一个,value不限定。 | 否 |
默认数组长度(org_length) | 64(jdk1.7为16,jdk1.8为64) | 11 |
数组扩容机制 | org_length*2 | org_length*2+1 |
3 TreeSet和HashSet的区别
由于两个都是基于Set方式存储数据的,因此数据都输不允许重复的。
TreeSet | HashSet | |
---|---|---|
实现方式 | 二叉树(红黑树) | hash表 |
数据是否有序 | 有 | 无 |
是否允许有null值 | 否 | 是(最多一个) |
是否要求对象实现hashCode方法 | 否 | 是 |
add()、remove()、contains()方法复杂度 | O(log (n)),还有提供一些排序的方法如:first(),last(),headSet(),tailSet()等 | O(1) |
4 StringBuffer和StringBuilder的区别
1.StringBuffer和StringBuilder类在方法和功能上是完全一致的。
2.String和StringBuffer的区别:和 String 类不同的是,StringBuffer类的对象能够被多次的修改,并且不产生新的对象和占用新的内存空间。这个类似于scala语言中的可变集合和不可变集合。不可变集合Array,List使用++:,–:等方法,加在原有数组前面,会生成新的数组,原有数组不做改变。可变集合ArrayBuffer,ListBuffer可变数组使用++:=,–:=等方法,不会生成新数组,是在原有数组集合上进行更改。
3.StringBuffer是线程安全的,因为其内部大都使用synchronized关键字,而StringBuild没有这个修饰,被认为是线程不安全的。
4.在单线程程序下,StringBuilder效率更快,因为他不需要加锁。而StringBuffer能安全应对多线程问题,因此效率较低。
5 Final、Finally、Finalize的区别
final:java中的修饰符(关键字),有三种用法:修饰变量、方法和类。修饰变量时,该变量使用时不能再进行修改,并且要求在声明时赋予初始值,相当于scala语言中的val,这个被修饰变量就相当于一个常量。修饰方法时,该方法只能被调用,不能在子类中被重写修改。修饰类时,被修饰的类不允许再被其他类继承,即该类不存在任何子类。而被abstract修饰的类一般都需要被子类继承,因此这两个修饰词被视为反义词。
finally:通常出现在异常处理的try…catch结构后面,其修饰的代码块无论前面异常出现和处理与否,只要JVM不关闭,这部分代码块都会被执行。一般把最后需要释放的资源代码放在这个里面,避免资源的占用。
finalize:Object类中定义的方法,Java中允许使用finalize()方法在垃圾收集器将对象从内存清理出去之前做必要的清理工作。这个方法只在GC销毁对象时被调用,可以通过重写finalize()方法更好地执行清理工作和释放系统 资源。
6 ==和equals的区别
== :如果比较的是基本数据类型,那么比较的是变量的值,如果比较的是引用数据类型,那么比较的是地址值(两个对象是否指向同一块内存)。
equals:如果没重写equals方法比较的是两个对象的地址值,如果重写了equals方法后我们往往比较的是对象中的属性的内容。