目录
对比Vector、ArrayList、LinkedList有何区别?
int和Integer有什么区别?
1 int和Integer
JDK1.5引入了自动装箱与自动拆箱功能,Java可根据上下文,实现int/Integer,double/Double,boolean/Boolean等基本类型与相应对象之间的自动转换,为开发过程带来极大便利。
最常用的是通过new方法构建Integer对象。
但是,基于大部分数据操作都是集中在有限的、较小的数值范围,在JDK1.5 中新增了静态工厂方法 valueOf,其背后实现是将int值为-128 到 127 之间的Integer对象进行缓存,在调用时候直接从缓存中获取,进而提升构建对象的性能,也就是说使用该方法后,如果两个对象的int值相同且落在缓存值范围内,那么这个两个对象就是 同一个对象;当值较小且频繁使用时,推荐优先使用整型池方法(时间与空间性能俱佳)。
2 注意事项
[1] 基本类型均具有取值范围,在大数*大数的时候,有可能会出现越界的情况。
[2] 基本类型转换时,使用声明的方式。例:long result= 1234567890 * 24 * 365;结果值一定不会是你所期望的那个值,因为1234567890 * 24已经超过了int的范围,如果修改 为:long result= 1234567890L * 24 * 365;就正常了。
[3] 慎用基本类型处理货币存储。如采用double常会带来差距,常采用BigDecimal、整型(如果要精确表示分,可将值扩大100倍转化为整型)解决该问题。
[4] 优先使用基本类型。原则上,建议避免无意中的装箱、拆箱行为,尤其是在性能敏感的场合,
[5] 如果有线程安全的计算需要,建议考虑使用类型AtomicInteger、AtomicLong 这样的线程安全类。部分比较宽的基本数据类型,比如 foat、double,甚至不能保证更新操作的原子性, 可能出现程序读取到只更新了一半数据位的数值。
对比Vector、ArrayList、LinkedList有何区别?
Vector、ArrayList、LinkedList均为线型的数据结构,但是从实现方式与应用场景中又存在差别。
1 底层实现方式
ArrayList内部用数组来实现;LinkedList内部采用双向链表实现;Vector内部用数组实现。
2 读写机制
ArrayList在执行插入元素超过当前数组预定义的最大值时,数组需要扩容,扩容过程需要调用底层System.arraycopy()方法进行大量的数组复制操作;
在删除元素时并不会减少数组的容量 (如果需要缩小数组容量,可以调用trimToSize()方法);
在查找元素时要遍历数组,对于非null的元素采取equals的方式寻找。
LinkedList在插入元素时,须创建一个新的Entry对象,并更新相应元素的前后元素的引用;
在查找元素时,需遍历链表;
在删除元素时,要遍历链表,找到要删除的元素,然后从链表上将此元 素删除即可。
Vector与ArrayList仅在插入元素时容量扩充机制不一致。
对于Vector,默认创建一个大小为10的Object数组,并将capacityIncrement设置为0;
当插入元素数组大小不够时,如 果capacityIncrement大于0,则将Object数组的大小扩大为现有size+capacityIncrement;如果capacityIncrement<=0,则将Object数组的大小扩大为现有大小的2倍。
3 读写效率
ArrayList对元素的增加和删除都会引起数组的内存分配空间动态发生变化。
因此,对其进行插入和删除速度较慢,但检索速度很快。
LinkedList由于基于链表方式存放数据,增加和删除元素的速度较快,但是检索速度较慢。
4 线程安全性
ArrayList、LinkedList为非线程安全;
Vector是基于synchronized实现的线程安全的ArrayList。
需要注意的是:
单线程应尽量使用ArrayList,
Vector因为同步会有性能损耗;
即使在多线程环境下,我们可以利用Collections这个类中为我们提供的synchronizedList(List list)方法返回一个 线程安全的同步列表对象。
问题回答 利用PriorityBlockingQueue或Disruptor可实现基于任务优先级为调度策略的执行调度系统。
本文深入探讨了Java中int与Integer的区别,包括自动装箱拆箱、整型池的使用场景及注意事项。同时,对比分析了Vector、ArrayList与LinkedList在实现方式、读写机制、效率及线程安全性等方面的差异。





