通常行能优化点描述:

本文探讨了Java程序优化的几个关键点:使用StringBuffer而非+号拼接字符串,利用StringTokenizer提高数据分割效率,通过System.arraycopy()优化数组赋值,减少循环体内重复计算,以及ArrayList和LinkedList在查询和插入删除速度上的差异。这些优化技巧可以帮助提升程序性能并理解CPU的局部性原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一:java程序优化

1:字符拼接:(StringBuffer)

对比:  不要+号拼接字符串,用StringBuffer的append来拼接、性能很好

方式一

747bce7fb544e79165ce3e872047f7ac.png

 程序跑起来,大约花费 27687 毫秒。

方式二

使用 StringBuilder 进行拼接字符串。

c36fd4ebf58e0d4858ff91a23c0f0f7c.png

6:cpu的优化点

cpu有:空间局部性和时间局部性两种特性:

   一:空间局部性,当cpu获取数据时,如果这个数据是连续数据,那么cpu会把当前数据和该数据的连续数据读取到cpu的三级缓存中。  那么当下次读取的数据在连续数据中时,就直接在cpu三级缓存中读取就行。减少了读取内存的次数。(在cpu这一层,从内存中读取数据比从cpu的三级缓存中读取数据慢的多)

二:时间局部性

 程序跑起来,大约花费 24 毫秒。

2:数据分割:(StringTokenizer)

    string的split()和字符串分割工具类StringTokenizer

方式一:

经常用 String 提供的 split() 方法来满足业务需求。

05e87aa1e58a89c3cda804a654a6fb53.png

花费大约 3000 多毫秒。

方式二:

采用字符串分割的工具类 StringTokenizer。

 采用 StringTokenizer 完成 split() 同样的数据分割,花费大约 500 毫秒。

3:数组赋值  (System.arraycopy() )

方式一:

a8a5208f041a6d5565b2b32601b05325.png

 方式二:

System.arraycopy() 来完成数组复制

2d9821a5a7f8144faff1d118863be95d.png

 方式一和方式二差距不大,但是数据量大的情况下用System.arraycopy() 好一点

4:关注循环体

方式一:

让程序与少做重复的计算,关注循环体内的代码

ec75995be804edeebd39a3f5c35d5edd.png

花费时间:30毫秒

 方式二:

21170e6bb106e74a477b535a8de37050.png

 花费时间:2毫秒

结论:从循环体中提取重复的代码 到循环体外,可以有效提升系统性能

5:List

List是一个接口,它继承于Collection的接口,它代表着有有序队列,当我们讨论List的时候,一般和Set做比较。

java类中集合类中的关系图,从中了解集合关系

一:ArrayList、 LinkedList 和 Vector之间的区别:
 

ArrayList:底层是数组,可以认为ArrayList是一个可以改变大小的数组,

LinkedList:底层是通过双向链表实现的,LinkedList和ArrayList之前的区别主要是数组和链表的区别。

在内存中:

数组:内存连续,可以通过地址增量获取。

链表:内存多数,不连续。需要比那里。

二:ArrayList和LinkedList对比:ArrayList查询速度比较快

这个和cpu的空间局部性有关:

   一:数组因为数据在内存中连续。所以可以把要查询的数据,并且该数据--连续的数据缓存到cpu的缓存中。

   二:链表在内存中数据不连续,只能去内存中一个个读取

各级别的存储器速度差异非常大,CPU寄存器速度是内存速度的100倍! 这就是为什么CPU产商发明了CPU缓存。 而这个CPU缓存,就是数组和链表的区别的关键所在。

CPU缓存会把一片连续的内存空间读入, 因为数组结构是连续的内存地址,所以数组全部或者部分元素被连续存在CPU缓存里面, 平均读取每个元素的时间只要3个CPU时钟周期。   而链表的节点是分散在堆空间里面的,这时候CPU缓存帮不上忙,只能是去读取内存,平均读取时间需要100个CPU时钟周期。 这样算下来,数组访问的速度比链表快33倍! (这里只是介绍概念,具体的数字因CPU而异)

三:ArrayList和LinkedList对比:LinkedList添加删除比较快

    数组:添加或者删除数据,需要移动后面的所有数据

    链表:只要增加一个节点,通过指针操作,不需要移动后面的元素。

四:ArrayList、 Vector之间的区别

ArrayList和Vector都是通过数组实现的,但是Vector线程安全的,和ArrayList相比,Vector的很多方法都是通过同步(synchronized)处理来保证线程安全。所以一般情况不涉及线程就不用Vector

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值