Java中几个常见概念的对比

1 篇文章 0 订阅
1 篇文章 0 订阅

1 Java 自带的几种线程池介绍

1.CachedThreadPool(缓存)

​ 介绍:一个缓冲线程池,如果线程池中有更多的线程需求,那么它能根据需求不断新建线程数;当存在空闲线程时,它也能灵活回收线程。

​ 特点:其工作线程的创建数几乎没有限制(<=Integer.MAX_VALUE),这样可以很方便往线程池中添加线程;另外当工作线程有一段时间(default=1min)没有往线程池中提交任务,则该线程将自动终止,然后会被回收。接着又提交了新的任务时,线程池只会新建一个线程,因此也存在较大的线程回收和创建的资源消耗。最值得注意的是,在使用此线程池时,一定要控制好线程数,否则很容易造成巨额数量的线程创建,从而导致系统瘫痪。

2.FixedThreadPool(固定)

​ 介绍:一个指定数量线程的线程池,每提交一个任务就创建一个工作线程,如果工作线程数量达到所设定的线程池线程阈值,就不会再创建新的线程,只会江提交的新任务放入池队列中,等待其他线程释放资源。

​ 特点:此线程池是一个典型 、优秀且应用最多的线程池。具有线程响应速度快,节约创建新线程的资源消耗等优点。但是在线程池中没有运行任何任务时,不会释放资源,浪费了部分系统资源。

3.SingleThreadExecutor(单个)

​ 介绍:一个单线程化的Executor,即相当于只有一个线程的线程池,依赖唯一的线程来执行任务。

​ 特点:由于是单线程的,就可以保证任务的顺序执行,当然也会根据(FIFO,LIFO,优先级)等参数执行。另外还可以避免多线程的抢占资源,不会存在多个活动的线程。

4.ScheduleThreadPool(周期)

​ 介绍:一个定长的线程池,支持定时或周期性的任务执行。

​ 特点:在需要周期性执行固定任务的情况下,能高效准确的完成任务。

2 HashMap和HashTable的区别

HashMapHashTable
线程安全性不安全安全
是否包含contains方法
key和value是否允许为null是,key为null只允许存在最多一个,value不限定。
默认数组长度(org_length)64(jdk1.7为16,jdk1.8为64)11
数组扩容机制org_length*2org_length*2+1

3 TreeSet和HashSet的区别

由于两个都是基于Set方式存储数据的,因此数据都输不允许重复的。

TreeSetHashSet
实现方式二叉树(红黑树)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方法后我们往往比较的是对象中的属性的内容。

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值