有人可以解释一下阵列在Java中是如何工作的.
我对以下代码感到惊讶:
Object test = new Object[2][2];
Object test2 = new Object[] {
new Object[2],new Object[2]
};
Object test3 = new Object[2][];
((Object[])test3)[0] = new Object[2];
((Object[])test3)[1] = new Object[2];
System.out.println(test instanceof Object[]);
System.out.println(test instanceof Object[][]);
System.out.println(test2 instanceof Object[]);
System.out.println(test2 instanceof Object[][]);
System.out.println(test3 instanceof Object[]);
System.out.println(test3 instanceof Object[][]);
Run Code Online (Sandbox Code Playgroud)
只有test2不是Object [] []的实例
运行时有什么区别?
编辑:我看到一些答案.Jon Skeet,请注意我能做到:
Object[] test4 = (Object [])test;
test4[0] = "blaaa";
test4[1] = "toto";
System.out.println(test4);
Run Code Online (Sandbox Code Playgroud)
test instanceof Object []返回true,并且在转换时没有在运行时引发异常.根据SCJP的Sierra&Bates一书,测试IS-A Object [] []还有一个Object []
但是当试图用"test4 [0] ="blaaa";"重新分配一个新值时,我得到一个异常:线程中的异常"main"java.lang.ArrayStoreException:Main.main中的java.lang.String(Main. Java的:24)
所以在运行时看来,test和test2都是IS-A Object …
我可能错了,但对我来说,我们可以为一个对象重写equals,以便你认为它们有意义地等于.映射中的所有条目都具有不同的键,并且集合中的所有条目都具有不同的值(不是有意义的等于)
但是在使用TreeMap或TreeSet时,您可以提供比较器.我注意到,当提供比较器时,绕过对象的equals方法,并且当比较器返回0时,两个objets被认为是等于.因此,我们有2个对象但是在map keyset或set中,只保留一个.
我想知道是否有可能使用已排序的集合来区分两个不同的实例.
这是一个简单的示例:
public static void main(String[] args) {
TreeSet<String> set = new TreeSet<String>();
String s1 = new String("toto");
String s2 = new String("toto");
System.out.println(s1 == s2);
set.add(s1);
set.add(s2);
System.out.println(set.size());
}
Run Code Online (Sandbox Code Playgroud)
请注意,使用新的String("xxx")会绕过String池的使用,因此s1!= s2.我想知道如何实现比较器,使设置大小为2而不是1.
主要问题是:对于相同String值的两个不同实例,我如何在比较器中返回一些东西!= 0?
请注意,我希望比较器遵守规则:
比较它的两个参数的顺序.返回负整数,零或正整数,因为第一个参数小于,等于或大于第二个参数.实现者必须确保所有x和y的sgn(compare(x,y))== -sgn(compare(y,x)).(这意味着当且仅当compare(y,x)抛出异常时,compare(x,y)必须抛出异常.)
实现者还必须确保关系是传递的:((compare(x,y)> 0)&&(compare(y,z)> 0))表示compare(x,z)> 0.
最后,实现者必须确保compare(x,y)== 0意味着所有z的sgn(compare(x,z))== sgn(compare(y,z)).
通常情况是这样,但并非严格要求(compare(x,y)== 0)==(x.equals(y)).一般来说,任何违反此条件的比较器都应清楚地表明这一事实.推荐的语言是"注意:这个比较器强加了与equals不一致的排序."
我可以用一个技巧:
public int compare(String s1,String s2) {
if s1.equals(s2) { return -1 }
...
}
Run Code Online (Sandbox Code Playgroud)
它似乎工作正常,但自从比较(s1,s2)后规则不受尊重!= -compare(s2,s1)
那么这个问题有什么优雅的解决方案吗?
编辑:对于那些想知道为什么我问这样的事情的人.好奇心比任何现实生活中的问题更重要.
但我已经处于这样的情况,虽然有关此问题的解决方案:
想象一下你有:
class Label {
String label;
}
Run Code Online (Sandbox Code Playgroud)
对于每个标签,您都有一个关联的String值.现在如果你想要一个map,label-> value怎么办?但是现在如果你希望能够拥有两个与地图键相同的标签呢?Ex"label"(ref1) - > …
假设我有一个方法可能会因检查异常而失败(根据Sun的建议检查,因为它是可恢复的).此方法失败,并触发恢复策略.但是初始方法和恢复策略都失败了.
在某些情况下,我可能想要两个堆栈跟踪,以便我知道为什么初始策略和恢复策略都失败了,而不仅仅是最后一个.
我能做什么?我应该创建一个CompositeException类型或类似的东西?这是一个好习惯吗?
我正在尝试通过Google云端消息服务器向Android设备发送推送通知.
我们用来做的URL是:
https://android.googleapis.com/gcm/send
Run Code Online (Sandbox Code Playgroud)
在我们的企业应用程序中,我们不使用默认CA权限,并且出于安全原因,我们在SSLContext属性加载的信任库文件中手动添加我们信任的每个实体.我想将GCM证书添加到我们的信任库.
我不知道如何从该URL获取证书.由于页面重定向到另一个非SSL页面,Chrome/Firefox导出方式似乎无效.
有人有解决方案吗?
我试图在app/Global.scala中创建一个Global对象来运行Akka调度程序,就像其他一些SO帖子所说的那样.
我的代码几乎是Global对象教程的复制/粘贴,但在启动时我收到以下错误:
Oops, cannot start the server.
PlayException: Cannot init the Global object [Global cannot be cast to play.GlobalSettings]
at play.api.PlayException$.apply(Exceptions.scala:122)
at play.api.Application$$anonfun$3.apply(Application.scala:71)
at play.api.Application$$anonfun$3.apply(Application.scala:67)
at play.utils.Threads$.withContextClassLoader(Threads.scala:17)
at play.api.Application.<init>(Application.scala:66)
at play.core.StaticApplication.<init>(ApplicationProvider.scala:49)
at play.core.server.NettyServer$.createServer(NettyServer.scala:132)
at play.core.server.NettyServer$$anonfun$main$5.apply(NettyServer.scala:153)
at play.core.server.NettyServer$$anonfun$main$5.apply(NettyServer.scala:152)
at scala.Option.map(Option.scala:133)
at play.core.server.NettyServer$.main(NettyServer.scala:152)
at play.core.server.NettyServer.main(NettyServer.scala)
Caused by: java.lang.ClassCastException: Global cannot be cast to play.GlobalSettings
at play.api.Application.liftedTree1$1(Application.scala:44)
at play.api.Application.play$api$Application$$javaGlobal(Application.scala:43)
at play.api.Application$$anonfun$3.apply(Application.scala:68)
... 10 more
Run Code Online (Sandbox Code Playgroud)
这是我的代码:
import play.api._
import play.api.Play.current
import akka.util.duration._
import play.api.libs.concurrent._
/**
* @author Sebastien Lorber (<i>lorber.sebastien@gmail.com</i>)
* Date: 21/11/12 - …Run Code Online (Sandbox Code Playgroud) 这个问题可以帮助您了解我的需求. 蛋糕模式:每个实现一个组件,或每个特性一个组件?
我有一个使用多个UserService实现的Scala应用程序,它将由组件(s?)提供.
我想知道在另一个组件中是否有一种方法可以"扫描"应用程序,以便我可以检索一组提供实现特征UserService的对象的所有组件?这样我可以迭代我的蛋糕构建应用程序提供的所有UserService接口?
我想我可以有一个组件根据其依赖关系构建一个UserService列表,但是有没有可能让这个组件构建列表而没有任何硬编码依赖?
我使用Jackson Scala模块.
我已经创建了一个小的序列化工具来处理Play2框架接收的json有效负载.
def unserializePayloadAs[T](implicit requestContext: RequestContext[JsValue]): T = {
val json: String = Json.stringify(requestContext.request.body)
unserialize(json)
}
def unserialize[T](json: String): T = {
objectMapper.readValue(json)
}
Run Code Online (Sandbox Code Playgroud)
Jackson Scala模块的readValue具有签名:
def readValue[T: Manifest](content: String): T = {
readValue(content, constructType[T])
}
Run Code Online (Sandbox Code Playgroud)
在尝试使用我的反序列化代码时,我有一个堆栈.
Caused by: com.fasterxml.jackson.databind.JsonMappingException: Can not instantiate abstract type [simple type, class scala.runtime.Nothing$] (need to add/enable type information?)
at [Source: java.io.StringReader@7bb78579; line: 1, column: 2]
at com.fasterxml.jackson.databind.JsonMappingException.from(JsonMappingException.java:164) ~[jackson-databind-2.2.0.jar:2.2.0]
at com.fasterxml.jackson.databind.deser.std.ThrowableDeserializer.deserializeFromObject(ThrowableDeserializer.java:77) ~[jackson-databind-2.2.0.jar:2.2.0]
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:121) ~[jackson-databind-2.2.0.jar:2.2.0]
at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:2888) ~[jackson-databind-2.2.0.jar:2.2.0]
at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2041) ~[jackson-databind-2.2.0.jar:2.2.0]
at com.fasterxml.jackson.module.scala.experimental.ScalaObjectMapper$class.readValue(ScalaObjectMapper.scala:157) ~[jackson-module-scala_2.10-2.2.0.jar:2.2.0] …Run Code Online (Sandbox Code Playgroud) 我对哈希算法知之甚少.
我需要在将文件转发到远程系统(有点像S3)之前用Java计算传入文件的哈希,这需要MD2/MD5/SHA-X中的文件哈希.出于安全原因,不会计算此哈希,而只是为了一致性校验和.
我可以使用Java标准库的DigestInputStream在转发文件时实时计算此哈希值,但是想知道最好使用哪种算法来避免使用DigestInputStream的性能问题?
我的一位前同事测试并告诉我们,与unix命令行或文件相比,计算hash实时可能非常昂贵.
关于过早优化的编辑: 我在一家公司工作,目的是帮助其他公司取消他们的文件.这意味着我们有一个处理来自其他公司的文件传输的批次.我们将来每天定位数百万份文档,实际上,此批次的执行时间对我们的业务非常敏感.
每天100万份文档的散列优化10毫秒是每天执行时间缩短3小时,这是非常巨大的.
最后,核心Promises/A +规范没有涉及如何创建,实现或拒绝承诺,而是选择专注于提供可互操作的方法.配套规范中的未来工作可能涉及这些主题.
作为一个功能开发人员,我通常会处理monad和operator之类的操作,point bind map或者flatMap链接一些包含在monad框内的调用.
根据这个问题的js递延/无极/未来相比,比如Scala函数式语言,在map和flatMap运营商似乎在融化在一起then的JS规范,可能是因为它不会赚那么多有意义的像的JS动态类型语言同时提供(?)并且使用和记住单个操作符更方便.
到目前为止一直很好,有一个then运营商(似乎并不总是正确实施)
但为什么承诺创建/履行/拒绝不是规范的一部分?这就像只有半个monad :( 似乎我不是唯一抱怨的人
通常,我的问题是:
那我该怎么办?
我可以在我的图书馆里创建承诺
Q.fcall(function () {
return 10;
})
Run Code Online (Sandbox Code Playgroud)
好的很酷,我只是将我的库耦合到Q :(
那么,这个问题有什么解决方案吗?库作者如何创建他暴露给API的承诺而不与实现相结合?
是否有一些免许可证的最低可行承诺A +库可以嵌入我们的库或其他东西?
这个规格选择背后的原因是什么?
这很奇怪,但我找不到任何简单的解决方案.
注意:我使用不变性,所以我绝对不想修改原始数组(不建议使用push)
[].concat(["x","y"],"z")- >如何[["x","y"],"z"]取而代之["x","y","z"]?
java ×5
arrays ×2
javascript ×2
scala ×2
akka ×1
cake-pattern ×1
certificate ×1
encryption ×1
exception ×1
guava ×1
hash ×1
immutability ×1
jvm ×1
promise ×1
q ×1
rsvp.js ×1
runtime ×1
scjp ×1
truststore ×1