《Java核心密卷36讲》7-8讲学习笔记

本文深入探讨了Java中int与Integer的区别,包括自动装箱拆箱、整型池的使用场景及注意事项。同时,对比分析了Vector、ArrayList与LinkedList在实现方式、读写机制、效率及线程安全性等方面的差异。

目录

int和Integer有什么区别?

对比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可实现基于任务优先级为调度策略的执行调度系统。

评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值