考虑以下循环,到目前为止,我是未声明的:
while (i == i + 1) {}
Run Code Online (Sandbox Code Playgroud)
找到i在此循环之前的定义,以便while循环永远持续.
下一个问题,为此代码片段提出了同样的问题:
while (i != i) {}
Run Code Online (Sandbox Code Playgroud)
对我来说很明显.当然,在另一种情况下,NaN我确实陷入了前一个问题.这与溢出有关吗?什么会导致这样的循环在Java中永远循环?
我有一个HashMap:
private HashMap<TypeKey, TypeValue> example = new HashMap<TypeKey, TypeValue>();
Run Code Online (Sandbox Code Playgroud)
现在我想要浏览所有值并打印它们.
我写了这个:
for (TypeValue name : this.example.keySet()) {
System.out.println(name);
}
Run Code Online (Sandbox Code Playgroud)
它似乎不起作用.
问题是什么?
编辑:另一个问题:这个集合是零基础吗?我的意思是如果它有1个键,值大小是0还是1?
O(n!)函数的示例(在代码中)是什么?应该参考n运行适当数量的操作; 也就是说,我在问时间的复杂性.
我在昨天的采访中被问到以下问题:
考虑一个Java或C++数组,说明X哪个是排序的,其中没有两个元素是相同的.如何最好地找到一个索引,表示i该索引处的元素也是如此i.那是X[i] = i.
作为澄清,她还给了我一个例子:
Array X : -3 -1 0 3 5 7
index : 0 1 2 3 4 5
Answer is 3 as X[3] = 3.
Run Code Online (Sandbox Code Playgroud)
我能想到的最好的是线性搜索.在采访之后我虽然在这个问题上做了很多但却找不到更好的解决方案.我的论点是:具有required属性的元素可以在数组中的任何位置.所以它也可能在数组的最后,所以我们需要检查每个元素.
我只想在这里向社区证实我是对的.请告诉我我是对的:)
谢谢
我怎么能写组合的方法Stream的Consumers到一个单一的Consumer使用Consumer.andThen(Consumer)?
我的第一个版本是:
<T> Consumer<T> combine(Stream<Consumer<T>> consumers) {
return consumers
.filter(Objects::nonNull)
.reduce(Consumer::andThen)
.orElse(noOpConsumer());
}
<T> Consumer<T> noOpConsumer() {
return value -> { /* do nothing */ };
}
Run Code Online (Sandbox Code Playgroud)
此版本使用JavaC和Eclipse编译.但它太具体了:Stream不能是a Stream<SpecialConsumer>,如果Consumers不是类型T而是超类型,则不能使用:
Stream<? extends Consumer<? super Foo>> consumers = ... ;
combine(consumers);
Run Code Online (Sandbox Code Playgroud)
这不会合理地编译.改进版将是:
<T> Consumer<T> combine(Stream<? extends Consumer<? super T>> consumers) {
return consumers
.filter(Objects::nonNull)
.reduce(Consumer::andThen)
.orElse(noOpConsumer());
}
Run Code Online (Sandbox Code Playgroud)
但Eclipse和JavaC都没有编译:
Eclipse(4.7.3a):
该类型
Consumer未定义andThen(capture#7-of ? extends Consumer<? super …
我花了很多时间研究Java 9的一些新功能,但我没有找到任何有用和实用的例子.
考虑下一个创建VarHandle的代码片段:
class Counter {
int i;
}
class VarHandleInAction {
static final VarHandle VH_COUNTER_FIELD_I;
static {
try {
VH_COUNTER_FIELD_I = MethodHandles.lookup().
in(Counter.class).
findVarHandle(Counter.class, "i", int.class);
} catch (Exception e) {
// ...
}
}
}
Run Code Online (Sandbox Code Playgroud)
但下一步是什么?我的意思是,如何使用这个可变句柄?你能提供任何真实的例子吗?
我有以下代码:
public class RefDemo {
static class Demo implements Runnable {
public Demo() {
System.out.println(this.toString() + "-----");
}
@Override
public void run() {
System.out.println("run");
}
}
public static void main(String[] args) {
Runnable runnable = Demo::new; // lambda ref constructor method
runnable.run(); // does not do anything
System.out.println(runnable);
Runnable demo = new Demo(); // using new to create a Demo instance
demo.run();
System.out.println(demo);
}
}
Run Code Online (Sandbox Code Playgroud)
哪个印刷品:
RefDemo$Demo@7291c18f----- // lambda run constructor method print
RefDemo$$Lambda$1/793589513@34a245ab // main method print
RefDemo$Demo@7cc355be-----
run …Run Code Online (Sandbox Code Playgroud) 如您所知,Math.abs(Integer.MIN_VALUE) == Integer.MIN_VALUE为了防止出现负值,该safeAbs方法已在我的项目中实现:
public static int safeAbs(int i) {
i = Math.abs(i);
return i < 0 ? 0 : i;
}
Run Code Online (Sandbox Code Playgroud)
我将性能与以下各项进行了比较:
public static int safeAbs(int i) {
return i == Integer.MIN_VALUE ? 0 : Math.abs(i);
}
Run Code Online (Sandbox Code Playgroud)
并且第一个比第二个慢几乎6倍(第二个性能几乎与“纯” Math.abs(int)相同)。从我的角度来看,字节码没有显着差异,但是我猜想差异存在于JIT“汇编”代码中:
“慢”版本:
0x00007f0149119720: mov %eax,0xfffffffffffec000(%rsp)
0x00007f0149119727: push %rbp
0x00007f0149119728: sub $0x20,%rsp
0x00007f014911972c: test %esi,%esi
0x00007f014911972e: jl 0x7f0149119734
0x00007f0149119730: mov %esi,%eax
0x00007f0149119732: jmp 0x7f014911973c
0x00007f0149119734: neg %esi
0x00007f0149119736: test %esi,%esi
0x00007f0149119738: jl 0x7f0149119748
0x00007f014911973a: mov %esi,%eax
0x00007f014911973c: add $0x20,%rsp …Run Code Online (Sandbox Code Playgroud) 我需要转换java.util.Date到String的yyyy-MM-dd格式在一个大的数额.
我刚刚转到java 8并想知道如何正确地做到这一点.我使用Java 7的解决方案如下:
DateTimeFormatter DATE_FORMATTER = DateTimeFormat.forPattern(DATE_FORMAT_PATTERN)
DATE_FORMATTER.print(value.getTime())
Run Code Online (Sandbox Code Playgroud)
它帮助我不创建大量冗余对象.
所以现在当我转到java 8时,我想要正确地重写它,但是:
LocalDate.fromDateFields(value).toString())
Run Code Online (Sandbox Code Playgroud)
每次都创建新LocalDate对象,这为GC提供了大量的工作.
有什么方法可以解决我的问题吗?性能和线程安全非常重要.
经过一些测试后,我发现即使创建新的对象构造:
new SimpleDateFormat("yyyy-MM-dd")).format(value))
Run Code Online (Sandbox Code Playgroud)
这个话题最快.