小编shm*_*sel的帖子

垃圾收集 - 孤立的LinkedList链接

假设你有参考A -> B -> C -> D.当您删除对Bfrom 的引用时A,您将留下一个孤立的对象链B -> C -> D.

CD被垃圾收集,即使没有办法让他们(因为有没有参考B)?

我认为GC对此很聪明,并将解决任何此类依赖关系.

但是,我查看了该课程的源代码LinkedList,发现了与此信念相反的内容.我注意到,当列表被clear()编辑时,每个链接的所有引用都被显式设置为null,从而使其成为一个O(n)操作.这样做有什么理由/好处吗?

java garbage-collection linked-list

12
推荐指数
1
解决办法
3536
查看次数

在Java中传递lambda表达式时,方法是不明确的

让我们有一个功能界面Functional(为了简洁起见,我省略了实现并简化了案例):

@FunctionalInterface 
public interface Functional<E> { 

    void perform(E e);

    default <T extends Number> void method(E e, T t)  { }
    default <T extends Number> void method(E e, Function<E, T> function) { }
} 
Run Code Online (Sandbox Code Playgroud)

还有一段简单的代码:

Functional<String> functional = (string) -> {};
functional.method("string", (string) -> 1);
Run Code Online (Sandbox Code Playgroud)

为什么方法method()不明确,因为lambda作为参数传递?这应该很容易区分.

Eclipse:

该方法method(String, Function<String,Integer>)对于该类型是不明确的Functional<String>

这在IntelliJIdea上也是可重现的.

Javac输出(感谢@AndyTurner):

Main.java:21: error: reference to method is ambiguous
        functional.method("string", (string) -> 1);
                  ^
  both method <T#1>method(E,T#1) in Functional …
Run Code Online (Sandbox Code Playgroud)

java generics lambda exception java-8

12
推荐指数
1
解决办法
437
查看次数

并行二进制搜索

我刚刚开始学习并行编程,我正在研究二进制搜索.

通过投入更多的处理器,这无法真正优化吗?我知道这应该是分裂和征服,但你真的"正在减少和征服"(来自维基百科).

或者你可以将这些比较并行化吗?(如果X是小于array[mid],从搜索lowmid - 1;否则,如果X是大于array[mid]从搜索mid + 1high,否则返回mid,的指数X)

或者你将一半的数组放到一个处理器上进行二进制搜索,另一半到另一个处理器怎么样?这不是浪费吗?因为它正在减少和征服而不是简单地分裂和征服?思考?

parallel-processing binary-search

11
推荐指数
3
解决办法
1万
查看次数

为什么没有IntStream.flatMapToObj()?

我正在尝试做这样的事情:

Stream<Object> stream = IntStream.of(...)
        .flatMapToObj(i -> getStreamOfObjects(i));
Run Code Online (Sandbox Code Playgroud)

不幸的是,IntStream.flatMapToObj()即使在Java 9中也不存在.

  1. 为什么遗漏了?
  2. 什么是推荐的解决方法?

java java-8 java-stream

11
推荐指数
3
解决办法
1123
查看次数

从Java 8中的Stream of Stream中提取Map <K,Multiset <V >>

我有流的字流(这种格式不是由我设定的,不能更改).对于前者

Stream<String> doc1 = Stream.of("how", "are", "you", "doing", "doing", "doing");
Stream<String> doc2 = Stream.of("what", "what", "you", "upto");
Stream<String> doc3 = Stream.of("how", "are", "what", "how");
Stream<Stream<String>> docs = Stream.of(doc1, doc2, doc3);
Run Code Online (Sandbox Code Playgroud)

我试图把它变成一个结构Map<String, Multiset<Integer>>(或者它的相应流,因为我想进一步处理它),其中键String是单词本身,Multiset<Integer>代表每个文档中出现的单词的数量(应该排除0) .Multiset是google guava类(不是来自java.util.).

例如:

