上海博为峰IT培训学校

试听课 + 活动课
填写信息优先获取试听课

位置:学校首页 > 学校动态>上海java工程师培训机构价格多少

上海java工程师培训机构价格多少

上海java工程师培训机构价格多少

博为峰IT培训学校是专业的IT培训机构之一,博为峰51Code在国内率先推出IT就业培训业务,即通过数月的强化培训,使缺乏职场竞争力的学员具备企业级项目执行能力,先后在10余个城市推出Java,软件测试,软件开发线下培训,并推出在线职业教育平台博为峰网校Atstudy,面向全国/国际提供软件测试,软件开发等0基础或进阶类,考证类等课程


Java可变长数组概述

有时我们希望将把数据保存在单个连续的数组中,以便、便捷地访问数据,但这需要调整数组大小或者对其扩展。Java 数组不能调整大小,只用数组不足以达成目标。可变长原始类型数组需要自己实现。本文将展示如何实现 Java 可变长数组。

为什么不用 ArrayList?

要满足文章开头的需求,为什么不使用 Java ArrayList?如果满足下面条件之一,可以使用 ArrayList:

在数组中存储某种对象类型;

在数组中存储原始类型,没有特别的性能或内存要求。

Java ArrayList 类只适用于对象,不适合原始类型(byte、int、long等)。使用 ArrayList 存储原始类型数据,插入 ArrayList 时会自动装箱为对象中,从中取出时会进行拆箱转为原始类型。装箱和拆箱在插入元素和访问元素时会带来额外开销,在尝试针对性能进行优化时,应该避免这些开销(本文是 Java 性能跟踪的一部分)。

不仅如此,这种方式无法确定自动装箱对象在内存中的存储位置。很可能分散存储在堆中各个位置。因此,与原始类型数组相比访问速度要慢得多,前者在内存中连续存储。

另外,原始类型装箱会带来额外的内存开销,例如 long 会存到 Long 对象。

本文源代码

本文实现的 Java 变长数组源代码可以在 GitHub 下载:

github.com/jjenkov/java-resizable-array

代码包含三个 Java 类和两个单元测试。

可变长数组用例

假设有一台服务器接收大小不同的邮件。其中有些邮件很小(小于4KB),另一些很大(1MB 甚至更大)。

如果服务器同时从多个(10万多个)连接接收消息,那么需要为每个消息限制预分配内存。每个缓冲区不能只按值(1MB或16MB)分配内存。当连接和消息数量增加时,这种方式会耗尽服务器内存!100_000 x 1MB = 100GB(这是估计值,帮助问题理解)。

假设大多数消息比较小,一开始可以使用较小的缓冲区。如果消息超出缓存大小,则分配一个更大的新数组,并把数据拷贝到该数组中。如果消息超出分配的新数组,接着分配一个比之前更大的数组,并把消息复制到该数组。

使用这种策略,大多数消息通常只会存入小数组。这意味着服务器内存得到了更有效的利用。100_000 x 4KB (小缓冲) = 400MB大多数服务器应该能够正常处理。即使是 4GB (1_000_000 x 4KB),现在的服务器也能满足要求。

可变长数组设计

可变长数组包含两个组件:

ResizableArray

ResizableArrayBuffer

ResizableArrayBuffer 包含一个大数组。该数组被划分为三个部分。一段用作小数组,一段用作中数组,一段用作大数组。ResizableArray类表示一个可变长数组,底层数据存储在ResizableArrayBuffer中。

通过为小、中、大不同类型数据预留空间,ResizableArrayBuffer 能够确保不会被某种大小的数据塞满。例如,小数据不会占用数组的所有内存,进而阻断中型和大数据存储。同样,接收大数据也不会占用所有内存,进而阻断小数据和中型数据存储。

由于底层存储以小数据开始,如果小数组存储空间耗尽,那么无论中数组或大数组是否还有空间,都无法分配新的数组。可以让使小数组足够大,减小发生这种情况的可能性。

即使小数组已经全部用完,仍然可以把小数据变成中型和大型数据。

优化方案

一种优化方案:只用一个存储块。需要的时候在待扩展的块后面直接分配新块。这样不需要把数据从旧数组拷贝到新数组,可以直接“扩展”存储块容纳旧数据和新数据,新数据直接写入新增的第二个扩展块即可。这样避免了拷贝所有数组数据的情况。

领取试听课
温馨提示:为不影响您的学业,来校区前请先电话或QQ咨询,方便我校安排相关的专业老师为您解答
版权所有:搜学搜课(www.soxsok.com) 技术支持:搜学搜课网