我知道从Map的keySet()方法返回的Set不保证任何特定的顺序.
我的问题是,它是否保证多次迭代的相同顺序.例如
Map<K,V> map = getMap();
for( K k : map.keySet() )
{
}
...
for( K k : map.keySet() )
{
}
Run Code Online (Sandbox Code Playgroud)
在上面的代码中,假设映射不修改,将迭代在按键组处于相同的顺序.使用Sun的jdk15它会以相同的顺序迭代,但在我依赖于这种行为之前,我想知道所有JDK是否都会这样做.
编辑
我从答案中看到我不能依赖它.太糟糕了.我希望不必为了保证我的订购而建立一些新的收藏品.我的代码需要迭代,执行一些逻辑,然后使用相同的顺序再次迭代.我将从keySet创建一个新的ArrayList,这将保证顺序.
我正在使用ant 1.8.0和java 1.6.0.17而且我遇到了一个奇怪的问题.
在我的build.xml中,我有一个编译代码的简单任务
<javac destdir="${dir.build.classes}" debug="on">
<classpath refid="classpath"/>
<src path="${dir.src.java}"/>
</javac>
Run Code Online (Sandbox Code Playgroud)
在"classpath"中是一个jar,称之为 library.jar
在以后的任务中,我需要添加一些类library.jar,我喜欢这样
<jar destfile="library.jar" update="true" duplicate="fail">
<fileset dir="${dir.build.classes}">
<include name="some/class/files"/>
</fileset>
</jar>
Run Code Online (Sandbox Code Playgroud)
这将失败并显示错误
Unable to rename old file (library.jar) to temporary file
我在javac调用之前和之后调用了handle.exe,我可以确认运行ant的java进程在javac调用期间抓取了一个文件句柄到library.jar,并且它没有放弃它.这导致我后来尝试更新jar失败.
为什么即使在javac任务完成后,ant也会在类路径中保持jar的句柄?
我在数据库中有一些CLOB列,我需要将Base64编码的二进制文件放入.这些文件可能很大,所以我需要流式传输它们,我无法立即读取整个内容.
我正在使用org.apache.commons.codec.binary.Base64InputStream编码,我遇到了问题.我的代码基本上就是这个
FileInputStream fis = new FileInputStream(file);
Base64InputStream b64is = new Base64InputStream(fis, true, -1, null);
BufferedReader reader = new BufferedReader(new InputStreamReader(b64is));
preparedStatement.setCharacterStream(1, reader);
Run Code Online (Sandbox Code Playgroud)
当我运行上面的代码时,我在执行更新期间得到其中一个代码,
java.io.IOException: Underlying input stream returned zero bytes它在InputStreamReader代码中被深深抛出.
为什么这不起作用?在我看来,它reader会尝试从基本的64流中读取,这将从文件流中读取,并且一切都应该是快乐的.