我想创建一个大的HashMap,但put()性能不够好.有任何想法吗?
其他数据结构建议是受欢迎的,但我需要Java Map的查找功能:
map.get(key)
在我的情况下,我想创建一个包含2600万条目的地图.使用标准Java HashMap,在2-3百万次插入后,放置速率变得无法忍受.
此外,是否有人知道为密钥使用不同的哈希代码分发是否有帮助?
我的哈希码方法:
byte[] a = new byte[2];
byte[] b = new byte[3];
...
public int hashCode() {
int hash = 503;
hash = hash * 5381 + (a[0] + a[1]);
hash = hash * 5381 + (b[0] + b[1] + b[2]);
return hash;
}
Run Code Online (Sandbox Code Playgroud)
我使用add的associative属性来确保相等的对象具有相同的哈希码.数组是字节,其值在0到51之间.值只在一个数组中使用一次.如果a数组包含相同的值(按任意顺序),则对象相等,而b数组则相同.所以a = {0,1} b = {45,12,33}和a = {1,0} b = {33,45,12}是相等的.
编辑,一些说明:
一些人批评使用哈希映射或其他数据结构来存储2600万个条目.我不明白为什么这看起来很奇怪.它看起来像是一个经典的数据结构和算法问题.我有2600万个项目,我希望能够快速将它们插入并从数据结构中查找它们:给我数据结构和算法.
将默认Java HashMap的初始容量设置为2600万会降低性能.
有些人建议使用数据库,在某些其他情况下这绝对是明智的选择.但我真的在问一个数据结构和算法的问题,一个完整的数据库会比一个好的数据结构解决方案过度而且速度慢得多(毕竟数据库只是软件,但会有通信和可能的磁盘开销).
我希望能够在迭代它时从一个集合中删除多个元素.最初我希望迭代器足够智能,以便下面的天真解决方案能够工作.
Set<SomeClass> set = new HashSet<SomeClass>();
fillSet(set);
Iterator<SomeClass> it = set.iterator();
while (it.hasNext()) {
set.removeAll(setOfElementsToRemove(it.next()));
}
Run Code Online (Sandbox Code Playgroud)
但这引发了一场ConcurrentModificationException.
请注意,iterator.remove()将无法正常工作,因为我需要一次删除多个东西.还假设无法识别"动态"删除哪些元素,但可以编写该方法setOfElementsToRemove().在我的特定情况下,它将占用大量内存和处理时间来确定迭代时要删除的内容.由于内存限制,也无法进行复制.
setOfElementsToRemove()将生成一些我想删除的SomeClass实例集,fillSet(set)并将用条目填充集合.
在搜索Stack Overflow之后,我找不到一个很好的解决方案来解决这个问题,但是几个小时后我才意识到以下情况可以解决这个问题.
Set<SomeClass> set = new HashSet<SomeClass>();
Set<SomeClass> outputSet = new HashSet<SomeClass>();
fillSet(set);
while (!set.isEmpty()) {
Iterator<SomeClass> it = set.iterator();
SomeClass instance = it.next();
outputSet.add(instance);
set.removeAll(setOfElementsToRemoveIncludingThePassedValue(instance));
}
Run Code Online (Sandbox Code Playgroud)
setOfElementsToRemoveIncludingThePassedValue()将生成一组要删除的元素,包括传递给它的值.我们需要删除传递的值,因此set将为空.
我的问题是,是否有人有更好的方法这样做,或者是否有支持这种删除的收集操作.
此外,我认为我会发布我的解决方案,因为似乎有需要,我想贡献Stack Overflow的优秀资源.
我使用VPN和Windows远程桌面从我的Win Vista 64家用电脑登录我的Windows XP工作电脑.唯一的问题是,当我下班时,我有时会忘记将所有重要的窗户移到主屏幕上.有没有人知道我可以将窗户移动到主窗口而无法看到它们?到目前为止,我知道如何执行此操作的唯一方法是关闭它们并重新打开,这对于已运行多个小时的测试来说不是一个选项.
我在网上看过一些非免费的桌面管理工具,但我不想付出代价来解决这么简单的问题.
我在Centos 6.4上运行tomcat 6并且已经成功启动它.开始时没有错误.catalina.log读取:
2012-08-11 14:23:42,941 | INFO | main | o.a.c.http11.Http11NioProtocol | Starting Coyote HTTP/1.1 on http-xx.xx.xx.xx-8080
2012-08-11 14:23:42,960 | INFO | main | o.a.catalina.startup.Catalina | Server startup in 121483 ms
Run Code Online (Sandbox Code Playgroud)
并将其ps -x显示为正在运行.
不幸的是,它没有在端口8080上响应,但netstat -atnp | grep LISTEN没有列出它.
任何可能导致这种情况的想法?
我有一个在IIS 6和WCF上运行的.Net服务,我想为它创建两个端点.一个使用HTTPS和基本身份验证进行保护,这些身份验证将从我们的DMZ和一个没有安全性的端点进行访问,只能从内部安全网络访问.防火墙和.Net过滤器将确保在安全网络外无法访问不安全的服务.
到目前为止,我还没有成功地让两个端点使用不同的安全参数.我尝试过的一种配置是:
<service name="My.Service">
<host>
<baseAddresses>
<add baseAddress="http://localhost/MyService/"/>
</baseAddresses>
</host>
<endpoint address="UnSecuredAccessToMyService.svc"
behaviorConfiguration="restBehavior"
name="UnSecureEndpoint"
binding="webHttpBinding"
bindingName="SomeBindingName"
bindingNamespace="http://mydomain/myservice"
contract="Domain.MyService.MyClass" />
<endpoint address="SecuredAccessToMyService.svc"
behaviorConfiguration="secBehavior"
name="SecuredEnpoint"
binding="webHttpBinding"
bindingConfiguration="customSecureBinding"
bindingName="SecBindingName"
bindingNamespace="http://mydomain/myservice"
contract="Domain.MyService.MyClass" />
</service>
<behaviors>
<endpointBehaviors>
<behavior name="restBehavior">
<webHttp />
</behavior>
<behavior name="secBehavior">
</behavior>
</endpointBehaviors>
</behaviors>
<bindings>
<webHttpBinding>
<binding name="customSecureBinding">
<security mode="Transport">
<transport clientCredentialType="Basic"/>
</security>
</binding>
</webHttpBinding>
</bindings>
Run Code Online (Sandbox Code Playgroud)
UnSecuredAccessToMyService.svc和SecuredAccessToMyService.svc文件如下所示:
<%@ ServiceHost
Factory="somefactory, anotherfactory"
Service="My.Service, AnotherService"
%>
Run Code Online (Sandbox Code Playgroud)
我是WCF和.Net的新手,所以额外的细节可以真正帮助,谢谢!
我正在eclipse上的一个大型Java项目上做TDD并且发现它令人沮丧,因为每次我运行测试时我都要等待30秒+以便eclipse进行编译和刷新.我估计80%以上的时间花在刷新上.
有没有办法可以大幅减少它正在做的刷新量?我看过服务器其他类似的问题,但我看不出有什么帮助.
减少编译刷新时间的一种方法是将单元测试和代码拆分为单独的项目.src项目中有4,700个类,测试中有300个.我在Java 1.6.0_17-b04(eclipse.vm)上运行eclipse 3.5.1.我的电脑正在运行带有3.1 gigs可用内存的Windows XP.我安装的唯一插件是subclipse.
我有一个问题,当我从Intellij 15.0.2运行Maven构建时,Maven Resources Plugin不会将我的属性过滤到我的文件中.当我mvn compile从Windows命令行运行时,它确实有效.我的插件配置是:
<properties>
<prop1>aaa</prop1>
<prop2>bbb</prop2>
</properties>
...
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>2.7</version>
<configuration>
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>file1</include>
<include>file2</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
</configuration>
<executions>
<execution>
<phase>compile</phase>
<goals>
<goal>resources</goal>
</goals>
</execution>
</executions>
</plugin>
Run Code Online (Sandbox Code Playgroud) filtering properties intellij-idea maven maven-resources-plugin
您认为在Windows上开发iphone应用程序的最佳方式是什么?您的方法有哪些优点/缺点,为什么将它用于其他选项?您的方法与其他选项有多复杂?
我对独立和网络应用程序更感兴趣,但可以随意讨论游戏图形.
是的我知道你需要在Mac上构建才能将它放在应用程序商店,所以请不要"使用mac"答案.
是否有一般的交叉RDMS,我可以在JDBC插入上自动生成密钥?例如,如果我有一个包含主键,id和int值的表:
create table test (
id int not null,
myNum int null
)
Run Code Online (Sandbox Code Playgroud)
并插入
PreparedStatement statement = connection.prepareStatement("insert into test(myNum) values(?)", Statement.RETURN_GENERATED_KEYS);
statement.setInt(1, 555);
statement.executeUpdate();
statement.close();
Run Code Online (Sandbox Code Playgroud)
我得到一个java.sql.SQLException:无法将值NULL插入列'id'.
我有一种感觉,这完全取决于RDMS.我们使用的是SQL Server 2005,我已经设置好了
CONSTRAINT [PK_test] PRIMARY KEY CLUSTERED
(
[id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 1) ON [PRIMARY]
Run Code Online (Sandbox Code Playgroud)
在桌子上没有运气.
我刚刚意识到我需要在一个方面同步大量的数据收集代码,但性能是一个真正的问题.如果性能下降太多,我的工具将被抛弃.我将单独编写int和long,以及各种数组,ArrayLists和Maps.将有一个应用程序的多个线程将进行将由我的方面拾取的函数调用.我应该注意哪些事情会对绩效产生负面影响?什么代码模式更有效?
特别是我有一种方法可以调用许多其他数据记录方法:
void foo() {
bar();
woz();
...
}
Run Code Online (Sandbox Code Playgroud)
这些方法主要是添加方面字段的递增
void bar() {
f++; // f is a field of the aspect
for (int i = 0; i < ary.length; i++) {
// get some values from aspect point cut
if (some condiction) {
ary[i] += someValue; // ary a field of the aspect
}
}
}
Run Code Online (Sandbox Code Playgroud)
我应该单独同步foo,bar,woz和其他人,还是应该将bar,woz等中的所有代码移动到foo中并同步它?我应该this在特定创建的同步对象上进行同步:
private final Object syncObject = new Object();
Run Code Online (Sandbox Code Playgroud)
(参见这篇文章),或方法中的个别数据元素:
ArrayList<Integer> a = new ArrayList<Integer>();
void bar() {
synchronize(a) { …Run Code Online (Sandbox Code Playgroud)