将可变对象用作Hashmap键是不好的做法吗?当您尝试使用已修改足以更改其哈希码的密钥从Hashmap检索值时会发生什么?
例如,给定
class Key
{
int a; //mutable field
int b; //mutable field
public int hashcode()
return foo(a, b);
// setters setA and setB omitted for brevity
}
Run Code Online (Sandbox Code Playgroud)
用代码
HashMap<Key, Value> map = new HashMap<Key, Value>();
Key key1 = new Key(0, 0);
map.put(key1, value1); // value1 is an instance of Value
key1.setA(5);
key1.setB(10);
Run Code Online (Sandbox Code Playgroud)
如果我们现在打电话map.get(key1)
怎么办?这是安全的还是可取的?或者行为是否依赖于语言?
我必须在这里遗漏一些东西.
在Java 5中,引入了"for-each loop"语句(也称为增强for循环).它似乎主要是为了遍历集合而引入的.任何实现该Iterable
接口的集合(或容器)类都可以使用"for-each循环"进行迭代.也许出于历史原因,Java阵列没有实现Iterable接口.但是由于数组无处不在,所以javac
会接受在数组上使用for-each循环(生成相当于传统for循环的字节码).
在Java 8中,该forEach
方法Iterable
作为默认方法添加到接口.这使得将lambda表达式传递给集合(迭代时)成为可能(例如list.forEach(System.out::println)
).但同样,阵列不喜欢这种治疗方法.(我知道有解决方法).
有没有技术上的原因为什么javac无法增强以接受forEach中的数组,就像它在增强的for循环中接受它们一样?似乎可以在不要求阵列实现的情况下生成代码Iterable
.我天真吗?
这对于自然使用数组的语言的新手来说尤其重要,因为它们的语法容易.切换到列表和使用是不自然的Arrays.asList(1, 2, 3)
.
您可能认为以下问题非常简单,但我不知道我在这里做错了什么.我觉得我添加了必需的依赖项.不是吗?
有人可以建议我这里有什么不对吗?
Exception in thread "main" java.lang.NoClassDefFoundError: com/sun/xml/bind/v2/model/annotation/AnnotationReader
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:760)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:467)
at java.net.URLClassLoader.access$100(URLClassLoader.java:73)
at java.net.URLClassLoader$1.run(URLClassLoader.java:368)
at java.net.URLClassLoader$1.run(URLClassLoader.java:362)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:361)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at java.lang.Class.getDeclaredMethods0(Native Method)
at java.lang.Class.privateGetDeclaredMethods(Class.java:2701)
at java.lang.Class.privateGetMethodRecursive(Class.java:3048)
at java.lang.Class.getMethod0(Class.java:3018)
at java.lang.Class.getMethod(Class.java:1784)
at javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:242)
at javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:234)
at javax.xml.bind.ContextFinder.find(ContextFinder.java:441)
at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:641)
at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:584)
at com.misc.common.ReadXMLFileJaxb.main(ReadXMLFileJaxb.java:14)
Caused by: java.lang.ClassNotFoundException: com.sun.xml.bind.v2.model.annotation.AnnotationReader
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 23 more
Run Code Online (Sandbox Code Playgroud)
Book.java
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Book {
@XmlAttribute …
Run Code Online (Sandbox Code Playgroud) 在Java中我们通常会这样做:
Class myObject = new Class();
Run Code Online (Sandbox Code Playgroud)
因为new
关键字返回一个地址.
但为什么我们这样做呢?:
String myString = "Hello";
Run Code Online (Sandbox Code Playgroud)
仿佛String
是一个原始人?
我向老师问了这个问题,他回答说这是因为引号中的内容相当于一个地址,但他不确定.你确定吗?
"Hello"是否存储在String类的实例变量中?
我正在尝试为我的项目设置标准代码样式,并且我找到了http://editorconfig.org/,这是一个标准.我非常喜欢它,Intellij支持它(我们使用Intellij).
但我已经阅读了很多内容,但我还没有找到如何将Intellij的所有代码样式导出到.editorconfig文件.我只能将它们导出到仅适用于Intellij的XML.
或者是否有任何网页可以读取Java的所有editorconfig域特定属性?在editorconfig github wiki中,他们只有几个.
什么是在无向图中找到哈密顿循环的动态规划算法?我在某处看到存在一种具有O(n.2^n)
时间复杂度的算法.
我写的代码只是输入一个字符串,而不是整个句子,我想把整个句子作为输入:
import java.util.Scanner;
public class Solution {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int i;
i= scan.nextInt();
double d;
d=scan.nextDouble();
String s;
s=scan.next();
System.out.println("String: " + s);
System.out.println("Double: " + d);
System.out.println("Int: " + i);
}
}
Run Code Online (Sandbox Code Playgroud)
测试用例是"欢迎使用Java",它只是在输出中显示"欢迎".其他一切都很好.请帮忙.
在Eclipse Neon中,如果我编写这个Java代码:
Stream<Object> stream = Stream.builder().build();
Run Code Online (Sandbox Code Playgroud)
我没有泄漏警告,但如果我实施Stream
,如
public class MyStream<T> implements Stream<T> {
// implementation
}
Run Code Online (Sandbox Code Playgroud)
我写了类似的代码
Stream<Object> stream = new MyStream<>();
Run Code Online (Sandbox Code Playgroud)
我收到Resource leak: 'stream' is never closed
警告 这只发生在Eclipse中,而编译时javac
不会发出任何警告.
注意我不是在寻找关于如何关闭流等的答案,而是寻找解释同一界面的这种不同行为的原因的答案.
我想深入了解Kafka的流处理,我需要一些帮助来了解一些目前对我来说不太清楚的设计原则.
1.)假设我有一些实时股票价格数据.你会用股票代码将一个主题"价格"键入(并因此进行分区)吗?或者你会为每个符号制作一个主题吗?例如,如果我决定生产(添加)更多的股票代码,包括以后的完整历史记录,会发生什么?现在我的历史(在日志中订购)主题"价格"是一团糟,对吗?另一方面,对于每个价格序列,我想稍后计算回报,如果它们在不同的主题上,我必须跟踪它们并为每个单个符号启动新的流应用程序.
2.)现在有不同的实时价格,我需要将它们的任意数量加入一个大记录中.例如,将所有sp500符号连接到一个记录中.因为我在同一时间没有所有sp500符号的价格,但可能非常接近.如果在这个确切的时间遗失一个,我如何使用最新价格加入他们?
3.)说我已经解决了加入用例,并将所有sp500股票的连接记录反馈到Kafka.如果我犯了错误而忘记了一个符号,我该怎么办?显然,我想将它添加到流中.现在我需要点击"sp500"日志并重建它吗?或者是否有某种机制将起始偏移重置为特定的偏移量(我已经修复了连接的偏移量)?我也很可能有其他流应用程序正在消耗这个主题.他们还需要进行某种重置/重放.不存储sp500主题但是让它成为长流过程的一部分可能更好吗?但后来我最终会多次做同样的连接.
4.)也许这应该是1.因为这是我的目标^^的一部分 - 但是,我怎么能像这样建模数据流:
produce prices -> calculate returns -> join several returns into a row vector -> calculate covariance (window of rowvectors) -> join covariance with returns
-> -> into a tuple (ret, cov)
Run Code Online (Sandbox Code Playgroud)
我甚至不确定使用今天的流处理是否可以使用这么复杂的用例.