流式xml解析器(如SAX和StAX)比构建像DOM解析器这样的树结构的解析器更快,内存效率更高.SAX是一个推送解析器,意味着它是观察者模式的一个实例(也称为监听器模式).SAX首先存在,但随后出现了StAX - 一个拉解析器,意味着它基本上像迭代器一样工作.
你可以找到为什么在任何地方都喜欢StAX而不是SAX的原因,但它通常归结为:"它更容易使用".
在关于JAXP的Java教程中,StAX被模糊地呈现为DOM和SAX之间的中间:"它比SAX更容易,并且比DOM更高效".但是,我从来没有发现任何线索,StAX比SAX更慢或内存效率更低.
这一切让我想知道:有没有理由选择SAX而不是StAX?
如果您正在编写可从命令行执行的程序,您通常希望为用户提供多个选项或标志,以及可能的多个参数.我偶然发现了这么多次,但是有没有某种设计模式可以循环遍历args并调用适当的处理函数?
考虑:
myprogram -f filename -d directory -r regex
Run Code Online (Sandbox Code Playgroud)
在使用您的语言的任何内置函数检索参数后,如何组织处理函数?(欢迎语言特定的答案,如果这有助于你明确答案)
关于java-8语法的简单问题.为什么JLS-8限制这样的表达式:
Object of_ref = Stream::of; // compile-time error
Run Code Online (Sandbox Code Playgroud)
并允许只有这样的东西:
java.util.function.Function of_ref = Stream::of;
Object obj = of_ref; // compiles ok
Run Code Online (Sandbox Code Playgroud)
?
Jersey通常使用HK2依赖注入,但我想使用Jersey和Dagger 2.Dagger和HK2都实现了JSR 330,我已经把它作为证据证明这应该是可能的而不需要太多努力.我找到了使泽西与CDI(例如Weld),Spring DI和Guice合作的方法,但我在Dagger上找不到任何东西.
提供一些上下文:我在SE环境中运行Grizzly-Jersey服务器,而不是在EE容器中运行.我的Maven项目有com.google.dagger:dagger和org.glassfish.jersey.containers:jersey-container-grizzly2-http依赖,但不是 org.glassfish.jersey.inject:jersey-hk2,因为我想用Dagger取代HK2.
资源类看起来像这样:
@Path("/example")
public final class ExampleResource {
private final Dependency dependency;
@Inject
public ExampleResource(final Dependency dependency) {
this.dependency = Objects.requireNonNull(dependency);
}
@GET
@Produces(MediaType.APPLICATION_JSON)
public Example getExample() {
return this.dependency.giveExample();
}
}
Run Code Online (Sandbox Code Playgroud)
并且Dagger组件可以例如定义如下:
@Component
public interface Application {
public ExampleResource exampleEndpoint();
public XyzResource xyzEndpoint();
// etc.
}
Run Code Online (Sandbox Code Playgroud)
这样主要方法看起来类似于:
public final class Main {
public static void main(final String[] args) {
final Application application = DaggerApplication.create();
final URI baseUri = …Run Code Online (Sandbox Code Playgroud) 我不明白克隆自定义对象的机制.例如:
public class Main{
public static void main(String [] args) {
Person person = new Person();
person.setFname("Bill");
person.setLname("Hook");
Person cloned = (Person)person.clone();
System.out.println(cloned.getFname() + " " + cloned.getLname());
}
}
class Person implements Cloneable{
private String fname;
private String lname;
public Object clone() {
Person person = new Person();
person.setFname(this.fname);
person.setLname(this.lname);
return person;
}
public void setFname(String fname) {
this.fname = fname;
}
public void setLname(String lname){
this.lname = lname;
}
public String getFname(){
return fname;
}
public String getLname() …Run Code Online (Sandbox Code Playgroud) 我正在编写相当低级别的代码,必须对速度进行高度优化.每个CPU周期都很重要.因为代码是用Java编写的,所以我不能像C中那样写低级别,但是我希望能够从VM中获取所有内容.
我正在处理一个字节数组.我的代码有两个部分,我现在主要感兴趣.第一个是:
int key = (data[i] & 0xff)
| ((data[i + 1] & 0xff) << 8)
| ((data[i + 2] & 0xff) << 16)
| ((data[i + 3] & 0xff) << 24);
Run Code Online (Sandbox Code Playgroud)
第二个是:
key = (key << 15) | (key >>> 17);
Run Code Online (Sandbox Code Playgroud)
从性能来看,我猜这些陈述没有按照我的预期进行优化.第二个陈述基本上是一个ROTL 15, key.第一个语句将4个字节加载到int中.0xff如果访问的字节恰好为负,则掩码仅用于补偿由隐式转换为int所产生的添加符号位.这应该很容易转换为高效的机器代码,但令我惊讶的是,如果我删除了掩码,性能会上升.(这当然会破坏我的代码,但我很想知道会发生什么.)
这里发生了什么?最常见的Java VM是否会在JIT期间以期望优秀的C++编译器优化等效C++代码的方式优化此代码?我可以影响这个过程吗?设置-XX:+AggressiveOpts似乎没有区别.
(CPU:x64,平台:Linux/HotSpot)
有没有人知道根据RFC5321/RFC5322验证电子邮件地址的正则表达式?
由于(可嵌套)注释使语法不规则,因此只应考虑没有注释的地址.
当然,如果您对验证某人实际拥有的地址感兴趣,那么唯一真正的验证是向该地址发送电子邮件并检查所有者是否收到了该地址.然而,我对RFC标准纯粹感兴趣.对于实际方法,这个问题更具相关性.
在评论之上,我愿意牺牲折叠空白区域,但除此之外,我对拒绝任何RFC5321/2有效地址的表达式不感兴趣.(可以说在某些情况下忽略折叠白色空间甚至是有意义的.)
理想情况下,正则表达式会拒绝任何不符合 RFC的内容,但这并不重要.例如,在正则表达式中包含一个详尽的顶级域列表并不是那么有趣.只需接受任何顶级域名就足够了.
我不确定地址标签(例如地址+ tag@domain.org)是否是我提到的RFC的一部分,但我希望正则表达式验证这些.
应该正确处理IPv6(RFC5952).
据我所知,国际化电子邮件(RFC6530,RFC6531,RFC6532,RFC6533)仍处于试验阶段,但验证这些地址的表达式也很有趣.
为了使答案普遍有趣,如果任何正则表达式是POSIX格式将是很好的.
我有一个带有特定输入字段的html页面,我想添加以下功能.
用户应该能够将资源拖放到该字段上.此操作的结果应该是资源的url出现在字段中.
资源可以是本地文件,从而产生类似file:///home/me/document或的URL file://c:\windows-files\document.doc.
资源也可以是一个web资源,产生类似http://host.nl/document.doc甚至是url的网址ftp://host.nl/document.doc,尽管此时我对ftp资源并不感兴趣.我假设从Web浏览器的地址栏中对网页URL进行动作,或者在客户端机器上从例如桌面进行dnd-action.
像往常一样,我希望此功能可以在大多数平台上运行.(Linux/Win/MacOS,Firefox/Chrome/Safari/IE/Opera)
范例是html和JavaScript.
我已经定义了一个子接口,java.util.Collection它实际上是一个multiset(又名包).它可能不包含null元素,尽管这对我的问题并不重要.接口定义的equals合同正如您所期望的那样:
obj instanceof MyInterfaceobj包含与this(by equals)相同的元素obj 每个元素包含相同数量的重复项现在我想写我的hashCode方法.我最初的想法是:
int hashCode = 1;
for( Object o : this ) {
hashCode += o.hashCode();
}
Run Code Online (Sandbox Code Playgroud)
但是,我注意到com.google.common.collect.Multiset(来自Guava)定义了哈希码,如下所示:
int hashCode = 0;
for( Object o : elementSet() ) {
hashCode += ((o == null) ? 0 : o.hashCode()) ^ count(o);
}
Run Code Online (Sandbox Code Playgroud)
令我感到奇怪的是,一个空的Multiset会有哈希码0,但更重要的是,我不理解^ count(o)简单地添加每个副本的哈希码的好处.也许这不是一次多次计算相同的哈希码,但为什么不* count(o)呢?
我的问题:什么是有效的哈希码计算?在我的情况下,元素的计数不能保证很便宜.
有人可以复制以下内容吗?
在我的NetBeans 7.2项目中,我将"project.license"属性(在project.properties中)设置为"apache20",以便NetBeans在每个新的.java文件中生成相应的许可证文本.许可证文本(位于"license-apache20.txt"中)包含以下FreeMarker参考:
${project.organization!user}
Run Code Online (Sandbox Code Playgroud)
如果未设置"project.organization",则会按预期显示我的用户名.此外,当我在User.properties文件中设置自定义用户名时,它会显示此用户名.到现在为止还挺好.
但是,我想设置"project.organization"属性.但是当我在project.properties文件中执行此操作时,NetBeans根本无法识别它,而是显示我的用户名.
当我从FreeMarker引用中删除"!user"时,它会生成文本"Expression project.organization未定义在第4行,模板/ Licenses/license-apache20.txt中的第59列." 当我在User.properties中设置属性时(愚蠢的地方,但我是为了分析而做的)我得到了相同的行为.有谁知道什么可能是错的或如何让NetBeans找到"project.organization"属性?有人在他或她的NetBeans上有相同的行为吗?
java ×7
arguments ×1
clone ×1
command-line ×1
dagger-2 ×1
freemarker ×1
guava ×1
hashcode ×1
html ×1
java-8 ×1
javascript ×1
jersey ×1
jit ×1
jsr330 ×1
multiset ×1
netbeans ×1
regex ×1
sax ×1
stax ×1
syntax ×1
templates ×1
url ×1
validation ×1
xml ×1
xml-parsing ×1