使用Java(1.6)是否最好在List上调用clear()方法或者只是重新实例化引用?
我有一个ArrayList,其中填充了未知数量的对象并定期"刷新" - 处理对象并清除列表.刷新后,List再次填满.冲洗是在随机时间发生的.列表中的数字可能很小(对象的10个)或大的(数百万个对象).
那么"flush"调用clear()或new ArrayList()会更好吗?
是否值得担心这类问题,还是我应该让VM担心呢?我怎样才能看看Java的内存占用为我自己做这类事情?
任何帮助非常感谢.
我无法理解这个for循环如何在JavaScript中终止:
var files = ["A", "B"];
for (var i = 0, f; f = files[i]; i++) {
console.log(f);
}
Run Code Online (Sandbox Code Playgroud)
运行时,它会在屏幕上显示A和B,但为什么f = files [2]结束循环?如果我f=files[2]在我的控制台中运行,我会得到"未定义"的答案,那么这应该结束循环这一事实背后的理由是什么?
奖金问题:为什么不写下循环,如下所示?
for (var i=0; i < files.length; i++) {
f = files[i];
console.log(f);
}
Run Code Online (Sandbox Code Playgroud)
这对我来说似乎更清晰,更易于维护,所以有没有理由在第二段代码中使用第一段代码?
我有一个用户在自己的Java Web服务器上部署的Web应用程序(例如Tomcat).Web应用程序的Java端需要报告Web应用程序本身的URL(例如http://aServer.com:8080/MyApp或https://blah.blahSever/MyApp).但是,由于许多用户使用端口转发和其他网络技术,因此Web应用程序通常会报告错误的名称.
我尝试了以下技术,但通常它们实际上并没有产生用户需要的东西.
注意(请求是HttpServletRequest)
request.getLocalAddr(); // Returns: 127.0.0.1
request.getLocalName(); // Returns: localhost
request.getServerName(); // Returns: localhost
request.getServerPort(); // Returns: 8080
request.getContextPath(); // Returns: /MyApp
request.getScheme(); // Returns: http
InetAddress.getLocalHost().getHostName(); // Returns: serverXXX-XXX-XXX-XX.xxxx-xxxxxxx.net
InetAddress.getLocalHost().getHostAddress(); // Returns: xxx.xxx.xxx.xxx (ip address)
InetAddress.getLocalHost().getCanonicalHostName(); // Returns: serverXXX-XXX-XXX-XX.xxxx-xxxxxxx.net
Run Code Online (Sandbox Code Playgroud)
InetAddress的使用接近我想要的,但由于我们在Apache2服务器中使用Server Aliases和ProxyPass,因此InetAddress的值是服务器的实际值而不是Alias.
我能想到的唯一技术是用户在属性文件中提供属性,Web应用程序在启动时读取该属性.如果设置了该属性,则此值用于返回完整的Web应用程序路径(例如serverUrl = https://blah.blahServer/MyApp).这种技术可行,但涉及到我的客户更多的部署工作.
有没有人对如何实现更优雅的解决方案有任何想法?
谢谢,菲尔
我正在尝试针对Java中的模式验证XML文件,问题是如果文件验证失败,则文件将被锁定,直到应用程序终止.如果输入文件有效,则文件不会被锁定,一切都很好.
我正在使用javax.xml.validation.Validator和validate()方法.这似乎很简单,并且在验证通过时很好.我只能假设我在错误处理中遗漏了一些东西,但Validator的API似乎没有提供任何有用的东西.任何人都可以阐明我在这里做错了什么吗?
我将所有这些简化为下面的独立课程.如果您在扫描仪启动时运行此操作,请检查输入文件,您可以看到它现在已被锁定.如果需要,我可以提供输入和结构文件.
谢谢,
菲尔
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.net.URI;
import java.util.Scanner;
import javax.xml.transform.Source;
import javax.xml.transform.stream.StreamSource;
import javax.xml.validation.Schema;
import javax.xml.validation.SchemaFactory;
import javax.xml.validation.Validator;
public class ValidationTest {
public static void validate(URI xmlLocation, URI schemaLocation) throws Exception {
SchemaFactory schemaFactory = SchemaFactory.newInstance( "http://www.w3.org/2001/XMLSchema" );
Source schemaSource = new StreamSource(schemaLocation.toString());
Schema schema = schemaFactory.newSchema(schemaSource);
Validator schemaValidator = schema.newValidator();
StreamSource source = new StreamSource(xmlLocation.getPath());
schemaValidator.validate( source );
}
public static void main(String[] args) throws Exception {
File …Run Code Online (Sandbox Code Playgroud) 我想知道我是否可以使用过滤器(在我的情况下是CorsFilter)来测量时间并将时间用于消息本身.我知道以下工作正常:
public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException {
long startTime = System.nanoTime();
chain.doFilter(request, response);
long endTime = System.nanoTime();
System.out.println("Time: " + (endTime - startTime) );
}
Run Code Online (Sandbox Code Playgroud)
当然,这会以秒为单位输出总时间.我想把时间放在返回响应的标题中,以便接收者可以查看标题并查看处理时间.以下代码不起作用:
public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException {
long startTime = System.nanoTime();
if(response instanceof HttpServletResponse) {
HttpServletResponse httpResp = (HttpServletResponse)response;
httpResp.addHeader("Start-time", Long.toString(startTime));
}
chain.doFilter(request, response);
long endTime = System.nanoTime();
if(response instanceof HttpServletResponse) {
HttpServletResponse httpResp = (HttpServletResponse)response;
httpResp.addHeader("End-time", Long.toString(endTime));
}
}
Run Code Online (Sandbox Code Playgroud)
标头仅包括开始时间而非结束时间.我假设这是因为消息已经发送,因此修改对象将无效.
有没有人有一个优雅/聪明的解决方案,通过使用过滤器将时间放入标题?
谢谢,菲尔
更新
我已经研究过使用HttpServletResponseWrapper来解决这个问题.这仍然无法在响应头上输出XXX-EndTime或YYY-EndTime. …
我想知道以编程方式关闭AIR应用程序的正确方法.
在我的Spark WindowedApplication中,我有:
this.addEventListener( Event.CLOSING, shutdownApp );
Run Code Online (Sandbox Code Playgroud)
当然还有shutdownApp方法的实现(它基本上整理了临时文件).
这适用于窗口的右上角关闭按钮.但是我也有需要关闭应用程序的功能.在我调用的代码中:
NativeApplication.nativeApplication.exit();
Run Code Online (Sandbox Code Playgroud)
但是,这不会触发Event.CLOSING方法,因此我的临时文件不会被清除.我不应该调用nativeApplication.exit吗?如果是这样,我该怎么称呼呢?我宁愿不必在NativeApplication.exit()之前调用我的shutdownApp方法,因为这不太优雅.
任何人都可以对正确的做法有所了解吗?
谢谢,
菲尔
使用Java我想创建一个可以增长和增长的Map,并且可能大于可用内存的大小.现在显然使用标准的POJO HashMap,我们将耗尽内存并且JVM将崩溃.所以我一直在想着如果它意识到内存不足,它可以将当前内容写入磁盘.
有没有人实现这样的任何东西或知道任何现有的解决方案?
我想要做的是一次读取一个非常大的ASCII文件(比如50Gb).每行包含一个键和一个值.密钥可以在文件中复制.然后,我将每一行存储在一个Map中,这是一个值列表的键.这个地图是将成长和成长的对象.
任何建议都非常感谢.
菲尔
更新:
感谢所有人的意见和建议.由于我描述的问题,数据库是正确的,可扩展的解决方案.我应该说这是一个临时Map,需要在短时间内创建和使用,以帮助解析文件.在这种情况下,迈克尔建议"仅存储行号而不是实际值"是最合适的.将迈克尔的答案标记为推荐的解决方案.
我有一个带有我自己的自定义渲染器的Spark列表.当用户滚动列表中的项目时,左侧和右侧按钮出现在行中,允许用户更改正在呈现的值的值.例如,如果有5个优先级(1到5),则左按钮减小值,右按钮增加值.
快速注意:它们不是真正的按钮,而是s:图像设计像按钮一样工作.
现在这个工作正常,除了在一个特定条件下:如果用户选择行,然后将光标移出行,然后返回到行,当用户单击任一按钮时,没有任何反应.即使这种情况听起来令人费解,但测试用户仍然会这样做!这对他们来说真的很令人沮丧.
我发现了这种行为的原因:按钮仅显示在项呈示器的悬停和选定状态中.这就是我想要发生的事情 - 按钮不应该是可见的,除非用户的指针能够按下它们.在列表中选择项目时,渲染器的状态将转到选中状态.再次单击不会更改状态.将指针移出行,然后再次返回并单击(在已选择的行上)使行的状态从选定状态变为正常状态(鼠标按下时)并返回到选定状态(在鼠标按下时).我发现这很奇怪!这意味着按钮实际上在处于正常状态时(它应该)因此没有被点击而消失.
我曾经考虑过,不知何故,我可以在项目渲染器的Z顺序中将图像"更高",因此它们会在项目渲染器获取之前拦截click事件,但我无法使其工作.
有人可以帮忙吗?
如果有帮助,ItemRenderer的片段如下:
<s:HGroup width="150" verticalAlign="middle" verticalCenter="0">
<s:Image id="previousItemButton" buttonMode="true" source="{_leftArrow}" width="16" height="16" visible.normal="false" visible.hovered="true" visible.selected="true" click="previousClicked(event)"/>
<s:Label text="{data.outputFormat.value}" width="100%" click="nextClicked(event)"/>
<s:Image id="nextItemButton" buttonMode="true" source="{_rightArrow}" width="16" height="16" visible.normal="false" visible.hovered="true" visible.selected="true" click="nextClicked(event)"/>
</s:HGroup>
Run Code Online (Sandbox Code Playgroud)
更新:
该问题是由构成ItemRenderer的组件的最高级别上的虚假rollOut事件引起的.这个rollOut称为一个方法,它包括:
protected function hgroup1_rollOutHandler(event:MouseEvent):void {
if (this.selected) {
this.selected = false;
}
}
Run Code Online (Sandbox Code Playgroud)
这导致了问题并删除了rollOut,该方法解决了这个问题.我不知道为什么在mouseDown上激活转出的原因.
我在启动AWS Ubuntu实例(来自Cloud Formation模板)并在启动时成功运行脚本时遇到了很多麻烦.这个脚本确实运行,但我不希望它以root身份运行.我希望脚本可以作为不同的用户调用,也可以在脚本运行时让脚本更改用户.
由于我们正在尝试使用Cloud Formation,因此我需要将脚本或脚本的引用放在我的模板文件中.我的模板文件的相关部分如下.脚本'myScript.sh'确实运行,但始终以root身份运行.
"MyImage" : {
"Type" : "AWS::EC2::Instance",
"Properties" : {
"ImageId" : "xxxxxx",
"KeyName" : "xxxxxx",
"SecurityGroups" : [ "xxxxxx" ],
"UserData" : {"Fn::Base64" : {"Fn::Join" : ["", [
"#include\n",
"https://s3-eu-west-1.amazonaws.com/aFolder/myScript.sh \n"
] ] } }
}
}
},
Run Code Online (Sandbox Code Playgroud)
从URL:http://alestic.com/2009/06/ec2-user-data-scripts它声明这些脚本始终以root身份运行.所以我决定修改脚本来改变用户.下面是一个不能满足我想要的示例脚本.我已经内联评论它来解释每个阶段的作用:
#!/bin/bash
whoami > /home/ubuntu/who1.txt # Always returns 'root'
su ubuntu # Appears to have no effect. Ubuntu user does exist
whoami > /home/ubuntu/who2.txt # Always returns 'root'
su ubuntu echo fish > …Run Code Online (Sandbox Code Playgroud) 我看到以下JavaScript代码并且它让我感到困惑,因为从逻辑上0永远不会是4或5:
if (0 === 4) { // Safari
safari.self.addEventListener("message", safariMessageListener, false);
} else if (0 === 5) { // Opera
opera.extension.onmessage = operaMessageListener;
}
Run Code Online (Sandbox Code Playgroud)
我将假设此代码有效.那么程序员是否设法以某种方式重新定义0或者0不知何故不是指数字0?任何人都可以解释这个代码,为什么有人这样编码?这种技术的优点是什么?(除了让像我这样迷惑的人!)
为了完整起见,此片段来自YouTube Center Grease Monkey插件.其URL是:
https://github.com/YePpHa/YouTubeCenter/wiki/Developer-Version
而完整的方法是:
function initListeners() {
if (support.CustomEvent) {
window.addEventListener("ytc-content-call", eventListener, false);
} else {
window.addEventListener("message", messageListener, false);
}
window.addEventListener("unload", windowUnload, false);
if (0 === 4) { // Safari
safari.self.addEventListener("message", safariMessageListener, false);
} else if (0 === 5) { // Opera
opera.extension.onmessage = operaMessageListener;
}
}
Run Code Online (Sandbox Code Playgroud) 对不起,这可能是一个非常容易回答的问题,但在Flex中如何在Spark List组件中显示一条消息,指出List为空.例如,如果我有一个显示未完成作业数量的列表,如果我的列表为空,那么我希望列表中显示一条消息,指出"没有要执行的作业".
我宁愿不使用Item Renderer,因为那时它是一个Item(列表不为空)并且可以选择该项.
这似乎应该是非常微不足道的,我希望它是.
菲利,提前谢谢
我在Eclipse中有两个Maven项目,都有自己的POM.
项目A创建一个JAR文件.
项目B创建一个WAR文件.
当我对项目B运行"package"命令时,我希望它也打包项目A,然后将生成的JAR文件复制到项目B中的任意位置.
我通过使用maven-war-plugin中的webResources值尝试(并成功)了副本,如下所示:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.0.2</version>
<configuration>
<webResources>
<resource>
<directory>../ProjectA/target</directory>
<targetPath>.</targetPath>
<includes>
<include>ProjectA*.jar</include>
</includes>
<excludes>
<exclude>*shaded*.jar</exclude>
</excludes>
</resource>
</webResources>
Run Code Online (Sandbox Code Playgroud)
但是,如何让项目B的POM进行项目A的构建?
我尝试的另一种方法是使项目A成为项目B的依赖项,因此它将被导入到WAR的WEB-INF/lib目录中,然后将其移动到其他位置.但这似乎有点凌乱.
任何帮助,非常感谢.
java ×5
apache-flex ×3
list ×3
flex-spark ×2
javascript ×2
air ×1
bash ×1
clear ×1
cloud ×1
eclipse ×1
flex4 ×1
for-loop ×1
itemrenderer ×1
map ×1
maven ×1
memory ×1
onclick ×1
overflow ×1
pom.xml ×1
servlets ×1
shutdown ×1
timing ×1
validation ×1
war ×1
xml ×1