在c/c ++中,必须在创建时指定数组大小的字面数,即int arr[10];.但是在java中,我们可以用这种形式创建一个数组int size = 10; int[] arr = new int[size];.并且编译器不会弄清楚变量大小究竟是什么.那么jvm如何分配数组所需的内存?
Oracle云基础设施始终免费服务文档网站上是这样说的:
所有租户都会获得两个 Always Free Compute 虚拟机 (VM) 实例。
您必须在您的家庭区域中创建始终免费计算实例。
始终免费计算实例形状的详细信息:
VM.Standard.E2.1.Micro 处理器:OCPU 的 1/8,能够使用额外的 CPU 资源
内存:1GB
网络:包括 1 个 VNIC、1 个公共 IP 地址和高达 480 Mbps 的网络带宽
操作系统:您可以选择以下符合“始终免费”资格的操作系统之一:
Oracle Linux(包括 Oracle Autonomous Linux) Canonical Ubuntu Linux CentOS Linux
在我看来,具有一个公共 IP 地址和高达 480 Mbps 网络带宽的 VNIC描述的是网络速度而不是数量限制。因此,问题是一台始终免费的计算设备可以在一个月或一段时间内免费使用多少带宽。
我有一些从companyId识别的不同公司收集的数据点,每个数据点的名称属性可能在一家公司或不同公司之间重复.问题是按名称属性对属于不同公司的所有数据点进行分组,这意味着如果公司已经存在于该组中,我们将忽略该数据点.
例如,数据点是:
companyId数据点名称
1 --------------------- A
1 --------------------- A
1 --------------------- B
2 --------------------- A
3-- -------------------乙
结果将是:
数据点名称组
A =================(1,A)(2,A)
B =================(1,B )(2,B)
我们可以看到公司1的第二个数据点A被忽略了.
据我所知,有两种方法可以进行重复数据删除工作.
1.建立一个Map<String(data point name), Set<Long(companyId)>>
Map<String, Set<Long>> dedup = new HashMap<>();
for(DataPoint dp : datapoints){
String key = dp.getName();
if(!dedup.contains(key)){
dedup.put(key, new HashSet<Long>());
}
if(dedup.get(key).contains(dp.getCompanyId()){
continue;
}
dedup.get(key).add(dp.getCompanyId());
}
Run Code Online (Sandbox Code Playgroud)
2.建立一个大的 Set<String>
Set<String> dedup;
for(DataPoint dp : datapoints){
String key = dp.getName() + dp.getCompanyId();
if(dedup.contains(key)){
continue;
}
dedup.add(key);
}
Run Code Online (Sandbox Code Playgroud)
那么哪一个更好或更合适?
问题是我有一个大vector包含从本地缓存获取的大string内容,包装如下shared_ptr:
std::vector<std::shared_ptr<std::string>>
Run Code Online (Sandbox Code Playgroud)
但我的库 API 之一需要:
void forExample(std::vector<std::string>& data);
Run Code Online (Sandbox Code Playgroud)
在这个库中,数据只会被读取,没有修改,没有内存操作,只是读取。
那么如何在不复制大字符串的情况下正确传递数据,或者有其他更好的建议?如有必要,可以更改库 API 签名。