how   -> {1, 2}  // because it appears once in doc1, twice in doc3 and none in doc2(so doc2's count should not be included)
are   -> {1, 1}  // once in doc1 and once in doc3
you   -> {1, …
Run Code Online (Sandbox Code Playgroud)

java java-8 java-stream

11
推荐指数
1
解决办法
673
查看次数

Android Studio无法初始化(0xc0000005)

我刚刚在我的新笔记本中安装了Android Studio,它运行Windows 10 - 64位,带有Java SE 8 152,但它突然停止工作,就像每次我尝试运行Android Studio时,会出现以下错误消息:

"无法正确初始化应用程序(0xc0000005)"

我已经尝试重新安装,以管理员身份运行,停用防病毒软件......没有任何效果.

android android-studio windows-10

11
推荐指数
2
解决办法
2万
查看次数

在EXISTS查询中使用LIMIT的任何一点?

是否有添加任何性能好处LIMIT到一个EXISTS查询,或将MySQL的应用在自己的极限?

例:

IF EXISTS (
    SELECT 1
      FROM my_table
     LIMIT 1    -- can this improve performance?
)
THEN ... END IF;
Run Code Online (Sandbox Code Playgroud)

mysql exists query-optimization sql-limit

10
推荐指数
1
解决办法
1930
查看次数

在删除条目时迭代ConcurrentHashMap

我想定期迭代一段ConcurrentHashMap时间删除条目,如下所示:

for (Iterator<Entry<Integer, Integer>> iter = map.entrySet().iterator(); iter.hasNext(); ) {
    Entry<Integer, Integer> entry = iter.next();
    // do something
    iter.remove();
}
Run Code Online (Sandbox Code Playgroud)

问题是,在迭代时,另一个线程可能正在更新或修改值.如果发生这种情况,那些更新可能会永远丢失,因为我的线程只会在迭代时看到陈旧的值,但remove()会删除实时条目.

经过一番考虑,我想出了这个解决方法:

map.forEach((key, value) -> {
    // delete if value is up to date, otherwise leave for next round
    if (map.remove(key, value)) {
        // do something
    }
});
Run Code Online (Sandbox Code Playgroud)

这样做的一个问题是它不会捕获对未实现的可变值的修改equals()(例如AtomicInteger).是否有更好的方法可以安全删除并发修改?

java multithreading concurrenthashmap

10
推荐指数
1
解决办法
9589
查看次数

后增量无限循环i + = i ++;

我不明白为什么这个后增量方程不会增加.我原本以为在+ =操作之后,值会增加1,然后第二次我将获得1值.但输出是0零的无限循环.是否有人能够解释为什么'我'不会增加.

int i = 0;
for(; ; ) {
  if ( i >= 10) break;
  i += i++;
}
System.out.println(i);
Run Code Online (Sandbox Code Playgroud)

java increment

10
推荐指数
2
解决办法
1248
查看次数

Switch语句给出了不兼容类型错误

我正在尝试编译,我收到此错误:

enigma/Rotor.java:30: incompatible types found : java.lang.String required: int     switch(name){
1 error
Run Code Online (Sandbox Code Playgroud)

为什么我收到此错误?我如何解决它?它在包中,我似乎无法弄明白.这是代码:

String label;

Rotor(){;}

Rotor(String name){
  switch(name){
    case "B":
      conversion_chart = B;
      break;
    case "C":
      conversion_chart = C;
      break;
    case "I":
      conversion_chart=I;
      notch = NOTCH[0];
      break;
    case "II":
      conversion_chart=II;
      notch = NOTCH[1];
      break;
    case "III":
      conversion_chart=III;
      notch = NOTCH[2];
      break;
    case "IV":
      conversion_chart=IV;
      notch = NOTCH[3];
      break;
    case "V":
      conversion_chart=V;
      notch = NOTCH[4];
      break;
    case "VI":
      conversion_chart=VI;
      notch = NOTCH[5];
      break;
    case "VII":
      notch = NOTCH[6];
      conversion_chart=VII;
      break; …
Run Code Online (Sandbox Code Playgroud)

java switch-statement

9
推荐指数
2
解决办法
2万
查看次数